概要
此次分享的是使用python去实现mqtt通信。mqtt通信在物联网当中应用很广泛。如图所示为MQTT简单的概括总结。
每个客户端都可以成为消息的发布者或者订阅者,实现设备之间的互相通信。
1、paho-mqtt安装
这边建议使用1.6.1版本,版本过高的话,会出现一些报错。
pip install paho-mqtt==1.6.1
2、Apollo服务(搭建服务器)
2.1 下载apache-apollo
apache-apollo-1.7.1-windows-distro.zip
链接:https://pan.baidu.com/s/1z1Hr8t9vtaq_9jGCyY1XpA?pwd=1122
提取码:1122
通过以上链接下载该文件,并解压。
注:这个服务的运行需要电脑有java环境,建议提前弄好java环境,jdk最好是1.8的,这样比较不会报错,不然容易出现一些奇奇怪怪的报错问题。
2.2 创建服务
1)打开cmd 使用命令cd 进入到 apache-apollo-1.7.1\bin的目录(根据自己解压的路径选择)
C:\Users\lai>cd C:\Users\lai\Downloads\apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin
2)在1)的基础上 输入命令"apollo.cmd creat test"
3)在上一步的基础上,进入我们新建立的这个名称为test的文件夹(也可以在第一步的解压路径可以看到)
4)重复上述操作,进入到test文件夹的bin文件夹(这里就不贴图了)
5)运行bin文件夹里面的 'apollo-broker.cmd '文件,有如同下图所示,就说明开启成功了
6)后台连接控制
7)会显示如下页面:账号是admin 密码是password
8)这样我们的后台服务就算启动了,这时候可以先放着,也可以每个功能点一点,熟悉一下。
3、python代码
为了方便理解,我先分为一个发布者,一个订阅者,分两部分,创建两个.py文件。
3.1 发布者部分
发布者(publish),调用函数publish(),该函数有5个参数,topic(主题)、payload(消息体)、qos(网络服务质量)、retain(数据是否保留)、properties(消息的属性)
topic(主题):发布的消息属于哪个主题,这样订阅该主题的客户端才可以收到发布的消息
payload(消息体):这次发布的消息的主要内容
qos(网络服务质量):一般为0即可
retain(数据是否保留):看具体的应用需求,为False还是True
properties(消息的属性):消息体的属性。比如,发送的消息是文本或者是二进制或者是其他数 据类型
在以上的5个参数当中,其中topic、payload这两个是必须要配置的,其余的三个看具体应用情况。
3.1.1 引入库
import paho.mqtt.client as mqtt
3.1.2 实例化mqtt对象
client = mqtt.Client(client_id="1")
注:client_id这个参数这边写死为1,可以加一个random函数,使得其为随机。
3.1.3 回调函数
on_connect():在客户连接到MQTT broke的时候被调用;
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("连接成功")
print("Connected with result code " + str(rc))
on_publis():在客户端发送消息的时候被调用;
注:以上的代码很简洁,只是为了学习使用,在应用当中,可根据具体的业务需求做相对应的处理。
3.1.4 账号密码设置
client.username_pw_set("admin", "password")
username_pw_set函数有两个参数:username和password,就是连接上broke的账户和密码,本次的服务使用Apollo,所以账号和密码就是和上面的一致。
3.1.5 连接
client.connect(host="127.0.0.1", port=61613, keepalive=60)
连接使用connect函数,host参数为ip地址,port是对应的端口号,keeplive是保持连接间隔,若在60s内没有收到来自发布者的消息,则默认退出连接。
3.1.6 发布函数
client.publish(topic="Top", payload=data, qos=0)
topic的主题名称要我们自己去定义,payload是发送消息的内容,这些在上面都已经提到
3.1.7 完整代码
import paho.mqtt.client as mqtt
import time
import sys
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
def on_publish(self,one,two):
print("消息发送成功")
client = mqtt.Client(client_id="1")
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_publish= on_publish
client.connect(host="127.0.0.1", port=61613, keepalive=60) # 订阅频道
time.sleep(1)
i = 0
while True:
data = "message" + str(i)
client.publish(topic="Top", payload=data, qos=0)
time.sleep(5)
i += 1
if(i == 100):
print("发送了100条消息了,退出")
client.disconnect()
3.2 订阅者部分
订阅者(subscribe),调用函数subscribe(),该函数有5个参数,topic(主题)、payload(消息体)、qos(网络服务质量)、retain(数据是否保留)、properties(消息的属性)
*参数详情请参看3.1
*引入库、实例化mqtt对象、账号密码设置、连接部分对应3.1.1、3.1.2、3.1.4、3.1.5,可以自行对照查看。
3.2.1 回调函数
on_connect():在连接上服务器的时候调用
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("连接成功")
print("Connected with result code " + str(rc))
on_message():在收到消息的时候被调用
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
3.2.2 接收函数
client.subscribe(topic="Top")
主题要与发布者一致!!!!
3.2.3 完整代码
import time
import paho.mqtt.client as mqtt
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="127.0.0.1", port = 61613, keepalive=60) # 订阅频道
time.sleep(1)
client.subscribe(topic="Top")
client.loop_forever()
* 最后调用loop_forever()是为了使得可以一致保持接收信息的状态
3.3 运行结果
发布端:
接收端:
代理服务器可以看到两个客户端的流量情况和连接情况
4、写在最后
以上就是通过python实现mqtt的一个简要过程和例子,若有什么不正确的地方,欢迎批评指正。
最后祝各位看官身体健康,发大财!!!(鞠躬)