跳转至

protobuf数据处理

一、PROTOBUF 数据处理简介

Protobuf(Protocol Buffers)是 google 开发的一种数据描述语言,它能够将结构化的数据序列化,并且可以将序列化的数据进行反序列化恢复原有的数据结构。一般用于数据存储以及通信协议方面。

它类似于 JSON,但更小更快,并且可以生成原生语言绑定。您只需定义一次数据结构,然后可以使用特定生成的源代码,轻松地在各种数据流中以及使用各种语言读写结构化数据。

Protobuf 解决了哪些问题?

Protobuf 提供了一种适合用于几兆字节大小的类型化、结构化数据包的序列化格式。该格式适用于瞬时网络流量和长期数据存储。Protobuf 可以扩展新的信息,而不会使现有数据无效,也不需要更新代码。

具体细节可以参考官方文档:https://protobuf.dev/overview/

二、演示功能概述

本示例将演示如何使用将 table 类型数据转为 Protobuf 格式,还有将 Protobuf 格式转为 table。

三、硬件准备

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools工具

2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件

3. luatos需要的脚本和资源文件

脚本和资源文件https://gitee.com/openLuat/LuatOS-Air780EP/tree/master/demo/protobuf

lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。

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

七、功能验证

八、总结

本 demo 介绍了如何使用 PROTOBUF 编解码数据。

扩展

常见问题

给读者的话

本篇文章由Linden开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air780EP-LuatOS-软件指南-常用功能实现-protobuf数据处理;

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

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

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