Golang IOT中的数据序列化与解析

Golang中对于JSON、XML、HTML、RPC、PB、Thrift等现代化协议都支持的非常好,但是对于IOT领域,用的多的反而是HEX原始数据,如果一个个解析,会是非常麻烦的事情。
所以,对于HEX数据是否有方便好用的打包/解包方法?

目前,比较官方和流行的方式有如下几种:

  • Gob: Golang私有协议,自由度高,不可定制。原理:https://www.jb51.net/article/211523.htm
  • Binary: Golang 官方库,只支持固定size的struct。使用非常接近HEX原生。
  • MsgPack: 第三方流行方案。类似gob但是结构开放。原理:https://www.jb51.net/jiaoben/284969tii.htm

对于gob和msgpack在IOT一般比较困难,适用性差,探索一下binary的方案。

Binary结构体与二进制

经常有这样的需求,在底层硬件设备通过TCP/UART传输了一堆数据过来,但是都是16进制的,每1-4个字节表示一个数据,然后还有可能有数组一类的数据。从数据类型上存在bool/int8/int16/int32/int64/float32,还有对应的数组。

如果简单地通过16进制操作,当然可以完成,但是维护起来非常费力,如果设备多了就简直时灾难。

所以,是否存在一种类似模板的方案,自动根据某个字节进行数据的解析和转换呢?答案是肯定的!虽然不一定能完全自动化,但是能节约维护的时间和BUG。

假设我们有这样一个HEX数据

对应数据Data根据Cmd的值不同,有不同的长度和意义。该如何Design这个解析处理呢?

CmdMsg_IO_Status