Golang中使用 Mqtt

devtools/2025/3/16 6:48:42/

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 mainimport ("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) //转jsonfmt.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)<-signalChanfmt.Println("Received signal, shutting down...")client.Disconnect(250)
}
文章来源:https://blog.csdn.net/qq_23564667/article/details/145036956
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/150247.html

相关文章

解析若依 `R.java` 类——ruoyi-common-core

文章目录 1. 类的整体功能2. 代码解析2.1 成员变量和常量2.2 静态方法构造响应对象2.3 内部私有方法 restResult2.4 工具方法 3. 开发中的应用扩展3.1 接口规范化3.2 快速响应构造3.3 自定义状态码3.4 自定义扩展 R.java 是若依框架中通用的 API 响应封装类&#xff0c;主要用于…

javascrip基础语法

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 1. JavaScript 输出 1.1 console.log()&#xff1a;用于将信息输出到浏览器控制台&#xff0c;例如con…

Python爬虫-爬取汽车之家全部汽车品牌的brandid(品牌ID)

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 本文以汽车之家平台为例子,获取所有汽车品牌的“全部品牌ID”,即brandid数据。如下所示: 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下看正文详…

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…

三台Centos7.9中Docker部署Redis集群

Docker部署Redis集群 1. 安装 Docker 和 Docker Compose安装 Docker&#xff1a;安装 Docker Compose&#xff1a; 2. 配置 Redis 容器和网络3. 启动 Redis 容器4. 设置 Redis 集群4.1 集群创建异常处理 5. 验证和测试总结 如果 CentOS 服务器上还没有安装 Docker 和 Docker Co…

手游业务该如何选择服务器?

在网络游戏行业当中&#xff0c;对于服务器配置的需求是非常高的&#xff0c;大型的网络游戏需要服务器的高稳定性&#xff0c;来保证用户的游戏体验感&#xff0c;那么对于手游业务来说该如何进行选择服务器呢&#xff1f; 手游业务通常都需要处理大量的用户数据信息和并发请求…

Flutter中Get.snackbar避免重复显示的实现

在pubspec.yaml中引入依赖框架。 #GetX依赖注解get: ^4.6.5创建一个SnackBarManager管理类去管理每个提示框。 import package:get/get.dart; import package:flutter/material.dart;class SnackBarManager {factory SnackBarManager() > instance;static final SnackBarMa…

代理模式详解与应用

代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;也称为委托模式或 surrogate 模式&#xff0c;是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象&#xff0c;可以在不改变原始对象接口的前提下&#xff0c;添加额外的功能…