Go-MQTT使用

前言

因为在前端、java中一直使用paho的mqtt所以在go中也继续使用,原理是一致的,使用其他版本框架也是一样的,本文使用paho的进行演示

再次还可以下载一个好用的mqtt桌面链接工具

https://packages.emqx.net/MQTTX/v1.9.7/MQTTX-Setup-1.9.7-x64.exe

集成

uuid是用于生成不重复的uuid的

go 复制代码
go get github.com/eclipse/paho.mqtt.golang
go get -u github.com/satori/go.uuid

创建客户端

go 复制代码
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883")
	opts.SetClientID(uuid.NewV1().String())
	opts.SetUsername("username")
	opts.SetPassword("password")
	// 设置消息处理函数
	opts.SetDefaultPublishHandler(mqttService.Receive)
	c := mqtt.NewClient(opts)
	if token := c.Connect(); token.Wait() && token.Error() != nil {
		panic("mqtt连接失败,请检查地址账号密码!")
	}

订阅、取消订阅主题

go 复制代码
	if token := c.Subscribe(subTopic, 0, nil); token.Wait() && token.Error() != nil {
		fmt.Println("订阅MQTT主题" + subTopic + "失败")
		os.Exit(1)
	}
	fmt.Print("订阅MQTT主题" + subTopic + "成功")
go 复制代码
// 取消订阅
	if token := c.Unsubscribe(subTopic); token.Wait() && token.Error() != nil {
		fmt.Println(token.Error())
		os.Exit(1)
	}

发布消息

go 复制代码
// Publish 发送到消息到指定的主题,qos为2保证消息不会丢失也不会重复投递,效率略低
func Publish(c mqtt.Client, pubTopic string, text string) {
	token := c.Publish(pubTopic, 2, false, text)
	fmt.Printf("mqtt:当前主题是 [%s];发送消息: [%s] \n", pubTopic, text)
	token.Wait()
}

接收消息

go 复制代码
// Receive 接收 MQTT
func Receive(client mqtt.Client, msg mqtt.Message) {
	fmt.Printf("mqtt: 当前主题是 [%s]; 接收到的信息是 [%s] \n", msg.Topic(), string(msg.Payload()))
}

完整代码

main.go

复制代码
package main

import (
	mqttService "gin_study/mqtt"
	mqtt "github.com/eclipse/paho.mqtt.golang"
	uuid "github.com/satori/go.uuid"
	"strconv"
)

func main() {
	// 创建MQTT、客户端
	opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883")
	opts.SetClientID(uuid.NewV1().String())
	opts.SetUsername("username")
	opts.SetPassword("password")
	// 设置消息处理函数
	opts.SetDefaultPublishHandler(mqttService.Receive)
	c := mqtt.NewClient(opts)
	if token := c.Connect(); token.Wait() && token.Error() != nil {
		panic("mqtt连接失败,请检查地址账号密码!")
	}
	// 订阅主题
	mqttService.Subscribe(c, "test/1")
	// 发布消息
	for i := 0; i < 10; i++ {
		mqttService.Publish(c, "test/1", "测试发布消息"+strconv.Itoa(i))
	}
}

mqttService

复制代码
package mqttService

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

// Subscribe mqtt订阅主题
func Subscribe(c mqtt.Client, subTopic string) {
	if token := c.Subscribe(subTopic, 0, nil); token.Wait() && token.Error() != nil {
		fmt.Println("订阅MQTT主题" + subTopic + "失败")
		os.Exit(1)
	}
	fmt.Print("订阅MQTT主题" + subTopic + "成功")
}

// UnSubscribe mqtt取消订阅主题
func UnSubscribe(c mqtt.Client, subTopic string) {
	// 取消订阅
	if token := c.Unsubscribe(subTopic); token.Wait() && token.Error() != nil {
		fmt.Println(token.Error())
		os.Exit(1)
	}
}

// Publish 发送到消息到指定的主题,qos为2保证消息不会丢失也不会重复投递,效率略低
func Publish(c mqtt.Client, pubTopic string, text string) {
	token := c.Publish(pubTopic, 2, false, text)
	fmt.Printf("mqtt:当前主题是 [%s];发送消息: [%s] \n", pubTopic, text)
	token.Wait()
}

// Receive 接收 MQTT
func Receive(client mqtt.Client, msg mqtt.Message) {
	fmt.Printf("mqtt: 当前主题是 [%s]; 接收到的信息是 [%s] \n", msg.Topic(), string(msg.Payload()))
}
相关推荐
坚果派·白晓明1 小时前
【鸿蒙PC三方库移植适配框架解读系列】第八篇:扩展lycium框架使其满足rust三方库适配
c语言·开发语言·华为·rust·harmonyos·鸿蒙
花间相见1 小时前
【PaddleOCR教程01】PP-OCRv5 全面指南:从模型架构到实战部署
开发语言·r语言
小短腿的代码世界2 小时前
Qt 股票订单撮合引擎:高频交易系统的核心心脏
开发语言·数据库·qt·系统架构·交互
养肥胖虎2 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
晓杰'2 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o3 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl3 小时前
Multi-Head Attention:为什么要分多个头
后端
谙弆悕博士3 小时前
快速学C语言——第16章:预处理
c语言·开发语言·chrome·笔记·创业创新·预处理·业界资讯
ltl4 小时前
Scaled Dot-Product:那个根号 d_k 是怎么来的'
后端
yuan199974 小时前
基于 C# 实现的 Omron HostLink (FINS) 协议 PLC 通讯
开发语言·c#