嵌入式设备使用protobuf进行加密通信

protubuf介绍

Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
使用protobuf加密输出的数据流,因为只有发送和接收双方才知道解析的格式,所以当第三方未知proto文件内容时,数据传输是比较安全的。

项目中protubuf用途

在项目中,互联网设备需要定时推送一些数据到服务器进行存储。
然后使用的是明文传输协议,因此只要对数据部分进行protobuf加密,可以保证数据尽可能不被第三方解析到。

实战

protubuf不支持直接输出c文件,使用nanobp可以生成对应的c文件和h文件。

链接

  1. protobuf
    https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.6
    旧版本会提供window可执行文件,比较方便,下载win64压缩文件。
  2. nanopb
    https://jpa.kapsi.fi/nanopb/download/
    下载nanopb-x.x.x-windows-x86.zip

一键生成

为了方便调试,我使用批命令一键生成:

.\protobuf-base\bin\protoc --python_out=. .\dev.proto
.\protobuf-base\bin\protoc dev.proto -o dev.pb
.\protobuf_nanopb\nanopb-0.4.7-windows-x86\generator-bin\nanopb_generator .\dev.pb
pause

生成dev.pb.c, dev.pb.h文件

使用pycharm模拟测试

# coding=utf-8
# file: test_proto.py

import dev_pb2


def test():
    Msg = dev_pb2.Msg()
    data = Msg.d.add()
    data.t = 2

    string = Msg.SerializeToString()
    print(string)

    Msg.ParseFromString(string)
    print(Msg)


if __name__ == "__main__":
    test()
    pass

输出:
b’\n\x02\x10\x02’
d {
t: 2
}

使用nanopb生成数据

  1. 移植以下文件
    在这里插入图片描述

可以看见有两个结构体定义:

/* Struct definitions */
typedef struct _pb_Msg {
    pb_callback_t d;
} pb_Msg;

typedef struct _pb_Data {
    uint32_t t;
} pb_Data;

将数据进行加密

pb_Msg msg = pb_Msg_init_zero;
msg.d.arg = &回调传参;
msg.d.funcs.encode = &自己定义的回调函数;

// call nanopb
pb_ostream_t ostream = pb_ostream_from_buffer(输出buf, buf大小);
pb_encode(&ostream, pb_Msg_fields , &msg)

回调函数:

    DevMsg *source = (DevMsg *)(*arg);
    int i;
    for (i = source->countData - 1; i >= 0; i--)
    {
        pb_Data bodydata;
        bodydata.t = source->data[i];
        pb_encode_tag_for_field(ostream, field))
		pb_encode_submessage(ostream, pb_Data_fields , &bodydata))
    }

验证

将buf的数据以hex字符串打印,使用python进行解析

    Msg.ParseFromString(bytes.fromhex("hex字符串"))
    print(Msg)

结尾

旨在记录本次经历,避免后面走太多弯路~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入Protobuf是指在嵌入系统中使用Protobuf协议进行数据的序列化和反序列化。嵌入系统通常具有有限的资源和处理能力,因此需要一种轻量级的数据交换格来降低资源消耗并提高性能。Protobuf是一种非常适用于嵌入系统的序列化协议,它可以将结构化的数据以二进制的形进行传输和存储。 在嵌入系统中使用Protobuf,首先需要在系统中集成Protobuf库,并根据需要编写对应的.proto文件来定义数据结构和消息类型。然后使用Protobuf的编译器将.proto文件生成对应的代码文件,这些代码文件可以用于在嵌入系统中进行数据的序列化和反序列化操作。 在嵌入系统中使用Protobuf可以带来一些好处。首先,Protobuf的编码和解码效率高,可以更快地处理数据。其次,Protobuf的数据格紧凑,可以减少数据在传输和存储过程中的占用空间。此外,Protobuf还支持数据的版本控制和扩展,可以方便地对数据进行更新和演化。 需要注意的是,嵌入系统中使用Protobuf版本可能不同,目前稳定版本是3.9.2,但一些早期项目可能仍在使用proto2协议。因此,在使用嵌入Protobuf时,需要根据实际情况选择合适的版本,并确保.proto文件的语法与所使用Protobuf版本一致,以避免生成文件报错。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [嵌入Protobuf扫盲入门](https://blog.csdn.net/sinat_28723265/article/details/120079920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值