Golang连接MQTT服务器

  1. 首先,确保您已安装了Go并设置了GOPATH。

  2. 使用以下命令安装eclipse/paho.mqtt.golang库:

    go get -u github.com/eclipse/paho.mqtt.golang
    
  3. 创建一个名为main.go的文件

    package main
    
    import (
        "fmt"
        "log"
        "os"
        "time"
    
        mqtt "github.com/eclipse/paho.mqtt.golang"
    )
    
    func onMessageReceived(client mqtt.Client, message mqtt.Message) {
        fmt.Printf("接收topic: %s\nMessage: %s\n", message.Topic(), message.Payload())
    
        // 在这里将消息转发回业务平台,您可以根据需要修改此部分
    }
    
    func main() {
        opts := mqtt.NewClientOptions().AddBroker("tcp://localhost:1883")
        opts.SetClientID("emqx_NTkxOD123213")
    	opts.SetUsername("cs")
    	opts.SetPassword("123456")
        opts.SetDefaultPublishHandler(onMessageReceived)
    
        client := mqtt.NewClient(opts)
        if token := client.Connect(); token.Wait() && token.Error() != nil {
            log.Fatal(token.Error())
            os.Exit(1)
        }
    
        // 订阅主题
        if token := client.Subscribe("/v1/test/2", 0, nil); token.Wait() && token.Error() != nil {
            log.Fatal(token.Error())
            os.Exit(1)
        }
    
        // 发送代码指令
        token := client.Publish("/v1/test/3", 0, false, "holle")
        token.Wait()
    
        time.Sleep(3 * time.Second)
    
        client.Disconnect(250)
    }
    
  4. 转换为一个持续运行的应用程序,将main函数中的最后一个client.Disconnect(250)行删除,并添加一个无限循环来保持程序运行。

    package main
    
    import (
        "fmt"
        "log"
        "os"
        "os/signal"
        "syscall"
    
        mqtt "github.com/eclipse/paho.mqtt.golang"
    )
    
    func onMessageReceived(client mqtt.Client, message mqtt.Message) {
        fmt.Printf("接收topic: %s\nMessage: %s\n", message.Topic(), message.Payload())
    
        // 在这里将消息转发回业务平台,您可以根据需要修改此部分
    }
    
    func main() {
        opts := mqtt.NewClientOptions().AddBroker("tcp://localhost:1883")
        opts.SetClientID("emqx_NTkxOD123213")
    	opts.SetUsername("cs")
    	opts.SetPassword("123456")
        opts.SetDefaultPublishHandler(onMessageReceived)
    
        client := mqtt.NewClient(opts)
        if token := client.Connect(); token.Wait() && token.Error() != nil {
            log.Fatal(token.Error())
            os.Exit(1)
        }
    
        // 订阅主题
        if token := client.Subscribe("/v1/test/2", 0, nil); token.Wait() && token.Error() != nil {
            log.Fatal(token.Error())
            os.Exit(1)
        }
    
        // 发送代码指令
        token := client.Publish("/v1/test/3", 0, false, "holle")
        token.Wait()
    
        // 处理系统信号,以便在接收到SIGINT或SIGTERM时优雅地关闭程序
        signalChan := make(chan os.Signal, 1)
        signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
    
        <-signalChan
        fmt.Println("Received signal, shutting down...")
        client.Disconnect(250)
    }
    

现在,该程序将持续运行,直到接收到中断信号(如通过按Ctrl+C或发送SIGTERM信号)。在接收到信号后,它将断开与MQTT服务器的连接并关闭。将此应用程序部署到服务器上,并将其配置为在后台运行即可。

  1. 总结

opts.SetDefaultPublishHandler(onMessageReceived) 会设置一个默认处理器,当没有为特定主题设置处理器时,这个处理器会被调用。
client.Subscribe(topic, qos, handler) 订阅一个主题,并为这个主题设置一个处理器。如果你传递 nil 作为处理器,那么默认处理器会被调用。

client.Subscribe("/v1/test/2", 0, func(client paho.Client, message paho.Message) {
    fmt.Printf("特定主题收到消息: 主题 = %s, 信息 = %s\n", message.Topic(), message.Payload())
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值