python中基于websocket的MQTT

Smi*_*iya 4 python websocket mqtt paho iot

python 中是否有任何支持订阅 8080 端口的 mqtt 代理

 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()
Run Code Online (Sandbox Code Playgroud)

我无法连接此代码。Mosquitto 在 8080 端口有 websocket 支持,但这个 paho 库不支持它。python的任何解决方案?我在 Windows 10 上使用 python 2.7。

Fl0*_*0v0 11

Paho MQTT 模块几天前引入了 websocket 支持。我认为它还没有发布,但是您可以使用从 Linux 分支下的 master 安装

pip install git+git://github.com/eclipse/paho.mqtt.python.git
Run Code Online (Sandbox Code Playgroud)

也适用于windows。(感谢评论中的信息)

您可以通过连接使用 websockets 作为传输

mqttc = mqtt.Client(transport="websockets")
Run Code Online (Sandbox Code Playgroud)

更新:

如果你尝试在 python 客户端使用 websocket 协议,因为你还需要连接浏览器客户端(例如 MQTT.js),那么你也可以配置 mosquitto 来监听websockets和普通的mqtt 协议

只需创建一个配置文件,例如

/etc/mosquitto/mosquitto.conf
Run Code Online (Sandbox Code Playgroud)

内容如下:

listener 1883
protocol mqtt

listener 9001
protocol websockets
Run Code Online (Sandbox Code Playgroud)

然后你可以运行 mosquitto

mosquitto -c /etc/mosquitto/mosquitto.conf
Run Code Online (Sandbox Code Playgroud)

您应该会看到类似的输出:

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.
Run Code Online (Sandbox Code Playgroud)

然后你的 python 客户端连接到端口 1883,浏览器客户端连接到 9001

您可以使用what-mqtt 浏览器客户端来测试 websocket 侦听器。只需指向它ws://localhost:9001


min*_*hua 6

从 2 月至今,paho.mqtt.python 代码库已得到修复。只需按照 Fl0v0 的建议添加transport='websockets',就可以了。以下是订阅 下所有内容或所有内容的完整代码$SYS/。测试的代码位于e56f9132016 年 6 月 3 日提交哈希的 master 分支上。

#!/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()
Run Code Online (Sandbox Code Playgroud)

更新:上面的代码在 Windows 7 上不起作用,我通过从 Cygwin 的一个版本(但不是 cygwin python)进行测试,使用了 python 2.7.6。没有任何主题"#""$SYS/#"返回任何已发布的消息。

相反,发布或订阅实体主题的方式如下所示。修补 paho.mqtt.pythonexamples/pub-single.pyexamples/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')
Run Code Online (Sandbox Code Playgroud)

补丁到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')
Run Code Online (Sandbox Code Playgroud)