01.什么是MQTT?

00_前言

本系列博客是基于NodeMCU平台来完成的一个物联网小项目,目的在于了解并学习MQTT协议,掌握MQTT协议的作用机制。以上。

01_简述

以下摘自百度百科

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

相较而言,MQTT协议的最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。也因此,作为一种低开销、低带宽占用的即时通讯协议,其在物联网、小型设备、移动应用等方面有较广泛的应用。

02_特性

MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

  1. 使用发布/订阅[^1]消息模式,提供一对多的消息发布,解除应用程序耦合。

在软件工程中, 耦合指的就是就是对象之间的关联性。对象之间的耦合越高,维护成本越高。

  1. 对负载内容屏蔽的消息传输。
  1. 使用TCP/IP提供网络连接。

主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同,本系列博客中均使用MQTT,不对MQTT-SN做过多描述。

  1. 有三种消息发布服务质量(QoS):
    1)至多一次
    2)至少一次
    3)只有一次

需要注意的是,因为消息的发布完全依赖底层TCP/IP网络,因为网络情况或其它原因可能会发生消息丢失或重复。并且MQTT的三种消息发布服务质量,其对资源的占用是由低到高的,使用时需要根据消息的重要性进行分情况使用。

1)至多一次: 这一级别的意思是,消息只推送一次,但是订阅方是否收到或是否消息重复不重要。因此,本级别可用于以下类似情况:非关键部位的连续推送环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送,例如,家庭中的温湿度传感器一类。或者是APP的普通消息推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

2)至少一次: 确保消息到达,但消息重复可能会发生。因此,本级别可用于以下类似情况:烟雾传感器的报警推送或者门口有人进屋的警告推送,这种必须确保订阅方接收到的消息,但是多次接收也不会造成不良结果的。

3)只有一次: 确保消息到达一次。例如在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

  1. 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。

因此,MQTT非常适合使用在物联网领域中,传感器与服务器的通信,信息的收集。毕竟嵌入式设备的运算能力和带宽都相对薄弱,以此考虑的话使用MQTT协议来传递消息算得上非常适合了。

  1. 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。

Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。(主题与发布/订阅机制相关,在下一小节进行描述)

Testament:遗嘱机制,功能类似于Last Will。

03_MQTT运行机制

实现MQTT协议的通讯,需要服务器与客户端来完成,而在实际过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息代理是服务器,消息的发布者和订阅者都是客户端,并且消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)Topic,主题,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

(2)payload,负载,可以理解为消息的内容,是指订阅者具体要使用的内容。 图片描述
举一个例子:我们每个人手机里都有一个“昨日头条”APP,用来接收新闻推送。但是这个APP有两个限制,一个是没有默认关注频道,用户需要自己选择订阅需要的频道才能接收新闻推送;二是,所有的新闻内容由用户自己上传。

我可以关注法律频道,接收这个频道下的所有新闻推送,同时,张三也可以关注这个频道,用来接收这个频道下的新闻推送。
用户罗老师若在法律频道下发布新闻,则订阅了法律频道的我和张三都会收到对应的新闻推送。

在上述过程中,法律等频道就是一个个的主题(Topic),新闻内容就是消息的负载(payload)。

在下一节中,将通过多设备来实现并了解MQTT协议通讯的详细过程。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要连接ESP01S到阿里云MQTT,需要进行以下步骤: 1. 创建阿里云账号并购买MQTT实例。 2. 在阿里云MQTT控制台中创建一个设备,并获取设备的ProductKey、DeviceName和DeviceSecret。 3. 下载并安装Arduino IDE和PubSubClient库。 4. 在Arduino IDE中打开一个新的示例程序或创建一个新的程序并将以下代码复制到程序中: ``` #include <ESP8266WiFi.h> #include <PubSubClient.h> const char* ssid = "YourWiFiSSID"; const char* password = "YourWiFiPassword"; const char* mqttServer = "YourMQTTServer"; const int mqttPort = 1883; const char* mqttUser = "YourMQTTUser"; const char* mqttPassword = "YourMQTTPassword"; const char* productKey = "YourProductKey"; const char* deviceName = "YourDeviceName"; const char* deviceSecret = "YourDeviceSecret"; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected successfully!"); mqttClient.setServer(mqttServer, mqttPort); mqttClient.setCallback(callback); while (!mqttClient.connected()) { String clientId = productKey + "." + deviceName; Serial.println("Connecting to MQTT server..."); if (mqttClient.connect(clientId.c_str(), mqttUser, mqttPassword)) { Serial.println("MQTT connected successfully!"); } else { Serial.println("MQTT connection failed, rc="); Serial.println(mqttClient.state()); delay(2000); } } mqttClient.subscribe("/" + productKey + "/" + deviceName + "/user/get"); } void loop() { mqttClient.loop(); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message received on topic: "); Serial.println(topic); Serial.print("Message content: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } ``` 5. 将代码中的以下变量替换为您的阿里云MQTT实例和设备信息: - ssid:您的WiFi网络名称 - password:您的WiFi网络密码 - mqttServer:您的MQTT实例域名或IP地址 - mqttUser:您的MQTT实例账号名称 - mqttPassword:您的MQTT实例账号密码 - productKey:您的设备的ProductKey - deviceName:您的设备的DeviceName - deviceSecret:您的设备的DeviceSecret 6. 将ESP01S连接到计算机并上传程序。 7. 在阿里云MQTT控制台中发布一条消息到设备的默认订阅主题“/ProductKey/DeviceName/user/get”,消息内容随意。 8. 您应该在串口监视器中看到已接收到消息。 这是一个基本的连接ESP01S到阿里云MQTT的示例。您可以根据自己的需求和应用程序进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值