首页 > 其他分享 >Golang使用mqtt

Golang使用mqtt

时间:2023-11-04 16:44:05浏览次数:34  
标签:topic token Golang mqtt client 使用 Message opts

示例使用使用EMQX提供的免费公共 MQTT 服务器,该服务基于 EMQX 的 MQTT 物联网云平台 创建。服务器接入信息如下:

Broker: broker.emqx.io
TCP Port: 1883
Websocket Port: 8083

golang代码如下

package main

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

var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
	fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
}

var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
	fmt.Println("Connected")
}

var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
	fmt.Printf("Connect lost: %v", err)
}

func main() {
	var broker = "broker.emqx.io" //地址
	var port = 1883  // 端口
	opts := mqtt.NewClientOptions()
	opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port))
	opts.SetClientID("go_mqtt_client111") //设备唯一id,正常应该是设备拿自己的设备id注册到服务器上。
	opts.SetUsername("emqx") //账号 
	opts.SetPassword("public") //密码
	opts.SetDefaultPublishHandler(messagePubHandler)
	opts.OnConnect = connectHandler
	opts.OnConnectionLost = connectLostHandler
	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		panic(token.Error())
	}

	sub(client)     //等待消息
	publish(client) //发消息

	client.Disconnect(250)
}

func publish(client mqtt.Client) {
	num := 10
	for i := 0; i < num; i++ {
		text := fmt.Sprintf("Message %d", i)
		token := client.Publish("topic/test", 0, false, text)
		token.Wait()
		time.Sleep(time.Second)
	}
}

func sub(client mqtt.Client) {
	topic := "topic/test"
	token := client.Subscribe(topic, 1, nil) ////这里如果不指定方法,就用的上面的SetDefaultPublishHandler设置的方法
	token.Wait()
	fmt.Printf("Subscribed to topic: %s", topic)
}

输出

Connected
Subscribed to topic: topic/testReceived message: Message 0 from topic: topic/test
Received message: Message 1 from topic: topic/test
Received message: Message 2 from topic: topic/test
Received message: Message 3 from topic: topic/test
Received message: Message 4 from topic: topic/test
.....

标签:topic,token,Golang,mqtt,client,使用,Message,opts
From: https://www.cnblogs.com/qcy-blog/p/17809519.html

相关文章

  • 如何安装使用cv::plot
    cv::plot是OpenCV的一个模块,用于绘制2D图像。要使用cv::plot,你需要首先安装OpenCV库。以下是在Ubuntu系统上安装OpenCV的步骤:1.更新你的包列表:sudoapt-getupdate2.安装OpenCV:sudoapt-getinstalllibopencv-dev在Windows系统上,你可以从OpenCV的官方网站下载预编译的库,并......
  • Python 异常处理:try、except、else 和 finally 的使用指南
    异常处理当发生错误(或我们称之为异常)时,Python通常会停止执行并生成错误消息。try块用于测试一段代码是否存在错误。except块用于处理错误。else块用于在没有错误时执行代码。finally块用于无论try和except块的结果如何都要执行的代码。可以使用try语句来处理这些......
  • 如何使用Event事件对异步线程进行阻塞和放行?
    //定义信号事件staticAutoResetEventautoResetEvent=newAutoResetEvent(false);//定义要异步执行的方法staticvoidA()    {        for(inti=0;i<10;i++)        {            autoResetEvent.WaitOne();//阻塞等待信号......
  • Python 异常处理:try、except、else 和 finally 的使用指南
    异常处理当发生错误(或我们称之为异常)时,Python通常会停止执行并生成错误消息。try块用于测试一段代码是否存在错误。except块用于处理错误。else块用于在没有错误时执行代码。finally块用于无论try和except块的结果如何都要执行的代码。可以使用try语句来处理这些......
  • Linux 下使用串口的简易教程
    1、检查串口的配置。查看串口的波特率、数据位、校验位等可以使用以下命令: $stty-F/dev/ttyS02、修改串口的配置。使用stty命令可以修改串口的波特率、数据位、校验位等选项,例如,将串口波特率修改为115200,按如下方式操作:$stty-F/dev/ttyS01152003、stty命令功......
  • 前端javasript——forEach、map、filter和reduce的使用场景
    (文章目录)⭐前言大家好,我是yma16,不止前端,本文分享关于前端javasript——forEach、map、filter、reduce区别与使用。自我介绍前端->全栈开发,csdn内容合伙人,2023csdn新星计划Node赛道Top1,csdn2023新星计划vue3+ts赛道导师,阿里云社区专家博主,华为云享专家,前端技术栈:vue2v......
  • rust 使用 take 和 replace 来保留所有值
    使用take和replace来保留所有值枚举类型enumMyEnum{A{name:String,x:u32},B{name:String},}使用std::mem::take()和std::mem::replace()在不克隆name的情况下修改name这种方式可以不用#[derive(Clone)],不存在内存分配。#![allow(unused)......
  • rust 使用借用类型作为参数
    使用借用类型作为参数编码时应该总是倾向于使用借用类型而不是借用所有类型。对于String类型来说,应该倾向于使用使用&str,而不是&String;#[allow(unused)]fnmain(){letstring:String="hello".to_string();letborrow_string:&String=&string;letborrow......
  • CH32V307 使用PLL2配置系统时钟
    在进行系统时钟配置时,可以选择HSI、HSE、PLL作为系统时钟来源。而PLL时钟来源有几下几种,如下图: 以下为CH32V307时钟树框图,如下图: 关于使用HSE或HSI作为系统时钟,在CH32V307EVT都有相应例程,在system_ch32v30x.c文件中直接使用相关宏定义即可,如下图: 本篇文章主要讲解使......
  • nvidia-docker + nvidia-container-runtime 使用
    docker17.03.2-ce使用GPUdocker官方是19.0.2开始支持英伟达GPU在此之前版本可以通过英伟达魔改docker的工具实现此需求......