这篇文章主要讲解了“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文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型
基于序号的协议字段映射(类似key-value结构)
在消息中承载的数据分别对应于每一个字段都有一个名字和一种类型。
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的过程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。