使⽤python实现MQTT通信
MQTT 是⼀种基于发布/订阅模式的 轻量级物联⽹消息传输协议,由IBM在1999年发布。MQTT最⼤优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为⼀种低开销、低带宽占⽤的即时通讯协议,使其在物联⽹、⼩型设备、移动应⽤等⽅⾯有较⼴泛的应⽤。
MQTT特点
1. 使⽤发布/订阅消息模式,提供⼀对多的消息发布,解除应⽤程序耦合。该协议需要客户端和服务端,⽽协议中主要有三种⾝份:发布者(Publisher)、代理(Broker,服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,⽽消息发布者可以同时是订阅者,实现了⽣产者与消费者的脱耦;
2. 对负载内容屏蔽的消息传输;
3. 使⽤ TCP/IP 提供⽹络连接;
4. 有三种消息发布服务质量:
a) “⾄多⼀次”,消息发布完全依赖底层 TCP/IP ⽹络。会发⽣消息丢失或重复。这⼀级别可⽤于如下情况,环境传感器数据,丢失⼀次读记录⽆所谓,因为不久后还会有第⼆次发送。
b) “⾄少⼀次”,确保消息到达,但消息重复可能会发⽣。
c) “只有⼀次”,确保消息到达⼀次。这⼀级别可⽤于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5. ⼩型传输,开销很⼩(固定长度的头部是 2 字节),协议交换最⼩化,以降低⽹络流量;
6. 使⽤ Last Will 和 Testament 特性通知有关各⽅客户端异常中断的机制。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种⾝份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
发布者发送消息到代理服务器,服务器转发消息到订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
(2)payload,可以理解为消息的内容,是指订阅者具体要使⽤的内容。
MQTT⼴泛应⽤于物联⽹、移动互联⽹、智能硬件、车联⽹、电⼒能源等⾏业。下⾯我们在Python 项⽬中使⽤ paho-mqtt 客户端库 ,实现客户端与 MQTT 服务器的连接、订阅、收发消息等功能,
由于⽬前没有物联⽹设备,就在linux虚拟机中获取服务器cpu,磁盘,内存等信息来模拟获取物联⽹设备信息的消息发布与订阅功能。
搭建开发环境 创建/root/mymqtt 为项⽬根⽬录
⾸先搭建MQTT代理服务器,我们使⽤EMQX来做MQTT代理服务器。
1. 下载 emqx-centos7-4.
2.7-x86_64.zip ⽂件到mymqtt⽬录中
wget qx/downloads/broker/v4.2.7/emqx-centos7-4.2.7-x86_64.zip
2. 安装
unzip emqx-centos7-4.2.7-x86_64.zip
3. 启动MQTT代理服务器
./emqx/bin/emqx start
4. 验证代理服务器是否正常运⾏
ps aux | grep emqx
image.png 可以看到EMQX已经在运⾏了,MQTT代理服务器搭建成功。
搭建python环境,在mymqtt⽬录下创建mypy⽬录为python项⽬根⽬录
image.png 1. 使⽤pyenv 搭建python虚拟环境,并安装依赖包psutil和paho-mqtt
image.png 2. 消息发布代码
⽂件名:mypub.py
#!/usr/bin/env python
emqx broker
#coding:utf-8
import time
import json
import psutil
import random
from paho.mqtt import client as mqtt_client
broker = '127.0.0.1'  # mqtt代理服务器地址
port = 1883
keepalive = 60    # 与代理通信之间允许的最长时间段(以秒为单位)
topic = "/python/mqtt"  # 消息主题
client_id = f'python-mqtt-pub-{random.randint(0, 1000)}'  # 客户端id不能重复
def to_M(n):
'''将B转换为M'''
u = 1024 * 1024
m = round(n / u, 2)
return m
def get_info():
5. 打开第⼆个命令⾏窗⼝,进⼊虚拟环境,启动订阅者
image.png
可以看到订阅者启动成功,并接受到了发布者发布的消息。
⾄此,我们完成了使⽤ paho-mqtt 客户端连接到 本地MQTT 服务器并实现了测试客户端与 MQTT 服务器的连接、消息发布和订阅。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。