• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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结构)

    新建 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使用protobuf的文章就介绍到这了,更多相关python使用protobuf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • java程序中protobuf的基本用法示例
    • 浅谈序列化之protobuf与avro对比(Java)
    • 基于Protobuf动态解析在Java中的应用 包含例子程序
    • protobuf c++编程笔记
    • SpringBoot使用protobuf格式的接口方式
    • Netty结合Protobuf进行编解码的方法
    • Python使用protobuf序列化和反序列化的实现
    • Protobuf在Cmake中的正确使用方法详解
    • C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能
    • 在java程序中使用protobuf
    上一篇:利用Matlab提取图片曲线
    下一篇:使用Atom支持基于Jupyter的Python开教程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python使用protobufde的过程解析 python,使用,protobufde,的,过程,