在 arduino 与外界通讯参数多了解析起来就很麻烦。平时工作中网络通讯都用的 protobuf 来实现。就想能不能在 arduino 中也使用 protobuf,使用官方的C++库是不可能的了,编译出来的体积足以撑爆芯片的所有可用的空间。好在发现了一个第三方的 protobuf 实现库 nanopb,它可以以极低的资源占用来解析 protobuf,使用起来也不算麻烦。

编写 proto 协议描述文件

my.proto
message test {
    optional string name = 1;
    optional int32 id = 2;
}

编译 proto 文件

protoc -omy.pb my.proto

生成 nanopb 专用的输出格式

nanopb_generator my.pb

生成出 my.pb.h my.pb.c

与 arduino 代码对接

在 nanopb 里有这么些代码文件

这是 nanopb 的基础文件

  • pb.h
  • pb_common.h
  • pb_common.c

编码 protobuf 要用到的

  • pb_encode.h
  • pb_encode.c

解码 protobuf 要用到的

  • pb_decode.h
  • pb_decode.c

基础文件一定是要加的,编码解码的代码文件根据需要加入,生成的 my.pb.h my.pb.c 也需要加入进来。

在 http 段中增加如下开关可以关闭 nginx 在 302 转发中附加端口号,而导致网页无法打开的问题。
port_in_redirect off;

参数说明

  • c 创建包裹
  • x 解开包裹
  • v 显示详细信息
  • z 启用gzip算法
  • f 源文件
  • t 列出包裹内容
  • C 目标文件夹

打包文件

tar -cvzf packages.tar.gz ./packages

解包文件

tar -xvzf packages.tar.gz -C /home/u2nn

查看包裹内容

tar -tf packages.tar.gz

其他

注意 tar 打包所包含的路径信息。
tar -cvzf xxx.tgz xxx/yyy/ddd 打包的根就是 xxx
tar -cvzf xxx.tgz ../../xxx/yyy 打包的根就是 xxx

python 中带有 __init__.py 文件的文件夹也被定义成一个模块,而 __init__.py 就是他的初始化文件,在其中所定义的变量,都可以通过模块名访问到。其中的 __all__ 是个 dict 其中定义了通过 from xxx import * 方式需要导入模块本身哪些属性。