MQTT基础篇

2023/05/04

MQTT基础知识及使用方法,分为多个文章,MQTT基础知识 - MQTT服务器 & MQTT上位机 - MQTT设备端(MicroPython - ESP32),适用于MQTT初学者,个人能力有限,文章不足或错误之处还请各位大佬批评指正。

MQTT概述

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
(来源于百度百科,看了也不懂系列)

MQTT工作原理

上面概述中也提到了,MQTT是基于发布/订阅范式的消息协议,需要一个消息中间件。这句话该如何理解呢?

在此可以将MQTT整个结构看做外卖过程。
外卖小哥(发送设备)给我们送外卖时,我们也许在上课(网络状况差),也许在忙自己的事(硬件性能低下),通常是无法将外卖直接送到我们个人(接收设备)手中的,此时,外卖小哥可以将外卖先暂存到外卖柜(中间件-服务器)中。但一个偌大的一个外卖柜总不可能给我们一个人使用吧,因此外卖柜会分割出一个个的小空间(Topic话题),由此,一个外卖柜就可以同时让许多外卖小哥存放外卖,许多同学取走外卖了。

而在MQTT整体结构中也是这样的,由于MQTT定位于硬件性能低下的远程设备以及网络状况糟糕的情况,加之硬件设备没有固定的公网IP地址,因此我们的发送设备是无法(或无法可靠的)将数据直接发送到接收设备的。此时就要借助于一个存在于云端的服务器作为中转站,而一个MQTT服务器中又会存在多个Topic。此时,我们的发送设备就可以将数据发送到具有公网IP的MQTT服务器的某一个topic中,而接收端就可以到这个MQTT服务器的某一个topic中获取相应的数据。一次MQTT数据传输就此完成。

总体来看,MQTT就是发送端将数据发送到云端服务器的某一个空间内,接收端再去云端服务器的对应空间获取数据的过程。

MQTT常见参数

  1. MQTT服务器地址:也就是云端服务器的IP地址,发送端需要往此IP地址推送消息,接收端需要到此IP地址订阅消息。》》扩展到外卖的例子中,外卖小哥总不可能随便找一个外卖柜就把我们的外卖给丢进去吧,一定是和我们约定好了一个外卖柜,作为暂存的中间件,约定到的外卖柜就是我们的MQTT服务器地址。
  2. 端口:是的,就是计网中的那个网络端口,毕竟MQTT是基础TCP协议之上的。》》我们去取外卖,学校规定只能走东门,那好,我们只能通过东门这一个端口进出了,走西门是无法到达外卖柜的。此时的东门,就是我们的网络端口。
  3. Client ID:用于区分客户端(发送设备 接收设备)身份的唯一标识。》》在外卖的例子中,小红 小绿 小灰灰,我们总有一个网名吧。
  4. 用户名、密码:这个好理解,我们客户端连接到MQTT服务器会有一个用户名和密码,要是不用用户名和密码,谁都可以连接到我们的MQTT服务器,那服务器岂不是乱套了?
  5. Publish Topic:上面也提到了,服务器中会创建多个Topic,对于发送端来说,我们需要往Topic中推送消息,此时,这个Topic就是Publish Topic。》》在外卖的例子中,外卖小哥需要将外卖放到外卖柜的 121 号这个方格子内,此时,这个方格子对于外卖小哥就相当于Publish Topic。
  6. Subscribe Topic:发送端将数据放到了服务器中,接收端总要去服务器中将数据取出来吧?是的,服务器中的同一个Topic对于发送端来说是Publish Topic,对于接收端来说就成了Subscribe Topic。》》就像外卖的例子中,外卖小哥将外卖放到了 121 号中,我们肯定是要到 121 号取我们的外卖。同一个 121 号空间,对于外卖小哥来说就是“ 放”, 对我们来说就是 “取”。
  7. Keep Alive:用于定时发送一个数据包,检测设备是否在线。假设我们的设备没有向服务器推送消息,也没有向服务器订阅消息,一分钟以后,设备端还是没有动静,那这个设备是掉线了呢还是单纯的没有数据需要交换呢?此时,我们就可以规定让设备一分钟发送一次心跳包,假设服务器在一分钟的时候收到了设备的心跳包,那证明设备只是单纯的没有数据发送,而一分钟没有收到心跳包,那这个设备大概率是断开连接掉线了。
  8. QoS:服务质量,分为 0、1、2 三个等级,其中 0 最多发一次,1 最少发一次, 2 保证收一次。》》同样是在外卖的例子中,外卖小哥可以直接把我们的外卖放到柜子里走人,也可以打个电话问下我们是否取走了外卖,还可以一分钟打一次以确保我们已经取走了快递。具体描述,我们可以参考这位博主的文章 MQTT-QoS 服务质量等级

MQTT适用场景

基础篇的最后说一下MQTT的使用场景:

上面也提到过 MQTT定位于硬件性能低下的远程设备以及网络状况糟糕的情况,同时由于MQTT需要第三方服务器的介入加上不稳定的通信,数据从发送方到接收方的时延可能较高,因此MQTT适合一些嵌入式性能低下的设备,同时适合传输一些轻文本信息,并不适合数据量大,对实时性要求高的场合。

例如,我们可以在室外放一些温湿度传感器,传感器将获取的数据推送到云端服务器,我们再通过手机APP来订阅这些消息。由于在此场景中传感器获取的数据可能也就几个Byte,数据传输量并不大,同时实时温度晚个几秒钟传输到我们手机也无关紧要,因此适合MQTT通信方式。

假如我们需要传输视频数据,或者做一个物联网小车用手机进行远程遥控,传输视频需要的数据量太大,遥控小车对实时性要求较高,此时MQTT就不再适用了。

关于MQTT的服务器、上位机、设备端的相关文章,可以点击右侧或文章顶部 “MQTT” 专栏查看哦~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proteus是一款电子电路仿真软件,可以用于设计、测试和验证电路原理图和PCB布局。而MQTT是一种轻量级的通信协议,用于物联网设备之间的消息传递。 在Proteus中使用MQTT,可以模拟物联网设备之间的通信。你可以使用MQTTBox或者编写代码来代替MQTT工具。首先,你需要在Proteus中添加一个虚拟串口工具(vspdpro.exe),用于模拟串口通信。然后,你可以在Proteus中添加一个TCP接收工具(通讯猫),用于接收MQTT消息。接下来,你可以使用Proteus提供的函数或者编写代码来实现MQTT的功能。 以下是一个使用Proteus和MQTT的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义MQTT消息处理函数 void mqtt_message_handler(char* topic, char* message) { printf("Received MQTT message:\n"); printf("Topic: %s\n", topic); printf("Message: %s\n", message); } int main() { // 初始化Proteus和MQTT Proteus_Init(); MQTT_Init(); // 订阅MQTT主题 MQTT_Subscribe("topic1"); MQTT_Subscribe("topic2"); // 设置MQTT消息处理函数 MQTT_SetMessageHandler(mqtt_message_handler); // 运行Proteus和MQTT Proteus_Run(); MQTT_Run(); return 0; } ``` 在上面的示例代码中,我们首先初始化Proteus和MQTT。然后,我们订阅了两个MQTT主题。接下来,我们设置了一个MQTT消息处理函数,用于处理接收到的MQTT消息。最后,我们运行了Proteus和MQTT。 请注意,上述示例代码仅为演示目的,实际使用时需要根据具体情况进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值