Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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()