protobuf数据处理
一、PROTOBUF 数据处理简介
Protobuf(Protocol Buffers)是 google 开发的一种数据描述语言,它能够将结构化的数据序列化,并且可以将序列化的数据进行反序列化恢复原有的数据结构。一般用于数据存储以及通信协议方面。
它类似于 JSON,但更小更快,并且可以生成原生语言绑定。您只需定义一次数据结构,然后可以使用特定生成的源代码,轻松地在各种数据流中以及使用各种语言读写结构化数据。
Protobuf 解决了哪些问题?
Protobuf 提供了一种适合用于几兆字节大小的类型化、结构化数据包的序列化格式。该格式适用于瞬时网络流量和长期数据存储。Protobuf 可以扩展新的信息,而不会使现有数据无效,也不需要更新代码。
具体细节可以参考官方文档:https://protobuf.dev/overview/
二、演示功能概述
本示例将演示如何使用将 table 类型数据转为 Protobuf 格式,还有将 Protobuf 格式转为 table。
三、准备硬件环境
3.1 Air780E 核心板,包括天线、USB 数据线.
淘宝购买链接:Air780E 核心板淘宝购买链接 ;
此核心板的详细使用说明参考:Air780E 产品手册 中的 《开发板Core_Air780E使用说明VX.X.X.pdf》,写这篇文章时最新版本的使用说明为:《开发板Core_Air780E使用说明V1.0.5.pdf》 ;核心板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。
3.2 SIM 卡
请准备一张可正常上网的 SIM 卡,该卡可以是物联网卡或您的个人手机卡。
特别提醒:请确保 SIM 卡未欠费且网络功能正常,以便顺利进行后续操作。
3.3 数据通信线
typec 接口 USB 数据线即可。
3.4 PC 电脑
WIN10以及以上版本的WINDOWS系统。
四、准备软件环境
4.1 基本的下载调试工具
使用说明参考:Luatools 下载和详细使用 ;
五、获取 PROTOBUF 数据处理软硬件资料
5.1 文档和工具:
- 780E模块使用固件:SDK& Demo - 合宙文档中心,本demo使用的固件版本是:LuatOS-SoC_V1112_EC618_FULL.soc
- 本教程使用的demo:https://gitee.com/openLuat/LuatOS-Air780E/tree/master/demo/protobuf
- 将固件和脚本烧录到模块中:Luatools 下载和使用教程 - 合宙模组资料中心
- protobuf-api地址
5. 生成pb文件
去下载地址: https://github.com/protocolbuffers/protobuf/releases 下载
然后使用命令protoc.exe -o person.pb person.pbtxt
将pbtxt文件转换成pb文件。
六、代码示例介绍
6.1 使用 protobuf 编解码数据
6.1.1 demo 介绍
-- 加载 pb 文件, 这个是从pbtxt 转换得到的
-- 下载资源到模块时不需要下载pbtxt,需要下载person.pb文件
-- 转换命令: protoc.exe -o person.pb person.pbtxt
-- protoc.exe 下载地址: https://github.com/protocolbuffers/protobuf/releases
if io.exists(pb_file) then
protobuf.load(io.readFile(pb_file))
sys.publish("pb_file_exists")
else
log.info("protobuf","Failed to load file")
end
local tb = {
name = "wendal",
id = 123,
email = "abc@qq.com"
}
while 1 do
sys,waitUntil("pb_file_exists")
sys.wait(1000)
-- 用 protobuf 编码数据
local pbdata = protobuf.encode("Person", tb)
if pbdata then
-- 打印数据长度. 编码后的数据含不可见字符, toHex是方便显示
log.info("protobuf", "encode", #pbdata, (pbdata:toHex()))
end
-- 用 json 编码数据, 用于对比大小
local jdata = json.encode(tb)
if jdata then
log.info("json", #jdata, jdata)
end
-- 可见 protobuffs 比 json 节省很多空间
-- 后续是演示解码
local re = protobuf.decode("Person", pbdata)
if re then
-- 打印数据, 因为table不能直接显示, 这里转成json来显示
log.info("protobuf", "decode", json.encode(re))
end
end
6.1.2 将程序下载到开发板
参考:将固件和脚本烧录到模块中:Luatools 下载和使用教程 - 合宙模组资料中心
注意:下载时要将 person.pb 文件也下载进去。
七、功能验证
八、总结
本 demo 介绍了如何使用 PROTOBUF 编解码数据。
扩展
常见问题
给读者的话
本篇文章由
Linden
开发;本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air780E-LuatOS-软件指南-常用功能实现-protobuf数据处理;
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!