fix: 按 K-00 约定修复 Python SDK 断线重交与退避
This commit is contained in:
@@ -203,13 +203,21 @@ class PahoTransport:
|
||||
self.disconnect()
|
||||
url = params.url
|
||||
u = urlparse(url if "://" in url else "ws://" + url)
|
||||
use_tcp = params.use_tcp or u.scheme in ("mqtt", "mqtts")
|
||||
use_tcp = params.use_tcp
|
||||
scheme = u.scheme.lower()
|
||||
if scheme == "https":
|
||||
scheme = "wss"
|
||||
elif scheme == "http":
|
||||
scheme = "ws"
|
||||
if scheme in ("mqtt", "mqtts"):
|
||||
use_tcp = True
|
||||
# WebSocket 必须显式 transport=websockets;裸 TCP 走默认。
|
||||
client = PahoClient(
|
||||
callback_api_version=CallbackAPIVersion.VERSION2,
|
||||
client_id=params.client_id,
|
||||
protocol=MQTTv5,
|
||||
transport="tcp" if use_tcp else "websockets",
|
||||
reconnect_on_failure=False,
|
||||
)
|
||||
client.username_pw_set(params.username, params.password)
|
||||
client.on_connect = self._on_connect
|
||||
@@ -231,16 +239,14 @@ class PahoTransport:
|
||||
props = None
|
||||
if use_tcp:
|
||||
if not u.port:
|
||||
port = 8883 if u.scheme == "mqtts" else 1883
|
||||
if u.scheme == "mqtts":
|
||||
port = 8883 if scheme == "mqtts" else 1883
|
||||
if scheme == "mqtts":
|
||||
client.tls_set()
|
||||
else:
|
||||
path = u.path or "/mqtt"
|
||||
if not path.endswith("/mqtt"):
|
||||
path = path.rstrip("/") + "/mqtt"
|
||||
if not u.port:
|
||||
port = 443 if u.scheme == "wss" else 80
|
||||
if u.scheme == "wss":
|
||||
port = 443 if scheme == "wss" else 80
|
||||
if scheme == "wss":
|
||||
client.tls_set()
|
||||
client.ws_set_options(path=path, headers={"Sec-WebSocket-Protocol": "mqtt"})
|
||||
client.connect(
|
||||
@@ -309,11 +315,15 @@ class PahoTransport:
|
||||
if self._on_disconnected:
|
||||
self._on_disconnected(None, False)
|
||||
return
|
||||
# 0x8E = 142 Session taken over
|
||||
# 0x8E = 142 Session taken over;0x8B = 139 可重试
|
||||
if code == 142:
|
||||
if self._on_disconnected:
|
||||
self._on_disconnected("taken_over", True)
|
||||
return
|
||||
if code == 139:
|
||||
if self._on_disconnected:
|
||||
self._on_disconnected("network", False)
|
||||
return
|
||||
stop, reason = _classify_connack(code)
|
||||
if self._on_disconnected:
|
||||
self._on_disconnected(reason, stop)
|
||||
|
||||
Reference in New Issue
Block a user