MQTT через веб-сокет в Python
Есть ли поддержка в Python для подписки на брокера mqtt с портом 8080
import sys
import paho.mqtt.client as mqtt
def on_connect(mqttc, obj, flags, rc):
print("rc: "+str(rc))
def on_message(mqttc, obj, msg):
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
def on_publish(mqttc, obj, mid):
print("mid: "+str(mid))
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def on_log(mqttc, obj, level, string):
print(string)
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
mqttc.connect("test.mosquitto.org", 8080, 60)
mqttc.subscribe("test/iot", 0)
mqttc.loop_forever()
я не могу соединиться с этим кодом. Mosquitto имеет поддержку websocket на порте 8080, но эта библиотека Paho не работает для него. любое решение для питона? Я использую Python 2.7 на Windows 10.
3 ответа
Модуль Paho MQTT представил поддержку websocket несколько дней назад. Я не думаю, что он выпущен, но вы можете установить с мастера под ветку Linux, используя
pip install git+git://github.com/eclipse/paho.mqtt.python.git
Также работает под окнами. (Спасибо за информацию из комментариев)
Вы можете использовать веб-сокеты в качестве транспорта, соединяясь с
mqttc = mqtt.Client(transport="websockets")
ОБНОВИТЬ:
Если вы попытаетесь использовать протокол websocket с клиентом python, поскольку вам также необходимо подключить клиент браузера (например, MQTT.js), вы также можете настроить mosquitto для прослушивания websockets и обычного протокола mqtt.
Просто создайте файл конфигурации, например, в
/etc/mosquitto/mosquitto.conf
со следующим содержанием:
listener 1883
protocol mqtt
listener 9001
protocol websockets
Затем вы можете запустить комар с
mosquitto -c /etc/mosquitto/mosquitto.conf
Вы должны увидеть похожий вывод:
1469015320: mosquitto version 1.4.8 (build date 2016-05-3112:07:40+0200) starting
1469015320: Config loaded from /etc/mosquitto/mosquitto1.conf.
1469015320: Opening ipv4 listen socket on port 1883.
1469015320: Opening ipv6 listen socket on port 1883.
1469015320: Opening websockets listen socket on port 9001.
Ваш клиент Python затем подключается к порту 1883, а клиент браузера к 9001
Вы можете использовать клиент браузера what-mqtt для проверки прослушивателя websocket. Просто укажите это ws://localhost:9001
С февраля по настоящее время исправлена кодовая база paho.mqtt.python. Просто добавь transport='websockets'
как предложил Fl0v0, это просто работает. Ниже приведен полный код, который подписывается на все или все под $SYS/
, Тестируемый код находится в основной ветке с хэшем коммита e56f913
3 июня 2016 года.
#!/usr/bin/python
import sys
import paho.mqtt.client as mqtt
def on_connect(mqttc, obj, flags, rc):
print("rc: "+str(rc))
def on_message(mqttc, obj, msg):
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
def on_publish(mqttc, obj, mid):
print("mid: "+str(mid))
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def on_log(mqttc, obj, level, string):
print(string)
mqttc = mqtt.Client(transport='websockets')
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
mqttc.connect("test.mosquitto.org", 8080, 60)
mqttc.subscribe("#", 0)
#mqttc.subscribe("$SYS/#", 0)
mqttc.loop_forever()
Обновление: приведенный выше код не работает в Windows 7 с python 2.7.6, на котором я тестировал, используя одну версию Cygwin (но не cygwin python). Нет темы "#"
или же "$SYS/#"
возвращает любое опубликованное сообщение.
Вместо этого паб или подчиненные темы работают следующим образом. Патч paho.mqtt.python examples/pub-single.py
а также examples/sub-simple.py
, Тогда беги sub-simple.py
в одном терминале. Бежать pub-single.py
в другом терминале, дважды. Абонентский терминал распечатает два сообщения, опубликованные издателем.
Патч к examples/pub-single.py
:
-publish.single("paho/test/single", "boo", hostname="test.mosquitto.org")
+publish.single("/HelloWorld", "boo", hostname="test.mosquitto.org",
+ port=8080, transport='websockets')
Патч к examples/sub-simple.py
:
-topics = ['#']
+topics = ['/HelloWorld']
-m = subscribe.simple(topics, hostname="iot.eclipse.org", retained=False, msg_count=2)
+m = subscribe.simple(topics, hostname="test.mosquitto.org",
+ retained=False, msg_count=2,
+ port=8080, transport='websockets')
Нет, Python-версия библиотеки Paho не поддерживает MQTT через Websockets.
На самом деле я считаю, что единственной нативной клиентской (не в браузере) библиотекой MQTT, которая поддерживает MQTT через Websockets, является модуль NodeJS ( https://www.npmjs.com/package/mqtt)