概述
python操作mqtt主要通过paho-mqtt 库实现,支持mqtt 3.1/ 3.1.1协议。
连接操作
Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport=“tcp”)
transport:设置为“websockets”通过WebSockets发送MQTT。 保留默认的“tcp”使用原始TCP。
代码示例
broker = '192.168.31.88'
port = 1883
topic = "/python/mqtt"
client_id = 'python-mqtt-{}'.format(random.randint(0, 1000))
# ClientId不能重复,也可不传入
client = mqtt.Client(client_id)
# 匿名登录不需要设置
client.username_pw_set("admin", "123456") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT, 60)
# 订阅主题
client.subscribe("test")
client.loop_forever()
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("test")
def on_message(client, userdata, msg):
print(msg.topic+" "+msg.payload.decode("utf-8"))
# 消息处理
def publich():
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print("Send `{}` to topic `{}`".format(msg,topic))
else:
print("Failed to send message to topic {}".format(topic)
可设置选项
ws_set_options(self, path="/mqtt", headers=None)
# 重发消息时间
message_retry_set(retry)
回调函数
on_connect()
on_disconnect()
on_message() 收到订阅消息时.
on_publish() 消息已传输到代理时被调用
on_subscribe()
on_unsubscribe()
on_log() 当客户端有日志信息时调用
维持与mqtt代理之间的连接
loop()
定期调用处理网络事件
loop(timeout=1.0, max_packets=1)
示例
run = True
while run:
client.loop()
loop_start()
在后台启动一个线程来自动调用loop()
调用loop_stop()来停止后台线程
client.connect("iot.eclipse.org")
client.loop_start()
loop_forever()
网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接。
loop_forever(timeout=1.0, max_packets=1, retry_first_connection=False)
消息发送
publish(topic, payload=None, qos=0, retain=False)
retain:是否是retain消息
订阅主题
subscribe(topic, qos=0)
订阅一个或多个主题。