跳转至

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 文档和工具:

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数据处理;

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!