返回顶部
首页 > 资讯 > 后端开发 > Python >python使用protobufde的过程解析
  • 576
分享到

python使用protobufde的过程解析

python使用protobufpythonprotobuf 2022-06-02 23:06:18 576人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

概念 Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和JSON数据差不多,把数据已某种形式保存起来.Protob

概念

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

优点:

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

2:支持跨平台多语言

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

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

缺点:

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

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

标准数据类型

一个标量消息字段可以含有一个如下的类型——该表格展示了定义于.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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python使用protobufde的过程解析

本文链接: https://lsjlt.com/news/11227.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python使用protobufde的过程解析
    概念 Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protob...
    99+
    2022-06-02
    python使用protobuf python protobuf
  • 使用python远程操作linux过程解析
    这篇文章主要介绍了使用python远程操作linux过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试...
    99+
    2022-06-04
    python 远程 操作 linux
  • Python解析器的解析过程是怎样的
    今天就跟大家聊聊有关Python解析器的解析过程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先先让大家看一下Python解析器的全流程:我们先用编辑器编写好源代码,保存成...
    99+
    2023-06-17
  • 使用systemd部署服务的过程解析
    目录1、前言2、如何部署服务2.1、后台进程方式启动2.2、使用systemd方式启动2.2.1、创建service文件2.2.2、启动服务3、如何自动启动3.1、自动启动文件3.1...
    99+
    2024-04-02
  • Unity 使用tiledmap解析地图的详细过程
    1、先使用tiledmap编辑地图,图层用来刷图块,对象用来定义单个格子的数据 2、为每个图块调属性   3、图块需要单独配置属性的就必须创建对象,并设置值 右键设置...
    99+
    2024-04-02
  • MySQL的prepare使用及遇到bug解析过程
    目录一、问题发现二、问题调查过程三、问题解决方案四、问题总结一、问题发现 在一次开发中使用 MySQL PREPARE 以后,从 prepare 直接取 name 赋值给 lex-&...
    99+
    2024-04-02
  • tensorflow2.10使用BERT实现SemanticSimilarity过程解析
    目录前言数据处理模型搭建模型训练微调模型模型评估推理测试前言 本文详细解释了在 tensorflow-gpu 基础上,实现用 BERT + BILSTM 计算文本相似度的过程,主要...
    99+
    2023-05-15
    tensorflow Semantic Similarity tensorflow使用BERT
  • python编译pyc文件的过程解析
    什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,...
    99+
    2024-04-02
  • MySql存储过程循环的使用分析详解
    目录简介场景描述解决方案案例总结简介 每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数、存储过程等)的用法就不大相同了,就好比Oracle与mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享...
    99+
    2022-06-29
    MySql存储循环使用 MySql存储循环
  • 使用Docker创建FTP服务器的过程解析
    我们先了解一下FTP 文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第...
    99+
    2024-04-02
  • springboot使用redisRepository和redistemplate操作redis的过程解析
    目录导入依赖基本配置使用RedisTemplate访问redis使用Redisrepository访问redis实例:导入依赖 菜单大部分情况下不会出现变化,我们可以将其放入Redi...
    99+
    2024-04-02
  • Android使用GRPC进行通信过程解析
    目录引言环境搭建修改项目的setting.gradle信息修改项目的build.gralde信息修改gradle版本号修改模块的build.gradle信息在main目录下创建pro...
    99+
    2023-02-28
    Android使用GRPC Android GRPC通信
  • Spring容器的使用过程分析
    这篇文章主要介绍Spring容器的使用过程分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、主要流程二、开发步骤2.1 准备Maven项目及环境首先创建一个Maven项目,名称为 spring-study ,以下...
    99+
    2023-06-15
  • Python解析JSON对象的全过程记录
    前言 本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。 json处理模块的主要任务,是将一个JSON对象,转换成Python数据类型数据进行处理,或者...
    99+
    2024-04-02
  • Python Django源码运行过程解析
    目录一、Django运行顺序1.启动1.1 命令行启动(测试服务器)2.监听2.1 runserver(测试服务器)3.中间件的执行本文只算是本人片面之言(当然也会借鉴网络上公开资料...
    99+
    2024-04-02
  • AIDL使用规范及调用过程解析(Android Q)
    AIDL使用介绍 AIDL的全称是Android Interface definition language,一看就明白,它是一种androi...
    99+
    2022-06-06
    调用 aidl Android
  • Python Decorator的设计模式演绎过程解析
    目录关于代理模式、装饰模式Python中的代理/装饰还有什么不理想的地方呢?补充关于代理模式、装饰模式 设计模式中经常提到的代理模式、装饰模式,这两种叫法实际上是说的同一件事,只是侧...
    99+
    2024-04-02
  • 在 Python 中读取 gzip 文件的过程解析
    目录Python 中的 gzip 模块压缩文件的重要性在 Python 中使用 gzip 压缩文件使用 gzip 模块时的数据添加在 Python 中读取 gzip 文件在 Pyth...
    99+
    2023-05-19
    Python读取 gzip 文件 Python gzip 文件
  • redis使用不当导致应用卡死bug的过程解析
    目录topjstack 查看堆内存执行thread命令 首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢...
    99+
    2024-04-02
  • 总结Python使用过程中的bug
    Python使用过程中的bug 问题: 在vscode中, 使用 Windows PowerShell 运行 conda activate xxx (某个环境)切换环境时报错: ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作