Golang中使用Mqtt的方法示例

 更新时间:2025年02月17日 09:36:51   作者:小吴-斌  
本文介绍了Golang中使用paho.mqtt.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)
}

到此这篇关于Golang中使用Mqtt的方法示例的文章就介绍到这了,更多相关Golang使用Mqtt内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Go语言状态机的实现

    Go语言状态机的实现

    本文主要介绍了Go语言状态机的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • sublime安装支持go和html的插件

    sublime安装支持go和html的插件

    这篇文章主要介绍了sublime安装支持go和html的插件,需要的朋友可以参考下
    2015-01-01
  • 自定义Go Json的序列化方法译文

    自定义Go Json的序列化方法译文

    这篇文章主要为大家介绍了自定义Go Json序列化方法译文,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 解密Golang中Request对象的操作

    解密Golang中Request对象的操作

    这篇文章主要和大家深入探讨 Golang 中的 Request 对象,并从多个方面介绍其功能、结构和使用方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-05-05
  • Golang template 包基本原理分析

    Golang template 包基本原理分析

    这篇文章主要为大家介绍了Golang template 包基本原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • golang引入自定义包的两种方法

    golang引入自定义包的两种方法

    本文主要介绍了golang引入自定义包的两种方法,第一种是传统的手动管理,第二种是使用go.mod文件,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • golang中make和new的区别示例详解

    golang中make和new的区别示例详解

    Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易,下面这篇文章主要介绍了golang中make和new的区别,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Go通过不变性优化程序详解

    Go通过不变性优化程序详解

    这篇文章主要为大家介绍了Go通过不变性优化程序实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言实现请求频率限制的方法实践

    Go语言实现请求频率限制的方法实践

    本文介绍了Go语言中四种主流的请求限流方案,包括计数器法、Redis滑动窗口、令牌桶算法和使用成熟中间件,每种方案都有优缺点,适用于不同的场景,下面就来详细的介绍一下,感兴趣的可以了解一下
    2026-04-04
  • 安装Sublime Text支持Go插件的方法步骤

    安装Sublime Text支持Go插件的方法步骤

    本文主要介绍了安装Sublime Text支持Go插件的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论