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