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数据序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang实现文件上传并转存数据库功能

    golang实现文件上传并转存数据库功能

    这篇文章主要为大家详细介绍了golang实现文件上传并转存数据库功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 理解Go流程控制与快乐路径原则

    理解Go流程控制与快乐路径原则

    这篇文章主要为大家介绍了Go流程控制与快乐路径原则的原理解析,
    有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Golang 之协程的用法讲解

    Golang 之协程的用法讲解

    这篇文章主要介绍了Golang 之协程的用法讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言Goroutinue和管道效率详解

    Go语言Goroutinue和管道效率详解

    这篇文章主要为大家介绍了Go语言Goroutinue和管道效率使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 小学生也能看懂的Golang异常处理recover panic

    小学生也能看懂的Golang异常处理recover panic

    在其他语言里,宕机往往以异常的形式存在,底层抛出异常,上层逻辑通过 try/catch 机制捕获异常,没有被捕获的严重异常会导致宕机,go语言追求简洁,优雅,Go语言不支持传统的 try…catch…finally 这种异常
    2021-09-09
  • golang基础之Gocurrency并发

    golang基础之Gocurrency并发

    这篇文章主要介绍了golang基础之Gocurrency并发,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Golang Gin解析JSON请求数据避免出现EOF错误

    Golang Gin解析JSON请求数据避免出现EOF错误

    这篇文章主要为大家介绍了Golang Gin 优雅地解析JSON请求数据,避免ShouldBindBodyWith出现EOF错误的源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • GO中高效的将int转换为string的方法与源码

    GO中高效的将int转换为string的方法与源码

    本文将从逐步介绍几种在 Go 中将 int 转换为 string 的常见方法,并重点剖析这几种方法在性能上的特点,另外,还会重点介绍 FormatInt 高效的算法实现,需要的朋友可以参考下
    2024-01-01
  • golang log4go的日志输出优化详解

    golang log4go的日志输出优化详解

    log4go源于google的一项log工程,但官方已经停止维护更新,下面这篇文章主要给大家介绍了关于golang log4go的日志输出优化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • golang设置http response响应头与填坑记录

    golang设置http response响应头与填坑记录

    这篇文章主要给大家介绍了关于golang设置http response响应头与填坑记录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08

最新评论