首页 > 其他分享 >MQTT协议及其在Golang中的实现

MQTT协议及其在Golang中的实现

时间:2023-06-08 09:44:54浏览次数:33  
标签:协议 订阅 token Golang MQTT client 消息 mqtt

引言:

在物联网(IoT)领域中,设备之间的通信是至关重要的。为了实现设备之间的高效、轻量级通信,MQTT(Message Queuing Telemetry Transport)协议被广泛采用。MQTT是一种基于发布/订阅模式的消息传输协议,被设计为简单、轻量级且易于实现。本文将介绍MQTT协议的核心概念,并演示如何使用Golang实现MQTT功能。

MQTT协议概述:

MQTT协议是由IBM开发的,最初用于连接远程遥测设备到物联网中的服务器。它是一种轻量级的、开放的协议,通过TCP/IP网络进行消息传输。MQTT采用发布/订阅(publish/subscribe)模式,其中设备可以作为发布者(publisher)发布消息,也可以作为订阅者(subscriber)订阅消息。

MQTT的核心概念:

  1. Broker(代理服务器):在MQTT中,代理服务器是消息的中介,负责接收发布者发送的消息,并将其传递给订阅者。它是整个MQTT网络的中心枢纽。
  2. Topic(主题):主题是消息的分类标识符,发布者将消息发布到特定的主题上,而订阅者可以通过订阅相应的主题来接收消息。主题是由一个或多个层级组成,层级之间使用斜杠(/)分隔,例如:"home/bedroom/temperature"。
  3. QoS(服务质量等级):MQTT支持不同的服务质量等级,包括0、1和2。QoS 0提供至多一次的消息传输,QoS 1提供至少一次的消息传输,而QoS 2则提供恰好一次的消息传输。
  4. 消息发布(Publish):设备可以将消息发布到一个或多个主题上,并发送给代理服务器。发布者可以指定消息的QoS等级。
  5. 消息订阅(Subscribe):设备可以订阅一个或多个主题,以接收相应的消息。订阅者可以指定订阅的主题及其QoS等级。
  6. 保留消息(Retained Message):发布者可以发送一个保留消息,该消息将保留在代理服务器上,并在订阅者订阅相应主题时立即发送给它们。
  7. Last Will and Testament(遗嘱消息):设备可以在连接时指定一个遗嘱消息,以便在设备异常断开连接时通知其他设备。

Golang中的MQTT实现:

在Golang中,我们可以使用第三方库实现MQTT功能。下面以Eclipse Paho MQTT库为例,演示如何在Golang中使用MQTT。

首先,需要安装Paho MQTT库。可以使用以下命令进行安装:

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

接下来,可以使用以下代码实现一个简单的MQTT发布者:

package main

