文章目录

  • 一、关于MQTT协议的介绍
  • 二、MQTT 发布订阅模式
  • 三、使用 MQTT 报文实现发布订阅
  • 四、使用Python进行客户端编写
  • 五、与其他协议进行对比
  • 六、小结
  • 七、参考资料

一、关于MQTT协议的介绍

MQTT协议是基于发布/订阅模式的物联网通信协议,具有简单易实现、支持 QoS、报文小等特点,在物联网上应用极其广泛。
广泛应用于IOT的原因
①轻量可靠
MQTT 报文紧凑,可在严重受限的硬件设备和低带宽、高延迟的网络上实现稳定传输。
②ecology 生态更完善
覆盖全语言平台的客户端和 SDK, AWS IoT Core、 Azure IoT Hub 等顶级云厂商物联网平台标准通信协议,物联网事实标准。
③pubsub 发布/订阅模式
基于发布/订阅模式,发布订阅模式的优点在于发布者与订阅者的解耦:订阅者与发布者不需要建立直接连接、也不需要同时在线。
④iot 为物联网而生
提供心跳机制、遗嘱消息、QoS 质量等级+离线消息、主题和安全管理等全面的物联网应用特性。

二、MQTT 发布订阅模式

发布订阅模式使发送消息的客户端(发布者)与接收消息的客户端(订阅者)分离,发布者与订阅者不需要建立直接联系。我们既可以让多个发布者向一个订阅者发布消息,也可以让多个订阅者同时接收一个发布者的消息,它的精华在于由一个被称为代理的中间角色负责所有消息路由和分发的工作。在MQTT通讯过程,发布者,订阅者,中间代理是三个极其重要的角色。
总结归纳该种模式的优点如下
①订阅者与发布者不需要建立直接连接,新的订阅者想要加入网络时不需要修改发布者的行为,又称之为空间解耦。
②订阅者和发布者不需要同时在线,即便不存在订阅者也不影响发布者发布消息,时间解耦。

三、使用 MQTT 报文实现发布订阅

1.连接
对于一个客户端来说,必须包含Client ID,Username/password,Keep Alive等信息。
①Client ID
连接服务端的每个客户端都有唯一的 ClientId ,用于服务端识别客户端。客户端和服务端都必须使用 ClientId 识别两者之间的 MQTT 会话相关的状态。
②Username/Password
MQTT 可以通过发送用户名和密码来进行相关的认证和授权。
③Keep Alive(保持连接)
一个以秒为单位的时间间隔,指的是客户端传输完成一个控制报文的时刻到发送下一个报文的时刻之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文。如果 Keep Alive 的值非零,并且服务端在一点五倍的 Keep Alive 时间内没有收到客户端的控制报文,它必须断开客户端的网络连接,认为网络连接已断开。
④Clean Session
客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输,这个标志告诉服务器这次连接是不是一个全新的连接。

客户端的会话状态包括:
已经发送给服务端,但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息
已从服务端接收,但是还没有完成确认的 QoS 2 级别的消息
服务端的会话状态包括:
已经发送给客户端,但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息
即将传输给客户端的 QoS 1和 QoS 2 级别的消息
已从客户端接收,但是还没有完成确认的 QoS 2 级别的消息
可选,准备发送给客户端的 QoS 0 级别的消息

2.Subscribe 订阅主题
客户端向服务端发送 Subscribe 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送 Publish 报文给客户端。Subscribe 报文为每个订阅指定了最大的 QoS 等级,服务端根据这个发送应用消息给客户端。

Subscribe 报文的有效载荷必须包含至少一对主题过滤器 和 QoS 等级字段组合。

服务端在收到客户端订阅报文后,会发送 Suback 报文给客户端,用于确认它已收到并且正在处理Subscribe 报文。

3.Publish 发布消息
Publish 报文是指从客户端向服务端或者服务端向客户端传输一个应用消息,服务器收到 Publish 报文后根据主题过滤器将消息转发给其他客户端。
Publish报文包括Topic,Qos,主题内容。

Topic
主题名(Topic Name)用于识别消息应该被发布到哪一个会话,服务端发送给订阅客户端的 Publish 报文的主题名必须匹配该订阅的主题过滤器。
QoS
QoS 表示应用消息分发的服务质量等级保证

