def reciveWorker(self): self.tcpConn.settimeout(10) try: if self.IP == '127.0.0.1' or self.IP == 'localhost': self.interface = 0 else: self.interface = 1 self.tcpConn.setblocking(1) self.sendMsg(Msg(cmd="device.heartbeat", socket=self, setid="0001")) #self.tcpConn.setblocking(0) i = 0 start = time.clock() while True: ready = False sleep(0.002) try: if ((time.clock() - start) > 5.0): self.tcpConn.sendall("\n".encode()) start = time.clock() data = self.tcpConn.recv(2048).decode('utf-8') if (len(data) > 3): for line in data.split("\n"): if (line != ""): Log.i('SocketWrap', "Received MSG: " + line) msg = Msg.fromJSONstr(self, line) if (msg.cmd == "ACK" or msg.cmd == "0"): msg.cmd = "ACK" Log.i( 'SocketWrap', "ACK recived. Looking for awating msgs " + msg.toJSON()) toRemove = [] for i in range(len(self.outgoingMSG)): if (i > len(self.outgoingMSG)): break msgS = self.outgoingMSG[i] if (msgS.setid == msg.setid and msgS.unid == msg.unid): Log.i( 'SocketWrap/ACK', "Msg for ACK found:" + msgS.toJSON(), msg) if (msgS.callback != None): Log.d('SocketWrap/ACK', "Calling callback") msgS.callback(msg) if (msgS.socket != None): msgS.socket.sendAck( setid=msgS.setid, unid=msgS.unid) toRemove.append(i) #break for i in range(len(toRemove)): try: del self.outgoingMSG[i] except: pass Log.i('SocketWrap', "ACK proceed complete") elif (msg.cmd == "device.reg.new" or msg.cmd == "10"): msg.cmd = "device.reg.new" self.registerDevice(msg.unid) #msg.callback = self.sendMsg #SocketWrap.outgoingMSG.append(msg) elif (msg.cmd == "device.reg.renew" or msg.cmd == "device.heartbeat" or msg.cmd == "12" or msg.cmd == "1"): Log.i('SocketWrap', "Got MSG: " + msg.toJSON()) allId = msg.unid + '' + msg.setid if allId not in SocketWrap.allUnits: Log.e( 'SocketWrap', "Not able to find device by ID " + allId + " . Registering as new") self.registerDevice( msg.unid, msg.setid) continue msg.device = SocketWrap.allUnits[allId] device = msg.device device.mySocketWrap = self device.setIsOnline(True) self.units[allId] = device SocketWrap.onlineUnits[allId] = device if (msg.cmd == "12"): msg.cmd = "device.reg.renew" elif (msg.cmd == "1"): msg.cmd = "device.heartbeat" if (msg.socket != None): msg.socket.sendAck(setid=msg.setid, unid=msg.unid) #else: self.sendAck(setid=msg.setid, unid=msg.unid) #if(device.isOnline ==False): Log.i( 'SocketWrap', "Dir: " + device.direction + ", nedStVal = %s" % device.needSetValue) if 'O' in device.direction and device.needSetValue == True: Log.i('SocketWrap', "Sending last missed value") device.needSetValue = False #self.tcpConn.send(allId+''+device.parseFormatToValue(device.lastValue)+'\r\n') DB.registerEvent( device.unid, device.setid, 'SocketWrap', 'device register renew.') device.setValue(device.lastValue) msg.callback = self.onNeedSetValueAck #SocketWrap.outgoingMSG.append(msg) elif (msg.cmd == "device.val.input" or msg.cmd == "20"): msg.cmd = "device.val.input" self.sendAck(setid=msg.setid, unid=msg.unid) self.onValueRecieved( msg.unid, msg.setid, msg.value) elif (msg.cmd == "device.val.set" or msg.cmd == "22"): msg.cmd = "device.val.set" allId = msg.unid + '' + msg.setid if allId not in SocketWrap.allUnits: Log.e('SocketWrap', "Not able to get device ID") return device = SocketWrap.allUnits[allId] Log.d('DeviceSetVal', "[1]") device.setValue(msg.value, callback=sendMsg) Log.d('DeviceSetVal', "[2]") msg.callback = self.sendMsg #SocketWrap.outgoingMSG.append(msg) #socketWrap.onValueRecieved(msg.unid,msg.setid,value) Log.d('DeviceSetVal', "[3]") Log.i('SocketWrap', "MSG proceed complete") except ValueError as e: Log.e('SocketWrap/ValueError', "While E " + str(e), traceback.format_exc()) '''except socket.timeout: #self.tcpConn.setblocking(0) try: if i == 5: i = 0 self.tcpConn.send("\n") i+=1 except: break #pass except socket.error as e: #print("[D] While E ", e) try: if i == 25: i = 0 #self.tcpConn.send("\n") self.tcpConn.send(" ") i+=1 except: break #pass except Exception as e: exc = str(e) Log.e('SocketWrap/ValueError',exc)''' #finally: except socket.error: Log.e('SocketWrap/Thread/1', "Closing socket: %s " % socket.error, traceback.format_exc()) except Exception as e: exc = str(e) Log.e('SocketWrap/Thread/2', exc, traceback.format_exc()) Log.i('SocketWrap', "Closing driver ") #self.tcpConn.shutdown(2) self.tcpConn.close() self.onClientDisConnected() Log.i('SocketWrap', "Client disConnected: " + self.IP + ":" + self.port) if 'socketWrap' in locals(): del self
def thread(self, intfId): try: start = time.clock() Log.i('DriverTCP/Thread', 'Connected') while True: #try: if ((time.clock() - start) > 5.0): #Log.d('PortalConnect/Thread','Keep Alvie sent') self.sock.sendall("\n".encode()) start = time.clock() try: ready_to_read, ready_to_write, in_error = select.select([ self.sock, ], [ self.sock, ], [], 5) except select.error: #conn.shutdown(2) # 0 = done receiving, 1 = done sending, 2 = both # connection error event here, maybe reconnect break #if len(ready_to_read) > 0: data = self.sock.recv(2048).decode('utf-8') if not data: break if len(data) > 5: for line in data.split("\n"): if len(line) > 5: Log.i('DriverTCP/Thread', 'received "%s"' % line) from DriverTCP import Msg msg = Msg.fromJSONstr(self, line) if (msg.cmd == "ACK" or msg.cmd == "0" or msg.cmd == "device.reg.res"): #msg.cmd = "ACK" Log.i( 'DriverTCP/Thread', "ACK recived. Looking for awating msgs " + msg.toJSON()) isAckThere = False toRemove = [] for i in range(len(self.outgoingMSG)): msgS = self.outgoingMSG[i] if (msgS.setid == msg.setid and msgS.unid == msg.unid): Log.i( 'DriverTCP/ACK', "Msg for ACK found:" + msgS.toJSON(), msg) if (msgS.callback != None): Log.d('DriverTCP/ACK', "Calling callback") msgS.callback(msg) if (msgS.socket != None): msgS.socket.sendAck( setid=msgS.setid, unid=msgS.unid) toRemove.append(i) isAckThere = True #break for i in range(len(toRemove)): try: del self.outgoingMSG[i] except: pass Log.i('DriverTCP/Thread', "ACK proceed complete") if ((isAckThere == False or msg.cmd == "device.reg.res") and self.onRecieveCallback != None): Log.i('DriverTCP/Thread', "Calling callback", msg.cmd) self.onRecieveCallback(msg) elif (msg != None and self != None and self.onRecieveCallback != None): self.onRecieveCallback(msg) #else: #break #time.sleep(0.3) '''except ValueError as e: Log.e('DriverTCP/Thread',"While E: %s"%e) except ConnectionError as e: Log.e('DriverTCP/Thread',"While E: %s"%e)''' #except socket.error: # Log.e('DriverTCP/Thread',"Closing driver: ", socket.error) except socket.error: Log.e('DriverTCP/Thread/1', "Closing socket: %s " % socket.error, traceback.format_exc()) except Exception as e: exc = str(e) Log.e('DriverTCP/Thread/2', exc, traceback.format_exc()) #except ValueError: Log.d('DriverTCP/Thread', 'closing socket', ValueError) self.sock.close() self.connect()