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. 生产环境建议

  1. 使用持久化存储保存重要消息
  2. 实现消息去重机制
  3. 添加监控和日志记录
  4. 使用TLS加密通信
  5. 设置合理的QoS级别

这个方案适合构建各种物联网应用,如智能家居、工业监控、环境监测等场景。

回到顶部