MQTT是物联网常用的协议,服务器一般用云平台(自建也可以),而客户端一边是物联网的设备,另一边是为设备服务的“客户端”(服务器),为设备服务的客户端一般用Java Python等编写,并不多见Go语言,因此写一个示例
Go语言我也不太熟练
安装
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=on
go get github.com/eclipse/paho.mqtt.golang
go get github.com/gorilla/websocket
go get golang.org/x/net/proxy
编写源代码
在gopath下src创建一个自己的包,创建一个main.go
package main
import (
"fmt"
"sync"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
)
const broker = "tcp://你的服务器.mqtt.iot.gz.baidubce.com:1883"
const username = "你的服务器/client"
const password = "UJq**密码**msq"
const ClientID = "随意"
//message的回调
var onMessage mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("[%s] -> %s\n", msg.Topic(), msg.Payload())
}
var wg sync.WaitGroup
var client mqtt.Client
func main() {
//连接MQTT服务器
mqttConnect()
defer client.Disconnect(250) //注册销毁
wg.Add(1)
go mqttSubScribe("test1")
wg.Add(1)
go testPublish()
wg.Wait()
}
func mqttConnect() {
//配置
clinetOptions := mqtt.NewClientOptions().AddBroker(broker).SetUsername(username).SetPassword(password)
clinetOptions.SetClientID(ClientID)
clinetOptions.SetConnectTimeout(time.Duration(60) * time.Second)
//连接
client = mqtt.NewClient(clinetOptions)
//客户端连接判断
if token := client.Connect(); token.WaitTimeout(time.Duration(60)*time.Second) && token.Wait() && token.Error() != nil {
panic(token.Error())
}
}
func mqttSubScribe(topic string) {
defer wg.Done()
for {
token := client.Subscribe(topic, 1, onMessage)
token.Wait()
}
}
//测试 3秒发送一次,然后自己接收
func testPublish() {
defer wg.Done()
for {
client.Publish("test1", 1, false, "TEST")
time.Sleep(time.Duration(3) * time.Second)
}
}
用命令行,需要要整一下gomod
go mod init
go mod tidy (-v)
go mod verify
go mod vendor (-v)
Goland的Modules使用方式
添加一个go build的配置,直接运行就会自动安装包