Skip to content

Commit 56671f9

Browse files
committed
feat: Share mqtt url parsing code with original client
1 parent 6f49f61 commit 56671f9

File tree

3 files changed

+14
-21
lines changed

3 files changed

+14
-21
lines changed

roborock/cli.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from __future__ import annotations
22

3+
import asyncio
34
import json
45
import logging
56
from pathlib import Path
67
from typing import Any
7-
import asyncio
88

99
import click
1010
from pyshark import FileCapture # type: ignore
@@ -13,10 +13,9 @@
1313

1414
from roborock import RoborockException
1515
from roborock.containers import DeviceData, HomeDataProduct, LoginData
16+
from roborock.mqtt.roborock_session import create_mqtt_session
1617
from roborock.protocol import MessageParser, create_mqtt_params
1718
from roborock.util import run_sync
18-
from roborock.mqtt.session import MqttParams, MqttSession
19-
from roborock.mqtt.roborock_session import create_mqtt_session
2019
from roborock.version_1_apis.roborock_local_client_v1 import RoborockLocalClientV1
2120
from roborock.version_1_apis.roborock_mqtt_client_v1 import RoborockMqttClientV1
2221
from roborock.web_api import RoborockApiClient
@@ -130,7 +129,6 @@ def on_message(bytes: bytes):
130129
await mqtt_session.close()
131130

132131

133-
134132
async def _discover(ctx):
135133
context: RoborockContext = ctx.obj
136134
login_data = context.login_data()

roborock/cloud_api.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
from abc import ABC
77
from asyncio import Lock
88
from typing import Any
9-
from urllib.parse import urlparse
109

1110
import paho.mqtt.client as mqtt
1211

1312
from .api import KEEPALIVE, RoborockClient
1413
from .containers import DeviceData, UserData
1514
from .exceptions import RoborockException, VacuumError
16-
from .protocol import MessageParser, md5hex
15+
from .protocol import MessageParser, create_mqtt_params
1716
from .roborock_future import RoborockFuture
1817

1918
_LOGGER = logging.getLogger(__name__)
@@ -53,25 +52,20 @@ def __init__(self, user_data: UserData, device_info: DeviceData) -> None:
5352
if rriot is None:
5453
raise RoborockException("Got no rriot data from user_data")
5554
RoborockClient.__init__(self, device_info)
55+
mqtt_params = create_mqtt_params(rriot)
5656
self._mqtt_user = rriot.u
57-
self._hashed_user = md5hex(self._mqtt_user + ":" + rriot.k)[2:10]
58-
url = urlparse(rriot.r.m)
59-
if not isinstance(url.hostname, str):
60-
raise RoborockException("Url parsing returned an invalid hostname")
61-
self._mqtt_host = str(url.hostname)
62-
self._mqtt_port = url.port
63-
self._mqtt_ssl = url.scheme == "ssl"
57+
self._hashed_user = mqtt_params.username
58+
self._mqtt_host = mqtt_params.host
59+
self._mqtt_port = mqtt_params.port
6460

6561
self._mqtt_client = _Mqtt()
6662
self._mqtt_client.on_connect = self._mqtt_on_connect
6763
self._mqtt_client.on_message = self._mqtt_on_message
6864
self._mqtt_client.on_disconnect = self._mqtt_on_disconnect
69-
if self._mqtt_ssl:
65+
if mqtt_params.tls:
7066
self._mqtt_client.tls_set()
7167

72-
self._mqtt_password = rriot.s
73-
self._hashed_password = md5hex(self._mqtt_password + ":" + rriot.k)[16:]
74-
self._mqtt_client.username_pw_set(self._hashed_user, self._hashed_password)
68+
self._mqtt_client.username_pw_set(mqtt_params.username, mqtt_params.password)
7569
self._waiting_queue: dict[int, RoborockFuture] = {}
7670
self._mutex = Lock()
7771

roborock/protocol.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333

3434
from roborock.containers import BroadcastMessage, RRiot
3535
from roborock.exceptions import RoborockException
36-
from roborock.roborock_message import RoborockMessage
3736
from roborock.mqtt.session import MqttParams
37+
from roborock.roborock_message import RoborockMessage
3838

3939
_LOGGER = logging.getLogger(__name__)
4040
SALT = b"TXdfu$jyZ#TZHsg4"
@@ -364,13 +364,14 @@ def build(
364364
BroadcastParser: _Parser = _Parser(_BroadcastMessage, False)
365365

366366

367-
368367
def create_mqtt_params(rriot: RRiot) -> MqttParams:
369368
"""Return the MQTT parameters for this user."""
370369
url = urlparse(rriot.r.m)
371370
if not isinstance(url.hostname, str):
372-
raise RoborockException("Url parsing returned an invalid hostname")
373-
hashed_user = md5hex(rriot.u + ":" + rriot.k)[2:10]
371+
raise RoborockException(f"Url parsing '{rriot.r.m}' returned an invalid hostname")
372+
if not url.port:
373+
raise RoborockException(f"Url parsing '{rriot.r.m}' returned an invalid port")
374+
hashed_user = md5hex(rriot.u + ":" + rriot.k)[2:10]
374375
hashed_password = md5hex(rriot.s + ":" + rriot.k)[16:]
375376
return MqttParams(
376377
host=str(url.hostname),

0 commit comments

Comments
 (0)