import (
	"fmt"
	"os"
	"time"

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

func main() {
	opts := mqtt.NewClientOptions().AddBroker("tcp://localhost:1883")
	client := mqtt.NewClient(opts)

	if token := client.Connect(); token.Wait() && token.Error() != nil {
		fmt.Println(token.Error())
		os.Exit(1)
	}

	topic := "home/bedroom/temperature"
	message := "25°C"

	token := client.Publish(topic, 0, false, message)
	token.Wait()

	client.Disconnect(250)
	fmt.Println("Message published.")
}

以上代码创建了一个MQTT客户端,连接到本地代理服务器(地址为localhost:1883)。然后,指定要发布的主题和消息,并通过client.Publish方法将消息发布到主题上。

下面是一个简单的MQTT订阅者的示例:

package main

import (
	"fmt"
	"os"
	"time"

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

func main() {
	opts := mqtt.NewClientOptions().AddBroker("tcp://localhost:1883")
	client := mqtt.NewClient(opts)

	if token := client.Connect(); token.Wait() && token.Error() != nil {
		fmt.Println(token.Error())
		os.Exit(1)
	}

	topic := "home/bedroom/temperature"

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

	time.Sleep(5 * time.Second)

	client.Disconnect(250)
	fmt.Println("Subscription ended.")
}

以上代码创建了一个MQTT客户端,连接到本地代理服务器。然后,通过client.Subscribe方法订阅指定的主题,并在回调函数中处理接收到的消息。

结论:

MQTT是一种在物联网中广泛使用的消息传输协议,具有简单、轻量级和可靠性的特点。在Golang中,可以使用第三方库(如Eclipse Paho MQTT库)来实现MQTT功能。通过发布者和订阅者的示例代码,我们可以看到在Golang中实现MQTT功能是相对简单且易于理解的。

作者:王鹏果

标签:协议,订阅,token,Golang,MQTT,client,消息,mqtt
From: https://www.cnblogs.com/DTCLOUD/p/17465281.html

相关文章

  • 通信三要素:协议-TCP
          ......
  • 1.4OF-CONFIG南向接口协议学习
    OF-CONFIG南向接口协议学习任务目的1、了解OF-CONFIG协议的基本原理。2、掌握使用OF_CONFIG协议配置交换机的方法。任务环境设备名称软件环境(镜像)硬件环境交换机Ubuntu14.04桌面版OpenvSwitchofconfigCPU:1核内存:2G磁盘:20G注:系统默认的账户为:管理员权......
  • 1.6Mininet流表应用实战2——控制器下发流表协议分析
    Mininet流表应用实战2——控制器下发流表协议分析实验目的1、理解OpenFlow交换机和控制器间的工作原理。2、学会使用Wireshark抓包分析,熟悉了解OpenFlow协议。。实验环境Mininet流表应用实战2——控制器下发流表协议分析实验的拓扑如下图所示。实验环境信息如下表所示。......
  • golang并发channel实践
    前言在我前面一篇文章Golang受欢迎的原因中已经提到,Golang是在语言层面(runtime)就支持了并发模型。那么作为编程人员,我们在实践Golang的并发编程时,又有什么需要注意的点呢?下面我会跟大家详细的介绍一些在实际生产编程中很容易踩坑的知识点。CSP在介绍Golang的并发实践前,有必要先......
  • Golang中的panic
    Golang中的panic引言在软件开发过程中,出现错误是很常见的。在Golang中,当程序发生无法处理的错误时,它会引发panic。panic是一种异常情况,它会导致程序终止并显示错误消息。虽然panic在某些情况下是必要的,但它可能会对程序的性能和可靠性产生负面影响。在本文中,我们将深入探讨Golang......
  • Golang中如何控制goroutine的执行顺序?
    首先说明一下原理:前后协程之间通过通道去相互限制,后一个线程尝试去获取一个channel的值,当channel中没有值时,就会一直阻塞,而前一个协程则负责关闭channel,当前一个协程完成了这个操作,后一个协程才可以结束阻塞,继续执行。示例代码:packagemainimport( "fmt" "time")funcma......
  • Wireshark抓包分析TCP协议
     版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!!之前有一篇文章介绍了http协议「初识http协议」, http协议协议是基于tcp协议的,所以作者觉得有必要针对tcp协议做一个介绍,希望各位读者能够静下心来认真阅读,也可以自己去看看TCP/IP协议详解这本书,一定要让自己成......
  • 如何通过GB/T28181-2016国标协议实现平台间的级联对接?
    如何通过GB/T28181-2016国标协议实现平台间的级联对接?随着近几年网络视频监控应用范围的扩大,越来越多的政府部门及跨区域行业单位对视频监控的需求已经不仅仅满足于本地的联网监控,更多正在探索在原有本地联网监控基础上,建设省级乃至全国范围内跨区域的监控联网,全面打造数据共享平台......
  • 四川省重点用能单位能耗在线监测系统平台接口协议
    本部分是对国家规范中《重点用能单位能耗在线监测系统-基础信息与格式规范》《重点用能单位能耗在线监测系统-端设备接口协议规范》这两个协议规范文档的补充本部分适用于四川省重点用能单位能耗在线监测系统平台应用软件、接口协议应用、能耗监测端设备开发等,实际执行以国家标准......
  • C#语言LIS系统如何接收和解析仪器数据HL7协议
    以下是使用C#实现HL7接口协议的接收和解析的简单示例:1.使用TcpListener类创建一个TCP服务器,用于监听指定端口上的连接请求:```TcpListenerserver=newTcpListener(IPAddress.Any,8888);server.Start();```2.等待客户端连接,并使用TcpClient类创建一个TCP连接:```TcpClie......