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

 更新时间:2023年05月20日 08:59:23   作者:笨笨D幸福  
这篇文章主要介绍了Golang IOT中的数据序列化与解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

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

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

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

Binary结构体与二进制

参考: https://www.jb51.net/jiaoben/284968z11.htm

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

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

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

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

Message: Byte. 假设N=4
  ┌──────┬──────┬────────┬──────────┬──────────┬───────┐
  │ Id: 1│Cmd: 1│ Addr: 2│Length: 2 │Data: 2*N │ CRC:2 │
  └──────┴──────┴────────┴──────────┴──────────┴───────┘

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

package main
import (
	"bytes"
	"encoding/binary"
	"fmt"
)
// message的基础结构,继承后使用
// size = 6
type CmdMsgBaseHeader struct {
	Idx  uint8  // 设备模块的唯一ID,从1-254,255表示广播
	Cmd  uint8  // 命令值,表示不同类型的消息
	Addr uint16 // 数据地址,2个字节,高字节在前。大端字节序(big endian)
	Len  uint16 // 返回的真实数据长度,以2个字节为一个单位
	//Data [N]uint8 // RAW数据,根据Cmd和Addr区分作用。一般作为继承数据使用。固定size。
	//CRC  [2]uint8 // CRC校验
}
// 假设的 数据1
// size = 2 + 2*Len = 10
type CmdMsg_IO_Status struct {
	CmdMsgBaseHeader
	Data [4]uint16
	CRC  [2]uint8
}
func main() {
	a := CmdMsg_IO_Status{}
	b := []uint8{0x01, 0x09, 0x02, 0x01, 0x00, 0x04 /*Data*/, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05 /*CRC*/, 0xAC, 0xAC}
	buff := bytes.NewBuffer(b)
    // buff size = 6+10 = 16
	err := binary.Read(buff, binary.BigEndian, &a)
	if err != nil {
		fmt.Println("read error:", err)
		return
	}
	// decode ok
	fmt.Printf("decode: %+v\n", a) // {CmdMsgBaseHeader:{Idx:1 Cmd:9 Addr:513 Len:4} Data:[258 259 260 261] CRC:[172 172]}
}

这样,通过不断定制CmdMsg_IO_Status就可以按照需求解析HEX数据。

到此这篇关于Golang IOT中的数据序列化与解析的文章就介绍到这了,更多相关go数据序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言实现AES加密并编写一个命令行应用程序

    Go语言实现AES加密并编写一个命令行应用程序

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是经常采用的一种区块加密标准。本文就来用Go语言实现AES加密算法,需要的可以参考一下
    2023-02-02
  • Golang使用Consul详解

    Golang使用Consul详解

    Consul是一个服务发现软件, 提供了服务发现\键值存储\健康检查等功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Golang汇编之控制流深入分析讲解

    Golang汇编之控制流深入分析讲解

    这篇文章主要介绍了Golang汇编之控制流,程序执行的流程主要有顺序、分支和循环几种执行流程,本节主要讨论如何将Go语言的控制流比较直观地转译为汇编程序,或者说如何以汇编思维来编写Go语言代码,感兴趣的同学可以参考下文
    2023-05-05
  • 聊聊Golang中很好用的viper配置模块

    聊聊Golang中很好用的viper配置模块

    这篇文章主要介绍了Golang中很好用的viper配置模块用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中互斥锁和读写互斥锁原理及示例代码

    Golang中互斥锁和读写互斥锁原理及示例代码

    在Golang中,互斥锁是一种基本的同步原语,用于实现对共享资源的互斥访问,读写互斥锁是一种特殊类型的互斥锁,它允许多个协程同时读取某个共享资源,本文将通过过示例代码详细介绍Golang中互斥锁和读写互斥锁,需要的朋友可以参考下
    2023-05-05
  • go语言中的二维切片赋值

    go语言中的二维切片赋值

    这篇文章主要介绍了go语言中的二维切片赋值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言基础for循环语句的用法及示例详解

    Go语言基础for循环语句的用法及示例详解

    这篇文章主要为大家介绍了Go语言基础for循环语句的用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Go语言学习之接口类型(interface)详解

    Go语言学习之接口类型(interface)详解

    接口是用来定义行为的类型,定义的行为不由接口直接实现,而由通过方法由定义的类型实现,本文就来和大家详细讲讲Go语言中接口的使用吧
    2023-03-03
  • Go如何优雅的使用字节池示例详解

    Go如何优雅的使用字节池示例详解

    在编程开发中,我们经常会需要频繁创建和销毁同类对象的情形,这样的操作很可能会对性能造成影响,这时常用的优化手段就是使用对象池(object pool),这篇文章主要给大家介绍了关于Go如何优雅的使用字节池的相关资料,需要的朋友可以参考下
    2022-08-08
  • Go slice切片make生成append追加copy复制示例

    Go slice切片make生成append追加copy复制示例

    这篇文章主要为大家介绍了Go使用make生成切片、使用append追加切片元素、使用copy复制切片使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论