50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
from time import time
|
|
from socket import socket
|
|
from socket import AF_INET
|
|
from socket import SOCK_DGRAM
|
|
from socket import IPPROTO_UDP
|
|
from socket import SOL_SOCKET
|
|
from socket import SO_REUSEADDR
|
|
from socket import SO_BROADCAST
|
|
|
|
|
|
DISCOVERY_ACK = 'IP_DISCOVERY_ACK'.encode() # ACK for broadcast
|
|
DISCOVERY_OK = 'IP_DISCOVERY_OK'.encode() # Not used yet
|
|
DISCOVERY_RSP_GTW = 'IP_DISCOVERY_RSP_GTW'.encode() # RSP for gateway
|
|
DISCOVERY_RSP_MSH = 'IP_DISCOVERY_RSP_MSH'.encode() # RSP for mesh
|
|
DISCOVERY_TIMEOUT = 0.5
|
|
SOCKET_TIMEOUT = 0.2
|
|
PORT_SERVER = 9434
|
|
PORT_CLIENT = 9435
|
|
|
|
|
|
def start_discovery_client():
|
|
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
|
|
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
|
sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
|
|
sock.settimeout(SOCKET_TIMEOUT)
|
|
server_address = ('255.255.255.255', PORT_SERVER)
|
|
start_time_stamp = time()
|
|
delta = round(time() - start_time_stamp, 2)
|
|
discovered_devices = []
|
|
|
|
try:
|
|
sock.bind(('', PORT_CLIENT))
|
|
|
|
while delta <= DISCOVERY_TIMEOUT:
|
|
delta = round(time() - start_time_stamp, 2)
|
|
sock.sendto(DISCOVERY_ACK, server_address)
|
|
data, addr = sock.recvfrom(4096)
|
|
|
|
if str(addr[0]) in discovered_devices: continue
|
|
if data == DISCOVERY_RSP_GTW:
|
|
discovered_devices.append(str(addr[0]))
|
|
|
|
except Exception as err:
|
|
print(err)
|
|
|
|
finally:
|
|
sock.close()
|
|
return discovered_devices[0]
|
|
|