如何用开发板实现protoBuffer功能
简介
protobuffer是google开发的一种数据描述语言,它能够将结构化的数据序列化,并切可以将序列化的数据进行反序列化恢复原有的数据结构。一般用于数据存储以及通信协议方面。本文通过Air724开发板,来对protoBuffer的序列化和反序列化做一个简单的说明和演示。
材料准备
- EVB_Air724UG_A13开发板一套,包括天线SIM卡,USB线。
- luat开发环境:环境搭建方法
步骤
本文以\demo\protoBuffer\simple这个DEMO为例做演示。
- 创建addressbook.proto文件,定义数据结构。例中定义了一个名为 Person 的 消息,message 关键字后跟上消息名称Person ,之后我们在其中定义了 message 具有的字段,形式为:字段规则 类型 名称 = 字段编号。
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
repeated int32 test = 5 [packed=true];
optional Profile profile = 6;
extensions 10 to max;
}
- proto编译为pb,具体编译方法见\demo\protoBuffer\proto编译为pb方法.txt文档说明
打开cmd,输入protoc-2.6.1-windows-x86_64 --descriptor_set_out=tracker.pb tracker.proto命令,就在同一级目录下生成了proto对应的pb文件
- 注册proto描述文件
local pbFile = io.open("/lua/addressbook.pb","rb")
local pbBuf = pbFile:read("*a")
pbFile:close()
protobuf.register(pbBuf)
- protobuf.encode:序列化接口,使用protobuf.encode序列化,序列化后的二进制数据流以string类型赋值给encodeStr
local addressBook =
{
name = "Alice",
id = 12345,
phone =
{
{number = "1301234567"},
{number = "87654321", type = "WORK"},
{number = "13912345678", type = "MOBILE"},
},
email = "username@domain.com"
}
local encodeStr = protobuf.encode("tutorial.Person", addressBook)
log.info("protobuf.encode",encodeStr:toHex())
- protobuf.decode:反序列化接口,使用protobuf.decode反序列化,反序列化后的数据以table类型赋值给decodeTable
decodeTable = protobuf.decode("tutorial.Person", encodeStr)
decodeTable.profile.nick_name = "AHA"
decodeTable.profile.icon = "id:1"
log.info("protobuf.decode",string.format('\tid: %d, name: %s, email: %s', decodeTable.id, decodeTable.name, decodeTable.email))
if decodeTable.profile then
log.info("protobuf.decode",string.format('\tnick_name: %s, icon: %s', decodeTable.profile.nick_name, decodeTable.profile.icon))
end
for k,v in ipairs(decodeTable.phone) do
log.info("protobuf.decode",string.format("\tphone NO.%s: %s %s", k, v.number, v.type))
end
- log展示
常见问题
- 打印不了log问题,由于这个打印比较靠前,直接打印会丢失打印不出来,可以在mail.lua中次模块之前加一个延时处理rtos.sleep(3000)。