您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python使用protobufde的过程解析

51自学网 2021-10-30 22:19:07
  python
这篇教程python使用protobufde的过程解析写得很实用,希望能帮到您。

概念

Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率

优点:

1:序列化后体积相比Json和XML很小,适合网络传输

2:支持跨平台多语言

3:消息格式升级和兼容性还不错

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

缺点:

1、以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。

2、功能简单,无法用来表示复杂的概念。

标准数据类型

一个标量消息字段可以含有一个如下的类型——该表格展示了定义于.proto文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型

img

基于序号的协议字段映射(类似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_pdbase_request_common_obj = weight_pd.BaseRequestCommon()base_request_common_obj.ParseFromString(msg)payload = base_request_common_obj.payLoadpush_upgrade_info_obj = weight_pd.PushUpgradeInfo()push_upgrade_info_obj.ParseFromString(payload)update_version = push_upgrade_info_obj.versionupdate_zip_filename = push_upgrade_info_obj.packageName# 反向解析即可

情况2:发送通信信息

import test_pb2 as weight_pdbase_request_common = weight_pd.BaseRequestCommon()base_request_common.DeviceId = deviceIdbase_request_common.MsgID = str(uuid.uuid4())base_request_common.Timestamp = str(int(time.time()))# changeitem_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_STATUSreport_weight_estimation_status = weight_pd.ReportWeightEstimationStatus()report_weight_estimation_status.version = self.versionreport_weight_estimation_status.state = statebase_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内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


利用Matlab提取图片曲线
使用Atom支持基于Jupyter的Python开教程详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。