@@ -32,47 +32,71 @@ def discover_controllers(self) -> [Controller]:
32
32
"""
33
33
discovered_controllers = []
34
34
35
- cs = socket .socket (AF_INET , SOCK_DGRAM )
36
- cs .setsockopt (SOL_SOCKET , SO_REUSEADDR , 1 )
37
- cs .setsockopt (SOL_SOCKET , SO_BROADCAST , 1 )
35
+ # use discovery multiple times as controllers sometimes just don't respond
36
+ for i in range (3 ):
37
+ discovered_controllers = self .__merge_controllers (
38
+ self ._discover_controllers (),
39
+ discovered_controllers )
38
40
39
- # send a local broadcast via udp with a "magic packet"
40
- cs .sendto (self ._discovery_message , ('255.255.255.255' , self ._discovery_port ))
41
+ return discovered_controllers
41
42
42
- cs .setblocking (True )
43
- cs .settimeout (1 )
44
- received_messages = []
45
- try :
46
- while True :
47
- data , address = cs .recvfrom (4096 )
48
- received_messages .append (data .decode ())
43
+ @staticmethod
44
+ def __merge_controllers (new , old ) -> [Controller ]:
45
+ merged = set (new )
46
+ merged .update (old )
49
47
50
- except socket .timeout :
51
- if len (received_messages ) <= 0 :
52
- return discovered_controllers
48
+ return list (merged )
53
49
54
- for message in received_messages :
55
- try :
56
- # parse received message
57
- data = str .split (message , "," )
50
+ def _discover_controllers (self ) -> [Controller ]:
51
+ """
52
+ Internally used discovery method
53
+ :return: list of discovered devices
54
+ """
55
+
56
+ discovered_controllers = []
57
+ with socket .socket (AF_INET , SOCK_DGRAM ) as cs :
58
+ cs .setsockopt (SOL_SOCKET , SO_REUSEADDR , 1 )
59
+ cs .setsockopt (SOL_SOCKET , SO_BROADCAST , 1 )
58
60
59
- # check validity
60
- if len (data ) == 3 :
61
- # extract data
62
- ip = data [0 ]
63
- hw_id = data [1 ]
64
- model = data [2 ]
61
+ # send a local broadcast via udp with a "magic packet"
62
+ cs .sendto (self ._discovery_message , ('255.255.255.255' , self ._discovery_port ))
65
63
66
- # create a Controller object representation
67
- controller = Controller (self , ip , Controller .DEFAULT_PORT , hw_id , model )
68
- print (controller )
64
+ cs .setblocking (True )
65
+ cs .settimeout (1 )
66
+ received_messages = []
67
+ try :
68
+ while True :
69
+ data , address = cs .recvfrom (4096 )
70
+ received_messages .append (data .decode ())
71
+
72
+ except socket .timeout :
73
+ if len (received_messages ) <= 0 :
74
+ return []
69
75
70
- discovered_controllers .append (controller )
76
+ for message in received_messages :
77
+ try :
78
+ controller = self ._parse_discovery_response (message )
79
+ discovered_controllers .append (controller )
71
80
except :
72
81
print ("Error parsing discovery message: %s" % message )
82
+ return None
73
83
74
84
return discovered_controllers
75
85
86
+ def _parse_discovery_response (self , message : str ) -> Controller or None :
87
+ # parse received message
88
+ data = str .split (message , "," )
89
+
90
+ # check validity
91
+ if len (data ) == 3 :
92
+ # extract data
93
+ ip = data [0 ]
94
+ hw_id = data [1 ]
95
+ model = data [2 ]
96
+
97
+ # create a Controller object representation
98
+ return Controller (self , ip , Controller .DEFAULT_PORT , hw_id , model )
99
+
76
100
def get_time (self , host : str , port : int ) -> datetime :
77
101
"""
78
102
Receives the current time of the specified controller
0 commit comments