Python - paho.mqtt.client - WebSocket握手错误,连接未升级

64jmpszr  于 2022-11-11  发布在  Python
关注(0)|答案(1)|浏览(480)

我正在尝试使用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中做错了什么?

6ie5vjzr

6ie5vjzr1#

我找到了这个解决方案,实际上很愚蠢。默认情况下,paho.mqtt.client使用/mqtt作为路径。在我的例子中,我需要根作为路径,所以我需要做的只是设置它:

client.ws_set_options(path="/")

来自服务的实际响应是404,但是库代码的编写方式将其识别为握手问题,因此实际的异常是误导性的。

相关问题