Go 使用mqtt

2 篇文章 0 订阅

1、创建一个文件夹,并且使用go modules

        go mod init <module_name> 其中<module_name>是你的模块名称,如下


go mod init example.com/myproject

2、安装mqtt扩展

go get github.com/eclipse/paho.mqtt.golang

3、开始写主程序

package main

import (
	"fmt"
	mqtt "github.com/eclipse/paho.mqtt.golang"
	"log"
	"os"
	"os/signal"
)

// MessageHandlerFunc 定义一个处理消息的函数类型
type MessageHandlerFunc func(mqtt.Client, mqtt.Message)

// AsyncMessageHandler 异步处理消息的包装器
func AsyncMessageHandler(handler MessageHandlerFunc) mqtt.MessageHandler {
	return func(client mqtt.Client, msg mqtt.Message) {
		go handler(client, msg) // 在新的Goroutine中处理消息
	}
}

func main() {

	opts := mqtt.NewClientOptions().AddBroker("****:8883")
	opts.SetClientID("zhuti")
	// 设置MQTT连接的用户名和密码
	opts.SetUsername("****")
	opts.SetPassword("*****")

	// 自定义消息处理函数
	handleMessage := func(client mqtt.Client, msg mqtt.Message) {
		
		fmt.Printf("Received message on topic %s: %s\n", msg.Topic(), msg.Payload())

		// 在这里添加你的消息处理逻辑s
		// ...
	}

	// 使用自定义的异步消息处理器包装原始处理函数
	asyncHandle := AsyncMessageHandler(handleMessage)

	opts.SetDefaultPublishHandler(asyncHandle)

	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		log.Fatalf("Failed to connect to MQTT broker: %v", token.Error())
	}

    // 订阅主题
	topics := []string{"#"}
	for _, topic := range topics {
		if token := client.Subscribe(topic, 0, nil); token.Wait() && token.Error() != nil {
			log.Fatalf("Failed to subscribe to topic %s: %v", topic, token.Error())
		}
		
	}

	fmt.Println("MQTT client is connected and subscribed. Waiting for messages...")

	// 例如,可以监听一个os.Signal来优雅关闭。
	//for i := 0; i < 1000; i++ {
	//	text := fmt.Sprintf("Message %d", i)
	//	token := client.Publish("Lattice/22", 0, false, text)
	//	token.Wait()
	//	time.Sleep(1 * time.Second)
	//}
	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, os.Kill)
	<-c // 阻塞等待信号

	//在收到信号后,可以执行清理操作,如断开MQTT连接
	client.Disconnect(250) // 250是超时时间,单位为毫秒
	fmt.Println("Disconnected from MQTT broker.")

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值