Skip to content

Commit e5d71d8

Browse files
fix: port already in use
1 parent 2beb923 commit e5d71d8

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

roborock/protocol.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import hashlib
77
import json
88
import logging
9-
from asyncio import BaseTransport
9+
from asyncio import BaseTransport, Lock
1010
from typing import Callable
1111

1212
from construct import (
@@ -43,20 +43,27 @@ class RoborockProtocol(asyncio.DatagramProtocol):
4343
def __init__(self, timeout: int = 5):
4444
self.timeout = timeout
4545
self.transport: BaseTransport | None = None
46-
self.devices_found: list[dict] = []
46+
self.devices_found: dict = {}
47+
self._mutex = Lock()
48+
49+
def __del__(self):
50+
self.close()
4751

4852
def datagram_received(self, data, _):
4953
[broadcast_message], _ = BroadcastParser.parse(data)
50-
self.devices_found.append(json.loads(broadcast_message.payload))
54+
parsed_message = json.loads(broadcast_message.payload)
55+
self.devices_found[parsed_message.get("duid")] = parsed_message.get("ip")
5156

5257
async def discover(self):
53-
loop = asyncio.get_event_loop()
54-
self.transport, _ = await loop.create_datagram_endpoint(lambda: self, local_addr=("0.0.0.0", 58866))
55-
await asyncio.sleep(self.timeout)
56-
self.transport.close()
57-
devices_found = self.devices_found
58-
self.devices_found = []
59-
return devices_found
58+
async with self._mutex:
59+
try:
60+
loop = asyncio.get_event_loop()
61+
self.transport, _ = await loop.create_datagram_endpoint(lambda: self, local_addr=("0.0.0.0", 58866))
62+
await asyncio.sleep(self.timeout)
63+
return self.devices_found
64+
finally:
65+
self.close()
66+
self.devices_found = {}
6067

6168
def close(self):
6269
self.transport.close() if self.transport else None

0 commit comments

Comments
 (0)