11import socket
2+ import asyncio
3+ import time
24from sys import argv
35
46PH803W_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
101151if __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 ()
0 commit comments