Golang MQTT物联网
新手想用Golang开发MQTT物联网项目,请问有哪些成熟的MQTT库推荐?需要注意哪些性能优化点?
2 回复
Golang适合开发MQTT物联网应用,可使用Eclipse Paho或EMQ X客户端库。实现设备连接、消息发布/订阅,支持QoS和持久化。轻量高效,适合边缘计算。
更多关于Golang MQTT物联网的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中实现MQTT物联网应用,推荐使用Eclipse Paho MQTT客户端库。以下是完整示例:
1. 安装依赖
go get github.com/eclipse/paho.mqtt.golang
2. 基础客户端实现
package main
import (
"fmt"
"time"
"os"
"os/signal"
"syscall"
mqtt "github.com/eclipse/paho.mqtt.golang"
)
var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("收到消息: %s 来自主题: %s\n", msg.Payload(), msg.Topic())
}
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
fmt.Println("MQTT连接成功")
}
var connectionLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
fmt.Printf("连接丢失: %v", err)
}
func main() {
// MQTT配置
opts := mqtt.NewClientOptions()
opts.AddBroker("tcp://broker.emqx.io:1883") // 公共MQTT服务器
opts.SetClientID("go_mqtt_client")
opts.SetUsername("")
opts.SetPassword("")
opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectionLostHandler
// 创建客户端
client := mqtt.NewClient(opts)
// 连接
if token := client.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}
// 订阅主题
subscribe(client, "sensor/temperature")
// 发布消息
publish(client, "sensor/temperature", "25.6")
// 保持运行
waitForExit()
// 断开连接
client.Disconnect(250)
}
func subscribe(client mqtt.Client, topic string) {
token := client.Subscribe(topic, 1, nil)
token.Wait()
fmt.Printf("已订阅主题: %s\n", topic)
}
func publish(client mqtt.Client, topic string, payload string) {
token := client.Publish(topic, 0, false, payload)
token.Wait()
fmt.Printf("已发布消息到 %s: %s\n", topic, payload)
}
func waitForExit() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
fmt.Println("\n正在退出...")
}
3. 物联网设备模拟
// 模拟温度传感器
func simulateTemperatureSensor(client mqtt.Client) {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for range ticker.C {
// 模拟温度数据 (20-30度)
temp := fmt.Sprintf("%.1f", 20 + 10 * rand.Float64())
publish(client, "sensor/temperature", temp)
}
}
// 设备控制处理
func setupDeviceControl(client mqtt.Client) {
// 订阅设备控制主题
client.Subscribe("device/led/control", 1, func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("收到控制命令: %s\n", msg.Payload())
// 根据payload执行相应操作
switch string(msg.Payload()) {
case "on":
fmt.Println("打开LED")
case "off":
fmt.Println("关闭LED")
}
})
}
4. 主要特性
- QoS支持: 0(最多一次), 1(至少一次), 2(正好一次)
- 自动重连: 内置连接恢复机制
- TLS支持: 安全的MQTTS连接
- 遗嘱消息: 设备异常断开时通知
5. 生产环境建议
- 使用持久化存储保存重要消息
- 实现消息去重机制
- 添加监控和日志记录
- 使用TLS加密通信
- 设置合理的QoS级别
这个方案适合构建各种物联网应用,如智能家居、工业监控、环境监测等场景。

