python使用protobufde的過程解析
概念
Protobuf(Google Protocol Buffers)是google開發(fā)的的一套用于數(shù)據(jù)存儲(chǔ),網(wǎng)絡(luò)通信時(shí)用于協(xié)議編解碼的工具庫.它和XML和Json數(shù)據(jù)差不多,把數(shù)據(jù)已某種形式保存起來.Protobuf相對與XML和Json的不同之處,它是一種二進(jìn)制的數(shù)據(jù)格式,具有更高的傳輸,打包和解包效率
優(yōu)點(diǎn):
1:序列化后體積相比Json和XML很小,適合網(wǎng)絡(luò)傳輸
2:支持跨平臺(tái)多語言
3:消息格式升級和兼容性還不錯(cuò)
4:序列化反序列化速度很快,快于Json的處理速度
缺點(diǎn):
1、以二進(jìn)制的方式存儲(chǔ),除非你有 .proto 定義,否則你沒法直接讀出 Protobuf 的任何內(nèi)容。
2、功能簡單,無法用來表示復(fù)雜的概念。
標(biāo)準(zhǔn)數(shù)據(jù)類型
一個(gè)標(biāo)量消息字段可以含有一個(gè)如下的類型——該表格展示了定義于.proto文件中的類型,以及與之對應(yīng)的、在自動(dòng)生成的訪問類中定義的類型

基于序號(hào)的協(xié)議字段映射(類似key-value結(jié)構(gòu))
新建 test.proto
在消息中承載的數(shù)據(jù)分別對應(yīng)于每一個(gè)字段都有一個(gè)名字和一種類型。
syntax = "proto3";
package WeightEstimationUpdate;
option java_package = "com.muyuan.platform.bar.patrol.pro";
// 請求包基類(沒有附加數(shù)據(jù),通信包不重新定義直接使用基類包)
message BaseRequestCommon
{
string DeviceId = 1; // 設(shè)備編號(hào)
string MsgID = 2; // 消息ID,用UUID
string Timestamp = 3; // unix時(shí)間戳(秒)
uint32 Cmd = 4; // 指令信息
bytes payLoad = 5; // 消息體
}
// 上報(bào)
message DeviceRegist
{
string version = 1; //
string macAddr = 2; //
}
// 下發(fā)
message PushUpgradeInfo
{
string version = 1; // 版本號(hào)
string packageName = 2; //
string packageMd5 = 3; //
string packageUrl = 4; //
}
// 上報(bào)
message ReportWeightEstimationStatus
{
string version = 1; //
string state = 2; //
}
// 指令列表
enum EmCmd
{
CMD_NONE = 0x0000; // 指令開始范圍
//-----------------服務(wù)器端主動(dòng)下發(fā)到設(shè)備端信令定義開始------------------
CMD_S2C_PUSH_UPGRADE_INFO = 0x0013; // 下發(fā)(協(xié)議包:PushUpgradeInfo)
//-----------------服務(wù)器端主動(dòng)下發(fā)到設(shè)備端信令定義結(jié)束-----------------
//-----------------設(shè)備端主動(dòng)上報(bào)到服務(wù)端信令定義開始-------------------
CMD_C2S_REPORT_REGIST = 0x0060; // 注冊(協(xié)議包:WeightEstimationRegist)
CMD_C2S_REPORT_FAULT = 0x0061; // 上報(bào)故障(協(xié)議包:ReportFault)
CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS = 0x0063; // 上報(bào)狀態(tài)信息(協(xié)議包:WeightEstimationStatus)
//-----------------設(shè)備端主動(dòng)上報(bào)到服務(wù)端信令定義結(jié)束-----------------
CMD_END = 0xFFFF; // 指令結(jié)束范圍
}
情況1: 收到通信信息
import test_pb2 as weight_pd base_request_common_obj = weight_pd.BaseRequestCommon() base_request_common_obj.ParseFromString(msg) payload = base_request_common_obj.payLoad push_upgrade_info_obj = weight_pd.PushUpgradeInfo() push_upgrade_info_obj.ParseFromString(payload) update_version = push_upgrade_info_obj.version update_zip_filename = push_upgrade_info_obj.packageName # 反向解析即可
情況2:發(fā)送通信信息
import test_pb2 as weight_pd
base_request_common = weight_pd.BaseRequestCommon()
base_request_common.DeviceId = deviceId
base_request_common.MsgID = str(uuid.uuid4())
base_request_common.Timestamp = str(int(time.time()))
# change
item_list = weight_pd.EmCmd.items()
#此為 protobuf 3.0.0 版本的
weight_dict = listtuple_dict(item_list)
base_request_common.Cmd = weight_dict.get("CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS")
#此為 protobuf 最新版本
# base_request_common.Cmd = weight_pd.EmCmd.CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS
report_weight_estimation_status = weight_pd.ReportWeightEstimationStatus()
report_weight_estimation_status.version = self.version
report_weight_estimation_status.state = state
base_request_common.payLoad = report_weight_estimation_status.SerializeToString()
serializeToString = base_request_common.SerializeToString()
# serializeToString 即為 二進(jìn)制數(shù)據(jù)流
def listtuple_dict(item_list):
weight_cmd_dict = {}
for k, v in item_list:
weight_cmd_dict.setdefault(k, v)
return weight_cmd_dict```
到此這篇關(guān)于python使用protobuf的文章就介紹到這了,更多相關(guān)python使用protobuf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python輸入錯(cuò)誤密碼用戶鎖定實(shí)現(xiàn)方法
這篇文章主要介紹了python輸入錯(cuò)誤密碼用戶鎖定實(shí)現(xiàn)方法以及代碼實(shí)現(xiàn)過程,一起參考一下。2017-11-11
詳解Django的model查詢操作與查詢性能優(yōu)化
這篇文章主要介紹了詳解Django的model查詢操作與查詢性能優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
python taipy庫輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)為功能性Web應(yīng)用
taipy 是一個(gè)開源的 Python 庫,任何具有基本 Python 技能的人都可以使用,對于數(shù)據(jù)科學(xué)家、機(jī)器學(xué)習(xí)工程師和 Python 程序員來說,它是一個(gè)方便的工具,借助 Taipy,你可以輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)變?yōu)楣δ苄缘?nbsp;Web 應(yīng)用程序2024-01-01
Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解
這篇文章主要介紹了Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解,Joblib就是一個(gè)可以簡單地將Python代碼轉(zhuǎn)換為并行計(jì)算模式的軟件包,它可非常簡單并行我們的程序,從而提高計(jì)算速度,需要的朋友可以參考下2023-08-08
Django實(shí)現(xiàn)下載超大CSV文件的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用 Django 進(jìn)行大型 CSV 文件的流傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
對pycharm代碼整體左移和右移縮進(jìn)快捷鍵的介紹
今天小編就為大家分享一篇對pycharm代碼整體左移和右移縮進(jìn)快捷鍵的介紹,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

