python使用protobufde的过程解析

 更新时间:2021年08月20日 15:17:10   作者:roy8666  
Google开源的一个序列化框架,类似于xml , json。最大的特点是基于 二进制,比传统的xml表示同样的内容要短小很多。亦可定义一些可选字段,用于服务端与客户端通信

概念

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_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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python pandas索引的设置和修改方法

    Python pandas索引的设置和修改方法

    索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容,下面这篇文章主要给大家介绍了关于Python pandas索引的设置和修改的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python中@符号实例详解

    python中@符号实例详解

    @是一个装饰器,针对函数,起调用传参的作用,下面这篇文章主要给大家介绍了关于python中@符号的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • RuntimeError:CUDA out of memory多种场景下的解决方案

    RuntimeError:CUDA out of memory多种场景下的解决方案

    若遇到RuntimeError: CUDA out of memory错误,通常意味着GPU内存不足以处理当前的计算需求,本文就来介绍一下多种场景下的解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • python调用百度语音识别api

    python调用百度语音识别api

    这篇文章主要介绍了python调用百度语音识别api,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 关于python写入文件自动换行的问题

    关于python写入文件自动换行的问题

    今天小编就为大家分享一篇关于python写入文件自动换行的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python微信跳一跳系列之棋子定位颜色识别

    python微信跳一跳系列之棋子定位颜色识别

    这篇文章主要为大家详细介绍了python微信跳一跳系列之棋子定位之颜色识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Python制作旋转花灯祝大家元宵节快乐(实例代码)

    Python制作旋转花灯祝大家元宵节快乐(实例代码)

    一年一度的元宵节来临,小编在这里祝大家2022元宵节快乐,今天小编给大家分享一篇教程关于Python制作旋转花灯祝大家元宵节快乐,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • Python使用open函数的buffering设置文件缓冲方式

    Python使用open函数的buffering设置文件缓冲方式

    这篇文章主要介绍了Python使用open函数的buffering设置文件缓冲方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python 实现图像快速替换某种颜色

    python 实现图像快速替换某种颜色

    这篇文章主要介绍了python 实现图像快速替换某种颜色,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • PyQt5利用QPainter绘制各种图形的实例

    PyQt5利用QPainter绘制各种图形的实例

    下面小编就为大家带来一篇PyQt5利用QPainter绘制各种图形的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论