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

Golang中使用 Mqtt

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

本文主要介绍如何在 Golang 项目中使用 github.com/eclipse/paho.mqtt.golang 客户端库 ,实现客户端与 MQTT 服务器 的连接、订阅、收发消息等功能。

项目初始化

环境为1.23.2
在这里插入图片描述
本项目使用 paho.mqtt.golang 作为 MQTT 客户端库,安装:

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

连接Mqtt

	opts := mqtt.NewClientOptions().AddBroker("tcp://broker.emqx.io:1883")
	opts.SetClientID("mqtt_golang_NTkxOD123213")  // Client ID
	// opts.SetUsername("mqtt_toys")  // 用户名
	// opts.SetPassword("to113gz")  // 用户密码
	opts.SetDefaultPublishHandler(onMessageReceived)  // 订阅主题时的消息处理函数

	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		log.Fatal(token.Error())
		os.Exit(1)
	}

	// 订阅主题
	// production/# 匹配 production/ 开头的主题 
	if token := client.Subscribe("production/#", 0, nil); token.Wait() && token.Error() != nil {
		log.Fatal(token.Error())
		os.Exit(1)
	}

订阅主题消息处理函数

func onMessageReceived(client mqtt.Client, message mqtt.Message) {
	now := time.Now()
	fmt.Printf("时间:%s\t接收topic: %s\tMessage: %s\n", now.Format("2006-01-02 15:04:05.000"), message.Topic(), message.Payload())
	// 在这里将消息转发回业务平台,您可以根据需要修改此部分
 
}

发送主题

	// 玩具入库数据
	toysProduce := map[string]interface{}{
		"method": "produce",
		"params": map[string]interface{}{
			"sex": "1", 
			"name": "test",
			"ver": "V1.0.0",
		},
	}

	mjson, _ := json.Marshal(toysProduce) //转json 
	// 发送代码指令
	token := client.Publish("production/create", 0, false, string(mjson))
	token.Wait()

完成代码

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"os/signal"
	"syscall"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

func onMessageReceived(client mqtt.Client, message mqtt.Message) {
	now := time.Now()
	fmt.Printf("时间:%s\t接收topic: %s\tMessage: %s\n", now.Format("2006-01-02 15:04:05.000"), message.Topic(), message.Payload())
	// 在这里将消息转发回业务平台,您可以根据需要修改此部分 
}

func main() {
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.emqx.io:1883")
	opts.SetClientID("mqtt_golang_NTkxOD123213")  // Client ID
	// opts.SetUsername("mqtt_toys")  // 用户名
	// opts.SetPassword("to113gz")  // 用户密码
	opts.SetDefaultPublishHandler(onMessageReceived)  // 订阅主题时的消息处理函数

	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		log.Fatal(token.Error())
		os.Exit(1)
	}

	// 订阅主题
	// production/# 匹配 production/ 开头的主题
	if token := client.Subscribe("production/#", 0, nil); token.Wait() && token.Error() != nil {
		log.Fatal(token.Error())
		os.Exit(1)
	}

	// 玩具入库数据
	toysProduce := map[string]interface{}{
		"method": "produce",
		"params": map[string]interface{}{
			"sex": "1", 
			"name": "test",
			"ver": "V1.0.0",
		},
	}

	mjson, _ := json.Marshal(toysProduce) //转json
	fmt.Println("发送数据:", string(mjson))
	// 发送代码指令
	token := client.Publish("production/create", 0, false, string(mjson))
	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)
}


http://www.kler.cn/a/488374.html

相关文章:

  • 设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析
  • C++【深入底层,从零模拟实现string类】
  • Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开
  • WebSocket 测试入门篇
  • imageio 图片转mp4 保存mp4
  • python【数据结构】
  • 计算机网络 笔记 数据链路层 2
  • docker(目录挂载、卷映射)
  • HTML实战课堂之启动动画弹窗
  • 高级软件工程-复习
  • CancerGPT :基于大语言模型的罕见癌症药物对协同作用少样本预测研究
  • 【Leetcode 热题 100】394. 字符串解码
  • 【STM32】利用SysTick定时器定时1s
  • Linux MISC杂项设备驱动
  • 回顾 Tableau 2024 亮点功能,助力 2025 数据分析新突破
  • WebSocket在实时体育比分网站中的应用
  • javaEE初阶————多线程初阶(1)
  • Git 常用命令指南
  • Vue.js 组件开发指南
  • 模式识别-Ch3-极大似然估计
  • Euler 21.10(华为欧拉)安装oracle19c-RAC
  • Django SimpleUI 配置详解:SIMPLEUI_CONFIG 和常用图标
  • Windows系统安装ComfyUI
  • 简单易用的PDF工具箱
  • 编译时找不到需要的库,如何在PyCharm中为你的项目添加需要的库
  • OpenPCDet从环境配置到模型训练