服务器是阿里云的ubuntu服务器建立的mosquitto MQTT服务器
使用的库为paho
安装方式
pip install paho-mqtt
我们使用的是这个库的客户端
import paho.mqtt.client as mqtt
一般使用流程:
使用connect连接MQTT服务器
调用loop来维持客户端与服务器的通信
用loop_start()设置一个线程为之调用
用循环函数loop_forever()一直调用loop
使用subscribe()订阅主题并接受消息
使用publish()来发送主题消息
使用disconnect()断开与MQTT服务器的连接
回调:
连接
当服务器响应客户端的请求时,调用这个函数并返回状态码,RC就是状态码
def on_connect(client,userdata,flag,rc):
print("connect returnd" + str(rc))
0 -连接成功
1 -协议版本错误
2 -无效的客户端
3 -服务器无法使用
4 -密码错误/账户
5 -未经授权
使用回调函数处理MQTT服务器返回的数据,使用之前你需要定义这个函数,并且要将这个函数的位置告诉客户端
断开
在与客户端断开连接时使用
def on_disconnect(client, userdata, rc):
RC就是断开状态码。
消息接受处理
相当于如果有中断处理函数,比如闹钟响了那么你要知道该干嘛。消息收到了的处理函数
on_message(client, userdata, message):
消息内容包含主题和主题内容message.tobic和message.payload
发送主题被送到
on_publish(client, userdata, mid):
当使用publish()发送相关主题和内容到服务器时,盗用此函数
对于Qos级别为1和2的消息,这意味着已经完成了与代理的握手。
对于Qos级别为0的消息,这只意味着消息离开了客户端。
mid变量与从相应的publish()返回的mid变量匹配,以允许跟踪传出的消息。
服务器同意客户端请求
on_subscribe(client, userdata, mid, granted_qos):
mid变量匹配从相应的subscri be()返回的mid变量。
‘granted_qos’变量是一个整数列表,它提供了代理为每个不同的订阅请求授予的QoS级别。
客户端取消订阅
on_unsubscribe(client, userdata, mid):
mid匹配从相应的unsubscribe()调用返回的中间变量。
构造一个客户端
import paho.mqtt.client as mqtt
client = mqtt.Client()
重启将客户端重置为其开始状态,就像它刚刚创建一样。 它采用与Client()构造函数相同的参数。
client.reinitialise()
连接服务器
client.connect(host, port=1883, keepalive=60, bind_address="")
传入
主机地址、端口号、最大连接缓冲时间(以秒为单位)、假设存在多个接口,将绑定此客户端的本地网络接口的IP地址
重新连接
client.reconnect()
使用之前联机的提供的地址等、重新连接服务器;必须使用一次connect才可用
断开连接
client.disconnect()
完全的从服务器断开与本地的连接。使用此函数将导致服务器不会发送遗嘱函数
处理网络数据
run = True
while run:
client.loop()
client.loop(timeout=1.0, max_packets=1)
此调用在select()中等待,直到网络套接字可用于读取或写入(如果适用),然后处理传入/传出数据
网络循环的线程接口
loop_start()
loop_stop()
在connect*()之前或之后调用loop_start()一次,会在后台运行一个线程来自动调用loop()。这释放了可能阻塞的其他工作的主线程。这个调用也处理重新连接到服务器。
调用loop_stop()来停止后台线程
client.connect("iot.eclipse.org")
client.loop_start()
while True:
temperature = sensor.blocking_read()
client.publish("paho/temperature", temperature)
重复扫描
这是网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接
loop_forever(timeout=1.0, max_packets=1, retry_first_connection=False)
除了使用connect_async时的第一次连接尝试以外,请使用retry_first_connection = True使其重试第一个连接。这可能会导致客户端连接到一个不存在的主机的情况。
发送主题消息
从客户端发送消息给服务器
publish(topic, payload=None, qos=0, retain=False)
主题、内容、服务质量级别、如果设置为True,则该消息将被设置为该主题的“最后已知良好”/保留的消息
订阅一个/多个主题
subscribe(topic, qos=0)
有三种调用方式
(1)字符串、整数
subscribe("topic", 2)
topic 一个字符串,指定要订阅的订阅主题
qos 期望的服务质量等级。 默认为0。
(2)字符串和整数元组
subscribe(("topic", 1))
传入(topic,qos)的元组。 传入的topic和qos的元组形式
qos 没有使用
(3)字符串和整数元组的列表【多个订阅】
这允许在单个SUBSCRIPTION命令中使用多个主题订阅,这比使用多个订阅subscribe()更有效。
subscribe([("my/topic", 0), ("another/topic", 2)])
topic 格式元组列表(topic,qos)。 topic和qos都必须出现在所有的元组中。
qos 没有使用
用完后返回(result,mid)
注意
如果qos不是0,1或2,或者主题为None或字符串长度为零,或者topic不是字符串,元组或列表,则引发ValueError。
取消一个/多个订阅
unsubscribe(topic)
主题的单个字符串或者字符串列表
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("chat")#订阅一个主题为chat
def on_message(client, userdata, msg):
print(msg.topic+" " + ":" + str(msg.payload))
client = mqtt.Client()#创建一个客户端
client.on_connect = on_connect#连接时调用的函数
client.on_message = on_message#消息订阅后返回时指向处理函数
client.connect("101.122.125.40", 1883, 10)#连接到相应的客户端
print(1)
type(client.loop_forever())#循环的与服务通信