基本信息
文件名称:Arduino 系列:Arduino MKR WiFi 1010 (基于 SAMD21)_(11).MQTT协议入门.docx
文件大小:30.3 KB
总页数:35 页
更新时间:2025-06-27
总字数:约1.68万字
文档摘要

PAGE1

PAGE1

MQTT协议入门

1.MQTT协议简介

MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级消息协议,特别适用于物联网(IoT)设备之间的通信。它设计用于低带宽、高延迟或不可靠的网络环境,因此在嵌入式系统和单片机上非常受欢迎。MQTT协议通过最小化传输大小来减少网络流量,同时确保消息的可靠传递。

1.1MQTT协议的基本概念

发布/订阅模式:MQTT使用发布/订阅模式,客户端可以订阅一个或多个主题(Topic),并接收发布到这些主题的消息。同样,客户端可以发布消息到某个主题,供其他订阅该主题的客户端接收。

主题(Topic):主题是消息的逻辑路径,用于将消息分类。客户端通过主题来订阅或发布消息。

消息(Message):消息是发布到主题的数据,通常是一个字节串。

代理(Broker):MQTT代理是一个中间服务器,负责接收来自客户端的消息,并将这些消息分发给订阅了相应主题的客户端。常见的MQTT代理包括Mosquitto、HiveMQ等。

QoS(QualityofService):QoS表示消息的服务质量级别,有三个级别:

0:最多一次,消息可能丢失。

1:至少一次,消息可能会重复。

2:只有一次,消息不会丢失也不会重复。

1.2MQTT协议的优势

轻量级:MQTT协议的开销非常低,适合资源受限的设备。

低带宽:通过压缩消息和减少传输数据量,有效利用网络资源。

高可靠性:通过QoS机制确保消息的可靠传输。

简单易用:协议简单,易于实现和理解。

扩展性强:支持多种网络环境和设备,便于系统扩展。

2.MQTT协议的工作原理

2.1客户端-代理模型

MQTT协议采用客户端-代理模型,客户端与代理之间通过TCP/IP协议进行通信。客户端可以是传感器、执行器、手机应用等,代理则负责消息的路由和管理。

2.2连接过程

连接请求(CONNECT):客户端向代理发送连接请求,包含客户端ID、用户名、密码等信息。

连接确认(CONNACK):代理接收到连接请求后,返回连接确认消息,告知客户端连接是否成功。

订阅请求(SUBSCRIBE):客户端向代理发送订阅请求,指定要订阅的主题和QoS级别。

订阅确认(SUBACK):代理返回订阅确认消息,告知客户端订阅是否成功。

发布消息(PUBLISH):客户端向代理发布消息,包含主题和消息内容。

接收消息(PUBLISH):订阅了相应主题的客户端从代理接收消息。

取消订阅(UNSUBSCRIBE):客户端向代理发送取消订阅请求,指定要取消订阅的主题。

取消订阅确认(UNSUBACK):代理返回取消订阅确认消息,告知客户端取消订阅是否成功。

断开连接(DISCONNECT):客户端向代理发送断开连接请求,代理确认后断开连接。

2.3消息传递过程

发布消息:客户端A向代理发布一条消息到主题sensor/temp。

路由消息:代理将消息路由到所有订阅了sensor/temp主题的客户端。

接收消息:客户端B和客户端C订阅了sensor/temp主题,因此它们会接收到该消息。

3.安装MQTT库

要使用MQTT协议,首先需要在ArduinoIDE中安装MQTT库。本文使用PubSubClient库,这是一个广泛使用的MQTT客户端库。

3.1安装PubSubClient库

打开ArduinoIDE。

进入Sketch-IncludeLibrary-ManageLibraries...。

在搜索框中输入PubSubClient,找到库后点击安装。

3.2安装WiFi库

由于ArduinoMKRWiFi1010具有内置的WiFi功能,还需要安装WiFiNINA库来管理WiFi连接。

进入Sketch-IncludeLibrary-ManageLibraries...。

在搜索框中输入WiFiNINA,找到库后点击安装。

4.连接WiFi网络

在使用MQTT协议之前,需要先连接到WiFi网络。以下是一个简单的示例代码,演示如何连接到WiFi网络。

#includeWiFiNINA.h

//WiFi网络凭据

charssid[]=yourSSID;//你的WiFiSSID

charpass[]=yourPassword;//你的WiFi密码

//代理服务器地址

charmqttServer[]=;

intmqttPort=1883;

charclientId[]=ArduinoMKR;

//初始化WiFi客户端

WiFiClientwifiCl