Skip to content

Commit

Permalink
refactor: Discovery reply tool
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrapan committed Feb 10, 2025
1 parent 7d0227a commit f342d94
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
8 changes: 4 additions & 4 deletions tools/discovery.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import socket
import asyncio

DISCOVERY_IP = "255.255.255.255"
DISCOVERY_PORT = 48899
DISCOVERY_TIMEOUT = 1
DISCOVERY_MESSAGE = ["WIFIKIT-214028-READ".encode(), "HF-A11ASSISTHREAD".encode()]
DISCOVERY_TIMEOUT = 1

class DiscoveryProtocol:
def __init__(self, addresses):
Expand All @@ -13,7 +14,7 @@ def __init__(self, addresses):

def connection_made(self, transport):
self.transport = transport
print(f"DiscoveryProtocol: Send to {self.addresses}")
print(f"DiscoveryProtocol: Send {DISCOVERY_MESSAGE[0]} to {self.addresses}")
for address in self.addresses:
self.transport.sendto(DISCOVERY_MESSAGE[0], (address, DISCOVERY_PORT))

Expand All @@ -31,11 +32,10 @@ def connection_lost(self, _):

async def main():
loop = asyncio.get_running_loop()
addresses = ["255.255.255.255"]
wait = True

try:
transport, protocol = await loop.create_datagram_endpoint(lambda: DiscoveryProtocol(addresses), family = socket.AF_INET, allow_broadcast = True)
transport, protocol = await loop.create_datagram_endpoint(lambda: DiscoveryProtocol([DISCOVERY_IP]), family = socket.AF_INET, allow_broadcast = True)
r = None
while r is None or wait:
r = await asyncio.wait_for(protocol.responses.get(), DISCOVERY_TIMEOUT)
Expand Down
43 changes: 26 additions & 17 deletions tools/discovery_reply.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
import socket
import asyncio
import netifaces

if __name__ == '__main__':
DISCOVERY_IP = "0.0.0.0"
DISCOVERY_PORT = 48899
DISCOVERY_MESSAGE = ["WIFIKIT-214028-READ".encode(), "HF-A11ASSISTHREAD".encode()]

ifaces = netifaces.ifaddresses(netifaces.gateways()['default'][2][1])
iface_inet = ifaces[netifaces.AF_INET][0]
iface_link = ifaces[netifaces.AF_LINK][0]

class EchoServerProtocol:
def connection_made(self, transport):
self.transport = transport

ifaces = netifaces.ifaddresses(netifaces.gateways()['default'][2][1])
iface_inet = ifaces[netifaces.AF_INET][0]
iface_link = ifaces[netifaces.AF_LINK][0]
def datagram_received(self, data, addr):
if data == DISCOVERY_MESSAGE[0]:
print(f"DiscoveryProtocol: Received {data} from {addr}")
self.transport.sendto(f"{iface_inet["addr"]},{iface_link["addr"].replace(':', '').upper()},1234567890".encode(), addr)

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.settimeout(1)
s.bind(('', 48899))
async def main():
loop = asyncio.get_running_loop()
transport, _ = await loop.create_datagram_endpoint(EchoServerProtocol, local_addr = (DISCOVERY_IP, DISCOVERY_PORT), family = socket.AF_INET, allow_broadcast = True)

while True:
try:
m = s.recvfrom(1024)
d = m[0].decode()
if d == "WIFIKIT-214028-READ":
print(f"{m[0]} from {m[1]}")
data = f"{iface_inet["addr"]},{iface_link["addr"].replace(':', '').upper()},1234567890"
s.sendto(data.encode(), m[1])
except (TimeoutError, socket.timeout):
continue
try:
await asyncio.sleep(3600)
finally:
transport.close()

if __name__ == '__main__':
asyncio.run(main())

0 comments on commit f342d94

Please sign in to comment.