Skip to content

Commit fe95f49

Browse files
committed
First teps in making async
1 parent 1785c1e commit fe95f49

2 files changed

Lines changed: 83 additions & 17 deletions

File tree

lib/device.py

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import socket
2+
import asyncio
3+
import time
24
from sys import argv
35

46
PH803W_DEFAULT_TCP_PORT = 12416
@@ -13,6 +15,9 @@ def __init__(self, host):
1315
self.host = host
1416
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1517

18+
async def run_async(self):
19+
self.run()
20+
1621
def run(self):
1722
self.loop = True
1823
self.socket.connect((self.host, PH803W_DEFAULT_TCP_PORT))
@@ -41,7 +46,7 @@ def run(self):
4146
empty_counter += 1
4247
continue
4348
empty_counter = 0
44-
print(response)
49+
# print(response)
4550
if len(response) == 18:
4651
flag1 = response[8]
4752
if flag1 & 0b0000_0100:
@@ -66,20 +71,65 @@ def run(self):
6671

6772
self.socket.sendall(data)
6873
response = self.socket.recv(1024)
69-
#print(response)
7074

7175

76+
def _handle_response(self, data):
77+
if data[0] != 0 and data[1] != 0 and data[2] != 0 and data[2] != 3:
78+
print('Ignore data package because invalid prefix: %s' % data[0:3])
79+
self.result['status'] = ['Error', 'Ignore data package because invalid prefix']
80+
return
81+
data_length = data[4]
82+
if len(data) != data_length + 5:
83+
if len(data) > data_length:
84+
additional_data = data[data_length: len(data)]
85+
data = data[0 : data_length]
86+
print('Split into two data packages because additional data detected. First %s - Second %s}' % (data.toString('hex'), additional_data.toString('hex')))
87+
self._handle_response(additional_data)
88+
else:
89+
print('Ignore data package because invalid length(%s): %s' % (data_length, data))
90+
self.result['status'] = ['Error', 'Ignore data package because invalid length']
91+
return
92+
93+
message_type = data[7]
94+
if message_type == 0x07:
95+
self._handle_passcode_response(data)
96+
elif message_type == 0x09:
97+
self._handle_login_response(data)
98+
elif message_type == 0x16:
99+
self._handle_ping_pong_response()
100+
elif message_type == 0x91:
101+
self._handle_data_response(data)
102+
elif message_type == 0x94:
103+
self._handle_data_extended_response(data)
104+
else:
105+
print('Ignore data package because invalid message type %s: %s' % (message_type, data))
106+
self.result['status'] = ['Ignore', 'Ignore data package because invalid length', message_type, data]
107+
108+
def _handle_passcode_response(self, data):
109+
pass
110+
def _handle_login_response(self, data):
111+
pass
112+
def _handle_ping_pong_response(self):
113+
pass
114+
def _handle_data_extended_response(self, data):
115+
pass
116+
117+
def _send_ping(self):
72118
pass
73-
#self.socket.bind((host, PH803W_DEFAULT_TCP_PORT))
74-
#self.socket.listen()
75-
#conn, addr = self.socket.accept()
76-
#with conn:
77-
# print('Connected to: %s' % addr)
78-
# while True:
79-
# data = conn.recv(1024)
80-
# if not data:
81-
# break
82-
# conn.sendall(data)
119+
# if (this.pingWaitTimeout) {
120+
# clearTimeout(this.pingWaitTimeout);
121+
# this.pingWaitTimeout = null;
122+
# }
123+
# if (this.pingTimeout) {
124+
# clearTimeout(this.pingTimeout);
125+
# this.pingTimeout = null;
126+
# }
127+
# debug('received pong');
128+
# this.pingTimeout = setTimeout(() => {
129+
# this.pingTimeout = null;
130+
# this._sendPing();
131+
# }, this.options.pingInterval || PH803W_PING_INTERVAL);
132+
# } def _handle_data_response(self, data):
83133

84134
def abort(self):
85135
self.loop = False
@@ -99,5 +149,11 @@ def __exit__(self, type, value, traceback):
99149

100150

101151
if __name__ == '__main__':
102-
with Device('192.168.1.89') as d:
103-
print(d.get_result())
152+
#with Device('192.168.1.89') as d:
153+
# print(d.get_result())
154+
155+
loop = asyncio.get_event_loop()
156+
device = Device('192.168.1.89')
157+
loop.run_until_complete(device.run_async())
158+
print(device.get_result())
159+
loop.close()

lib/discovery.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import socket
2+
import asyncio
23

34
PH803W_UDP_PORT = 12414
45

@@ -13,6 +14,9 @@ def __init__(self):
1314
# indefinitely when trying to receive data.
1415
self.socket.settimeout(1)
1516

17+
async def run_async(self):
18+
self.run()
19+
1620
def run(self):
1721
data = bytes.fromhex('0000000303000003')
1822
self.socket.sendto(data, ('<broadcast>', PH803W_UDP_PORT))
@@ -39,7 +43,7 @@ def run(self):
3943

4044
print('Parsing discovered device: %s: %s - %s' % (remote[0], remote[1], data[7:]))
4145
self.result['status'] = ['Error'] # Temporary until all pass
42-
self.result['result'] = {}
46+
self.result['result'] = {'ip' : remote[0]}
4347

4448
id1_length = data[9]
4549
id1_raw = data[10 : 10 + id1_length]
@@ -70,7 +74,7 @@ def close(self):
7074
self.socket.close()
7175

7276
def get_result(self):
73-
return str(self.result)
77+
return self.result
7478

7579
def __enter__(self):
7680
self.run()
@@ -81,4 +85,10 @@ def __exit__(self, type, value, traceback):
8185

8286
if __name__ == '__main__':
8387
with Discovery() as d:
84-
print(d.get_result())
88+
print(d.get_result())
89+
90+
loop = asyncio.get_event_loop()
91+
discovery = Discovery()
92+
loop.run_until_complete(discovery.run_async())
93+
print(discovery.get_result())
94+
loop.close()

0 commit comments

Comments
 (0)