当前位置: 首页 > news >正文

Go 使用mqtt

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 mainimport ("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.")}

http://www.lryc.cn/news/345674.html

相关文章:

  • C++ primer plus习题及解析第十二章(类和动态内存分配)
  • gdb调试功能描述
  • 使用Simulink Test进行单元测试
  • 深度学习中超参数设置
  • Docker nsenter 命令使用
  • 十二种网络威胁防护方案
  • C++ sort()排序详解
  • 移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机
  • zTasker v1.88.1一键定时自动化任务
  • 时序医疗数据集---adfecgdb
  • ruoyi-vue-pro 使用记录(4)
  • 【17-Ⅱ】Head First Java 学习笔记
  • 订单超时自动取消的实践方案
  • 【gin框架入门】
  • dev c++调试录入数字后回车直接关闭
  • java期末复习
  • 让新手变中手的ChatGPT 使用方法
  • 桥接模式类图与代码
  • Oracle count的优化-避免全表扫描
  • leetcode17. 电话号码的字母组合
  • 如何设计与管理一个前端项目
  • 【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker
  • 用云手机打造海外社媒矩阵
  • 第 8 章 机器人平台设计之底盘实现(自学二刷笔记)
  • ✔ ★Java项目——设计一个消息队列(五)【虚拟主机设计】
  • ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘
  • Python Web框架Django项目开发实战:创建在线学习应用
  • 用得助全媒体呼叫中心,让AI落到实处帮品牌做营销
  • 【吃透Java手写】2-Spring(下)-AOP-事务及传播原理
  • Spring原理分析--获取Environment资源对象