我正在尝试使用paho.mqtt.client
连接到一个现有的MQTT服务(通过websockets),该服务不是由我管理的。
这是我的代码:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("$SYS/#")
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client(client_id="<MY_CLIENT_ID>", transport="websockets")
client.username_pw_set(username="<MY_USERNAME>",password="<MY_PASSWORD>")
client.on_connect = on_connect
client.on_message = on_message
client.tls_set()
client.connect("SERVER_ADDRESS", SERVER_PORT, 55)
client.loop_forever()
当我尝试运行它时,我得到了以下异常
Traceback (most recent call last):
File "C:\Development\CockpitHomePyScript\test.py", line 24, in <module>
client.connect("SERVER_ADDRESS", 5222, 55)
File "C:\Users\Ophir\AppData\Local\Programs\Python\Python310\lib\site-packages\paho\mqtt\client.py", line 914, in connect
return self.reconnect()
File "C:\Users\Ophir\AppData\Local\Programs\Python\Python310\lib\site-packages\paho\mqtt\client.py", line 1080, in reconnect
sock = WebsocketWrapper(sock, self._host, self._port, self._ssl,
File "C:\Users\Ophir\AppData\Local\Programs\Python\Python310\lib\site-packages\paho\mqtt\client.py", line 3713, in __init__
self._do_handshake(extra_headers)
File "C:\Users\Ophir\AppData\Local\Programs\Python\Python310\lib\site-packages\paho\mqtt\client.py", line 3766, in _do_handshake
raise WebsocketConnectionError(
paho.mqtt.client.WebsocketConnectionError: WebSocket handshake error, connection not upgraded
当我在网上搜索的时候,我唯一发现的是在connect
之前有tls_set
,但这似乎没有帮助...
为了确保我没有丢失任何用于连接的客户端证书,我尝试使用.NET(使用MQTT.NET库)编写一个连接到同一服务器的客户端,该客户端具有完全相同的详细信息,并且除了上面的设置之外,没有设置任何其他特殊设置。我成功地连接、使用事件并发送消息。
我在Python中做错了什么?
1条答案
按热度按时间6ie5vjzr1#
我找到了这个解决方案,实际上很愚蠢。默认情况下,
paho.mqtt.client
使用/mqtt
作为路径。在我的例子中,我需要根作为路径,所以我需要做的只是设置它:来自服务的实际响应是404,但是库代码的编写方式将其识别为握手问题,因此实际的异常是误导性的。