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的配置,直接运行就会自动安装包
在这里插入图片描述