背景
在IoT领域,MQTT作为举足轻重的协议广泛应用在设备与云端的交互、通讯中。在开发过程中,难免会遇到设备异常状况。这时,监听并保存设备与服务器交互的MQTT数据,有助于定位排查系统异常。本文给出一个简单的示例,定义MQTT数据,并讲topic和数据保存至sqlite数据以供后续分析用。
使用到的第三方库
gorm
用于操作数据库
代码
下列代码订阅给定MQTT的#(全部topic),并将topic和payload保持到log.db文件中
package main
import (
"log"
MQTT "github.com/eclipse/paho.mqtt.golang"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type Log struct {
gorm.Model
Topic string
Payload []byte
}
const (
HOST = "修改为你的MQTT服务器地址 123.123.123.123:1883"
USER = "修改为你的用户名"
PASSWD = "修改为你的密码"
)
func main() {
db, err := gorm.Open(sqlite.Open("log.db"), &gorm.Config{})
if err != nil {
log.Fatalln("InitDB error:\t", err)
return
}
db.AutoMigrate(&Log{})
opts := MQTT.NewClientOptions()
opts.AddBroker(HOST)
opts.SetClientID("mqtt2log.demo")
opts.SetUsername(USER)
opts.SetPassword(PASSWD)
opts.SetCleanSession(true)
cli := MQTT.NewClient(opts)
if token := cli.Connect(); token.Wait() && token.Error() != nil {
log.Fatalf("mqtt connect err: %x\r\n", token.Error())
}
cli.Subscribe("#", 0, func(cli MQTT.Client, message MQTT.Message) {
log.Printf("topic:%s\tmsg:%s\r\n", message.Topic(), message.Payload())
db.Create(&Log{
Topic: message.Topic(),
Payload: message.Payload(),
})
})
select {}
}