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)

Другие вопросы по тегам