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]