欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用protobufde的過程解析

 更新時間:2021年08月20日 15:17:10   作者:roy8666  
Google開源的一個序列化框架,類似于xml , json。最大的特點是基于 二進制,比傳統(tǒng)的xml表示同樣的內容要短小很多。亦可定義一些可選字段,用于服務端與客戶端通信

概念

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

優(yōu)點:

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

2:支持跨平臺多語言

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

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

缺點:

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

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

標準數據類型

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

img

基于序號的協(xié)議字段映射(類似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;    // 
}

// 下發(fā)
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;       // 指令開始范圍

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

  //-----------------設備端主動上報到服務端信令定義開始-------------------
  CMD_C2S_REPORT_REGIST = 0x0060;   // 注冊(協(xié)議包:WeightEstimationRegist)
  CMD_C2S_REPORT_FAULT = 0x0061;   // 上報故障(協(xié)議包:ReportFault)
  CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS = 0x0063;    // 上報狀態(tài)信息(協(xié)議包: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:發(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 即為 二進制數據流
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使用protobuf的文章就介紹到這了,更多相關python使用protobuf內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python輸入錯誤密碼用戶鎖定實現方法

    python輸入錯誤密碼用戶鎖定實現方法

    這篇文章主要介紹了python輸入錯誤密碼用戶鎖定實現方法以及代碼實現過程,一起參考一下。
    2017-11-11
  • 詳解Django的model查詢操作與查詢性能優(yōu)化

    詳解Django的model查詢操作與查詢性能優(yōu)化

    這篇文章主要介紹了詳解Django的model查詢操作與查詢性能優(yōu)化,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Django Form常用功能及代碼示例

    Django Form常用功能及代碼示例

    這篇文章主要介紹了Django Form常用功能及代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • python taipy庫輕松地將數據和機器學習模型轉為功能性Web應用

    python taipy庫輕松地將數據和機器學習模型轉為功能性Web應用

    taipy 是一個開源的 Python 庫,任何具有基本 Python 技能的人都可以使用,對于數據科學家、機器學習工程師和 Python 程序員來說,它是一個方便的工具,借助 Taipy,你可以輕松地將數據和機器學習模型轉變?yōu)楣δ苄缘?nbsp;Web 應用程序
    2024-01-01
  • python?graphviz畫圖詳情

    python?graphviz畫圖詳情

    這篇文章主要介紹了python?graphviz畫圖詳情,文章圍繞graphviz畫圖的相關資料展開內容,并附有官方安裝鏈接,需要的小伙伴可以參考一下,洗碗給對你有所幫助
    2021-12-12
  • Pytorch 之修改Tensor部分值方式

    Pytorch 之修改Tensor部分值方式

    今天小編就為大家分享一篇Pytorch 之修改Tensor部分值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python并行庫joblib之delayed函數與Parallel函數詳解

    Python并行庫joblib之delayed函數與Parallel函數詳解

    這篇文章主要介紹了Python并行庫joblib之delayed函數與Parallel函數詳解,Joblib就是一個可以簡單地將Python代碼轉換為并行計算模式的軟件包,它可非常簡單并行我們的程序,從而提高計算速度,需要的朋友可以參考下
    2023-08-08
  • Django實現下載超大CSV文件的示例代碼

    Django實現下載超大CSV文件的示例代碼

    這篇文章主要為大家詳細介紹了如何利用 Django 進行大型 CSV 文件的流傳輸,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • TensorFlow數據輸入的方法示例

    TensorFlow數據輸入的方法示例

    這篇文章主要介紹了TensorFlow數據輸入的方法示例,主要介紹了4種方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 對pycharm代碼整體左移和右移縮進快捷鍵的介紹

    對pycharm代碼整體左移和右移縮進快捷鍵的介紹

    今天小編就為大家分享一篇對pycharm代碼整體左移和右移縮進快捷鍵的介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論