golang 解析 byte slice 类型的 MQTT 消息 payload

更新日期: 2022-07-18 阅读次数: 1647 字数: 358 分类: golang

MQTT Message payload 的类型

可以看到 payload 函数返回 byte slice 类型。

var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
	fmt.Printf("TOPIC: %s\n", msg.Topic())
	fmt.Printf("MSG: %s\n", msg.Payload())
}

type Message interface {
	Duplicate() bool
	Qos() byte
	Retained() bool
	Topic() string
	MessageID() uint16
	Payload() []byte
	Ack()
}

func (m *message) Payload() []byte {
	return m.payload
}

打印调试日志

参考

https://pkg.go.dev/fmt

String and slice of bytes (treated equivalently with these verbs):

%s	the uninterpreted bytes of the string or slice
%q	a double-quoted string safely escaped with Go syntax
%x	base 16, lower-case, two characters per byte
%X	base 16, upper-case, two characters per byte

如果是字符串类型的数据,例如 json 格式的 payload,可以直接当成字符串类型打印日志:

fmt.Printf("MSG: %s\n", msg.Payload())

如果是 byte 类型,可以这样打印调试日志:

fmt.Printf("MSG: %X\n", msg.Payload())

byte

首先,要了解 golang 里面的一些名词:

  • byte: 8 位无符号数,即 uint8,范围 0~255,可以表示 ASCII 字符
  • rune: 符文,int32 类型,可以表示多字节符号,例如 utf-8
var a byte = 97  // uint8
var b = 98       // int
c := 'c'         // int32

byte array

data := []byte{102, 97, 108, 99, 111, 110}

使用十六进制初始化 byte 和 byte array

x := byte(0x13)
xs := []byte{0xAC, 0xCA}

byte array 比对

xs := []byte{0xAC, 0xCA}
xs2 := []byte{0xAC, 0xCA, 0x01, 0x02}

if bytes.Equal(xs2[0:2], xs) {
	log.Println("equal")
} else {
	log.Println("not equal")
}

byte array 作为函数参数时,是否有必要使用指针

https://medium.com/swlh/golang-tips-why-pointers-to-slices-are-useful-and-how-ignoring-them-can-lead-to-tricky-bugs-cac90f72e77b

还是使用指针靠谱。

参考

  • https://zetcode.com/golang/byte/ 广告太多,需要一定的心理承受能力
  • https://stackoverflow.com/questions/56605810/how-to-define-bit-literals-in-go
  • https://medium.com/swlh/golang-tips-why-pointers-to-slices-are-useful-and-how-ignoring-them-can-lead-to-tricky-bugs-cac90f72e77b

tags: MQTT

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式