示例-Luat示例-protoBuffer(protocal buffer数据格式)

如何用开发板实现protoBuffer功能

简介

protobuffer是google开发的一种数据描述语言,它能够将结构化的数据序列化,并切可以将序列化的数据进行反序列化恢复原有的数据结构。一般用于数据存储以及通信协议方面。本文通过Air724开发板,来对protoBuffer的序列化和反序列化做一个简单的说明和演示。

材料准备

  1. EVB_Air724UG_A13开发板一套,包括天线SIM卡,USB线。
  2. luat开发环境:环境搭建方法
    图片.png

步骤

本文以\demo\protoBuffer\simple这个DEMO为例做演示。

  1. 创建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; 
}
  1. proto编译为pb,具体编译方法见\demo\protoBuffer\proto编译为pb方法.txt文档说明
打开cmd,输入protoc-2.6.1-windows-x86_64 --descriptor_set_out=tracker.pb tracker.proto命令,就在同一级目录下生成了proto对应的pb文件
  1. 注册proto描述文件
local pbFile = io.open("/lua/addressbook.pb","rb")
local pbBuf = pbFile:read("*a")
pbFile:close()
protobuf.register(pbBuf)
  1. 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())
  1. 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
  1. log展示
    log

常见问题

  1. 打印不了log问题,由于这个打印比较靠前,直接打印会丢失打印不出来,可以在mail.lua中次模块之前加一个延时处理rtos.sleep(3000)。

相关资料以及购买链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值