说明:
过程大致如上面所描述,更多相关内容,请自行查找相关资料进行了解或参考下面链接进行进一步了解
https://www.emqx.io/cn/blog/how-to-use-mqtt-packet-to-implement-publishing-and-subscribing-functions

四、使用Python进行客户端编写

1.下载第三库paho-mqtt
打开Pycharm,选择File->Settings

接着在搜索框上输入想要的安装的第三方库名称,出现之后,选中它进行安装

2.创建.py代码文件
①发布消息客户端

import time
import sys
def on_connect(client, userdata, flags, rc):print("Connected with result code " + str(rc))
def on_subscribe(client,userdata,mid,granted_qos):print("消息发送成功")
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.connect(host="192.168.43.98", port = 61613, keepalive=60)  # 订阅频道
time.sleep(1)
i = 0
#循环发布消息
while True:try:# 发布MQTT信息sensor_data = "test" + str(i)client.publish(topic="public", payload=sensor_data, qos=0)time.sleep(5)i += 1except KeyboardInterrupt:print("EXIT")client.disconnect()sys.exit(0)

②订阅消息客户端

import timeimport paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):if rc == 0:print("连接成功")print("Connected with result code " + str(rc))def on_message(client, userdata, msg):print(msg.topic + " " + str(msg.payload))
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_message = on_message
client.connect(host="192.168.43.98", port = 61613, keepalive=60)  # 订阅频道
time.sleep(1)
# client.subscribe("public")
client.subscribe([("public", 0), ("test", 2)])
client.loop_forever()

3.运行结果

客户端2作为发布者,每间隔5s发布一条主题名为public的消息,客户端1作为订阅者,订阅了主题名为public的消息.客户端2每发布一条消息,服务器就会将该消息发送给客户端1
4.实现自定义消息内容发布
发布者客户端代码

import sys
def on_connect(client, userdata, flags, rc):print("Connected with result code " + str(rc))
def on_subscribe(client,userdata,mid,granted_qos):print("消息发送成功")
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.connect(host="192.168.43.98", port = 61613, keepalive=60)  # 订阅频道
time.sleep(1)
i = 0
while True:sensor_data=input("请输入要发表消息内容(0表示退出):")if(sensor_data=='0'):breaktry:# 发布MQTT信息client.publish(topic="weather", payload=sensor_data, qos=0)time.sleep(5)# i += 1except KeyboardInterrupt:print("EXIT")client.disconnect()sys.exit(0)

订阅者代码基本不用动,注意两个主题名要保存一致
运行结果

对应服务器上连接的相关信息

说明:
本客户端采用的Apollo搭建的MQTT服务器.对于没有搭建MQTT服务器的,可以才网上提供的MQTT服务,其链接如下
https://www.emqx.io/cn/mqtt/public-mqtt5-broker
程序只需要修改Broker为broker.emqx.io和TCP端口为1883

五、与其他协议进行对比

MQTT:
①TCP协议,长连接
②适合做设备反向控制
③实时性控制
REST:
①TCP协议,短连接
②不适合做设备实时反向控制
③实时性控制不是很好

MQTT主要应用于各大物联网平台,REST主要应用于各种API

六、小结

通过对MQTT的发布订阅模式的认识,可以很清楚的看到通信的整个过程。客户端的实现,主要包含三个部分,第一部分是实现连接MQTT服务器,第二部分是实现消息的订阅,第三部分是消息的发布。通过运行这个程序,你会发现即使订阅主题的客户端没有运行,发布客户端仍旧会按照规定进行发布消息。由此,可以看出发布者和订阅者两者之间并不会对对方造成影响。这便是这种方式通信的优点所在。

七、参考资料

1.python 实现 MQTT通信(客户端与服务器端)
2.https://www.emqx.io/cn/mqtt/public-mqtt5-broker

