91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python使用protobufde的過程

發布時間:2021-08-20 17:39:05 來源:億速云 閱讀:137 作者:chen 欄目:開發技術

這篇文章主要講解了“python使用protobufde的過程”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python使用protobufde的過程”吧!

概念

Protobuf(Google Protocol Buffers)是google開發的的一套用于數據存儲,網絡通信時用于協議編解碼的工具庫.它和XML和Json數據差不多,把數據已某種形式保存起來.Protobuf相對與XML和Json的不同之處,它是一種二進制的數據格式,具有更高的傳輸,打包和解包效率

優點:

1:序列化后體積相比Json和XML很小,適合網絡傳輸

2:支持跨平臺多語言

3:消息格式升級和兼容性還不錯

4:序列化反序列化速度很快,快于Json的處理速度

缺點:

1、以二進制的方式存儲,除非你有 .proto 定義,否則你沒法直接讀出 Protobuf 的任何內容。

2、功能簡單,無法用來表示復雜的概念。

標準數據類型

一個標量消息字段可以含有一個如下的類型——該表格展示了定義于.proto文件中的類型,以及與之對應的、在自動生成的訪問類中定義的類型

python使用protobufde的過程

基于序號的協議字段映射(類似key-value結構)

新建 test.proto

在消息中承載的數據分別對應于每一個字段都有一個名字和一種類型。

syntax = "proto3";

package  WeightEstimationUpdate;
option   java_package = "com.muyuan.platform.bar.patrol.pro";
// 請求包基類(沒有附加數據,通信包不重新定義直接使用基類包)
message BaseRequestCommon
{
  string      DeviceId = 1;    // 設備編號
  string      MsgID = 2;    // 消息ID,用UUID
  string      Timestamp = 3;    // unix時間戳(秒)
  uint32      Cmd = 4;    // 指令信息
  bytes       payLoad = 5;  // 消息體
}

// 上報
message DeviceRegist
{
  string  version = 1;    // 
  string  macAddr = 2;    // 
}

// 下發
message PushUpgradeInfo
{
  string  version = 1;            // 版本號
  string  packageName = 2;          // 
  string  packageMd5 = 3;          // 
  string  packageUrl = 4;          // 
}

// 上報
message ReportWeightEstimationStatus
{
  string      version = 1;    // 
  string      state = 2;      // 
}

// 指令列表
enum EmCmd
{
  CMD_NONE = 0x0000;       // 指令開始范圍

  //-----------------服務器端主動下發到設備端信令定義開始------------------
  CMD_S2C_PUSH_UPGRADE_INFO = 0x0013;    // 下發(協議包:PushUpgradeInfo)
  //-----------------服務器端主動下發到設備端信令定義結束-----------------

  //-----------------設備端主動上報到服務端信令定義開始-------------------
  CMD_C2S_REPORT_REGIST = 0x0060;   // 注冊(協議包:WeightEstimationRegist)
  CMD_C2S_REPORT_FAULT = 0x0061;   // 上報故障(協議包:ReportFault)
  CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS = 0x0063;    // 上報狀態信息(協議包:WeightEstimationStatus)
  //-----------------設備端主動上報到服務端信令定義結束-----------------

  CMD_END = 0xFFFF;        // 指令結束范圍
}

情況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:發送通信信息

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 即為 二進制數據流
def listtuple_dict(item_list):
    weight_cmd_dict = {}
    for k, v in item_list:
        weight_cmd_dict.setdefault(k, v)
    return weight_cmd_dict```

感謝各位的閱讀,以上就是“python使用protobufde的過程”的內容了,經過本文的學習后,相信大家對python使用protobufde的過程這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南陵县| 海盐县| 贵溪市| 荃湾区| 阿拉尔市| 河北区| 涟水县| 北川| 惠州市| 若尔盖县| 民权县| 任丘市| 楚雄市| 嘉义县| 南靖县| 花垣县| 桃园市| 奉贤区| 谷城县| 连南| 宁晋县| 松阳县| 怀集县| 石首市| 峨眉山市| 江北区| 临洮县| 江城| 什邡市| 垦利县| 讷河市| 泾源县| 阿克陶县| 武穴市| 永定县| 二手房| 天气| 安丘市| 博野县| 江北区| 岳西县|