编写MQTT客户端程序——python相关推荐

  1. python socket recv超时_python使用多线程编写tcp客户端程序,你还没掌握吗?

    这篇文章主要为大家详细介绍了python使用多线程编写tcp客户端程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在网上浏览的时候发现很多关于此题目的程序都只能接收数据,所以随便找了个程序研究 ...

  2. paho | 支持10种语言编写mqtt客户端,总有一款适合你!

    1. 轻量级物联网协议 - MQTT MQTT全称 Message Queuing Telemetry Transport,即消息队列遥测传输协议,是一种基于发布/订阅(publish/subscri ...

  3. QT应用编程: 编写MQTT客户端登录OnetNet服务器完成主题订阅与发布

    一.环境介绍 QT版本: 5.12.6 编译器:  MinGW 32 MQTT协议: 参照3.1.1版本文档自己编写 (不是使用QT的qmqtt) 功能介绍:  使用QT编写MQTT客户端(根据mqt ...

  4. 编写登陆认证程序--Python

    作业1: 编写登陆认证程序 --Python 基础需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序升级需求: 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认 ...

  5. 使用python编写mqtt客户端向EMQX服务器发送数据

    摘要:本文介绍如何用python编写一个mqtt客户端向EMQX服务器发送数据,实现一个简易的本地物联网服务器. 上一篇文章讲到使用mqtt.fx软件来发布消息. (1条消息) 使用mqtt.fx向E ...

  6. 18. 编写FTP客户端程序

    在实际应用中可能经常访问FTP服务器来上传或下载文件,Python也可以替我们做这些. [示例 1]下面请看一个例子(ftpclient). 运行的结果如下: FTP客户端程序的编写还可以参照官方文档 ...

  7. 13002.tcp客户端程序(python)

    文章目录 tcp 客户端程序 tcp 客户端程序 from socket import * import sys import structSERVER_IP="192.168.10.33& ...

  8. 使用Python+tkinter编写电脑桌面放大镜程序

    代码思路:首先全屏截图,然后在鼠标当前位置以小窗口进行二次截图,放大后再显示到鼠标左上角. 主要技术:全屏截图,指定区域截图,绑定鼠标事件,绘制图像. 建议大家照着代码敲一遍,然后运行试试.代码有一点 ...

  9. 物联网通信协议-MQTT及使用python实现

    MQTT概念及其原理 简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的& ...

  10. 用emqx做mqtt客户端

    最近项目中有一个需求,要用mqtt协议接收路侧设备的数据到云平台上,所以,研究了一下mqtt客户端的制作方法. mqtt协议是一个发布订阅模式的协议. 这篇文章主要记录下我搭建mqttbroker和写 ...

最新文章

  1. mac安装nvm及换源及node安装切换
  2. Android开发之自带阴影效果的shape
  3. 我的做题日志(1),来源:COCI2017,SDOJ
  4. c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...
  5. 让我们一起Go(九)
  6. vue2.x+springboot1.x+nginx服务器部署踩坑日记
  7. Jsp+Ssm+Mysql框架实现的手机WAP版外卖点餐系统
  8. linux多线程编程 实验,linux操作系统-实验五-linux 多线程编程.docx
  9. c语言scanf中输入根号2,C语言格式输入函数scanf()详解
  10. cmd控制台通过sftp命令下载服务器文件
  11. 在VS2010配置并运行PBC库程序
  12. Linux网络编程 - 在服务器端运用进程间通信之管道(pipe)
  13. debian/ubuntu 64bit 安装 android sdk时adb无法编译的问题
  14. 【项目小结】爬虫学习进阶:获取百度指数历史数据
  15. IOS(iphone,ipad,itouch)开发 之 屏幕旋转
  16. 通过左旋和右旋来实现搜索二叉树的自平衡
  17. UNIX网络套接字相关总结
  18. 多商户商城系统功能拆解07讲-平台端商品管理
  19. magento2 邮件模板中直接调用 block文件
  20. Proxmox VE 6.0管理指南——5.图形用户界面

热门文章

  1. mybatis和mybatis-plus存读数据库中的对象(对象转json与json转对象)
  2. smartadmin官网_smartadmin api_smartadmin 下载
  3. XP3 Dumper GUI
  4. Linux下libiconv库的安装和使用
  5. 思科命令配置使用方法介绍
  6. python记账app开发_Python之区块链简单记账本实现
  7. 《大数据技术原理与应用》—— 提纲
  8. adb重启或关机手机命令
  9. Window winload.efi 文件丢失解决方法
  10. 微信小程序模板消息推送