def advanceToRunlevel(self, runlevel): if self.interval == self.runlevel_settings[runlevel]: print debugLog( 'Skipped runlevel change as there is no change in timer') return debugLog('ATR advancing to ' + str(runlevel) + ' with ' + str(self.runlevel_settings[runlevel])) self.interval = self.runlevel_settings[runlevel]
def start(id, ip, port): while True: try: debugLog('Start MOTE at ID='+str(id)+' IP='+str(ip)+' PORT='+str(port)) x = MoteClass(id, ip, port) x.run() except Exception, e: debugLog('AFMOTEMOTE> Exception '+str(e)+' at mote '+str(id)) del x sleep(60)
def fastRead(id): SENSORICS_QUERY_LOCK.acquire() try: sidsensors = SENSORICS[id] Device(id).setStat('runlevel1.lastreported', datetime.now()) Device(id).setStat('runlevel', 1) for sensor in sidsensors: sensor.rt1expire = datetime.now() + timedelta(0, 15) sensor.advanceToRunlevel(1) except Exception, e: debugLog(str(e))
def execute(self): # wykonaj odpyt self.signalUpdated() try: Get(sObj.read(self.id, self.dev, self.regtype, self.register)) except: debugLog('ASK FAILED') if self.rt1expire != None: if datetime.now() > self.rt1expire: self.advanceToRunlevel(0) self.rt1expire = None
def start(id, ip, port): while True: try: debugLog('Start MOTE at ID=' + str(id) + ' IP=' + str(ip) + ' PORT=' + str(port)) x = MoteClass(id, ip, port) x.run() except Exception, e: debugLog('AFMOTEMOTE> Exception ' + str(e) + ' at mote ' + str(id)) del x sleep(60)
def run(self): try: self.xrun() except Exception, e: self.device.setStat('thread.reader', 0) self.device.setStat('online', 0) Get(afsObj.offline(self.id)) try: del CONNECTIONS[self.id] except: pass debugLog('reader exception for ' + str(self.id) + ': ' + str(e))
def run(self): try: self.xrun() except Exception, e: self.device.setStat('thread.reader', 0) self.device.setStat('online', 0) Get(afsObj.offline(self.id)) try: del CONNECTIONS[self.id] except: pass debugLog('reader exception for '+str(self.id)+': '+str(e))
def finish(self): self.device.setStat('thread.handler', 0) self.device.setStat('online', 0) self.device.setStat('disconnected.on', datetime.now()) try: Get(afsObj.offline(self.id)) except: pass debugLog('Finishing for ' + str(self.id)) try: del CONNECTIONS[self.id] except: pass
def finish(self): self.device.setStat('thread.handler', 0) self.device.setStat('online', 0) self.device.setStat('disconnected.on', datetime.now()) try: Get(afsObj.offline(self.id)) except: pass debugLog('Finishing for '+str(self.id)) try: del CONNECTIONS[self.id] except: pass
def stall_incoming(self): self.device.setStat('thread.handler.status', 'stall') self.device.setStat('queue.pending', self.orders.qsize()) if self.device.getStat('thread.reader.lasttick') + timedelta(0, 60) < datetime.now(): debugLog('Handler quits due to thread.reader watchdog faulting') self.device.setStat('thread.reader.lasttick.watchdogged', datetime.now()) raise Exception, ' watchdog' while self.incoming.qsize() > 100: self.device.setStat('thread.handler.status', 'stall-busywait') if self.device.getStat('thread.reader.lasttick') + timedelta(0, 60) < datetime.now(): debugLog('Handler quits due to thread.reader watchdog faulting') self.device.setStat('thread.reader.lasttick.watchdogged', datetime.now()) raise Exception, 'qsize > 100 + watchdog' sleep(1)
def stall_incoming(self): self.device.setStat('thread.handler.status', 'stall') self.device.setStat('queue.pending', self.orders.qsize()) if self.device.getStat('thread.reader.lasttick') + timedelta( 0, 60) < datetime.now(): debugLog('Handler quits due to thread.reader watchdog faulting') self.device.setStat('thread.reader.lasttick.watchdogged', datetime.now()) raise Exception, ' watchdog' while self.incoming.qsize() > 100: self.device.setStat('thread.handler.status', 'stall-busywait') if self.device.getStat('thread.reader.lasttick') + timedelta( 0, 60) < datetime.now(): debugLog( 'Handler quits due to thread.reader watchdog faulting') self.device.setStat('thread.reader.lasttick.watchdogged', datetime.now()) raise Exception, 'qsize > 100 + watchdog' sleep(1)
def handle(self): '''If an exception happens in handle(), then finish() is not executed''' self.request.setsockopt(SOL_TCP, TCP_NODELAY, 1) # Nagle - sio! self.request.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 0) # no keepalive self.request.setblocking(1) self.request.settimeout(60) self.packet = RequestHandlerPacket(proxy(self)) self.packet.readInStrict(12) # wczytaj pakiet inicjalizacji id, self.protocolVersion = getI_INITIALIZATION(self.packet) debugLog('Remote identified as ' + str(id)) self.id = id self.incoming = Queue.Queue() self.orders = Queue.Queue() try: self.device = Device(id) except DeviceNotFound: debugLog('Unrecognized device ' + str(id)) return try: if self.device.getStat('thread.handler') == 1: raise Exception if self.device.getStat('thread.reader') == 1: raise Exception except StatisticNotFound: pass CONNECTIONS[self.id] = self try: self.xhandle() except Exception, e: debugLog('Exception for ' + str(self.id) + ': ' + str(e))
def handle(self): '''If an exception happens in handle(), then finish() is not executed''' self.request.setsockopt(SOL_TCP, TCP_NODELAY, 1) # Nagle - sio! self.request.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 0) # no keepalive self.request.setblocking(1) self.request.settimeout(60) self.packet = RequestHandlerPacket(proxy(self)) self.packet.readInStrict(12) # wczytaj pakiet inicjalizacji id, self.protocolVersion = getI_INITIALIZATION(self.packet) debugLog('Remote identified as '+str(id)) self.id = id self.incoming = Queue.Queue() self.orders = Queue.Queue() try: self.device = Device(id) except DeviceNotFound: debugLog('Unrecognized device '+str(id)) return try: if self.device.getStat('thread.handler') == 1: raise Exception if self.device.getStat('thread.reader') == 1: raise Exception except StatisticNotFound: pass CONNECTIONS[self.id] = self try: self.xhandle() except Exception, e: debugLog('Exception for '+str(self.id)+': '+str(e))
def offline(self, id): debugLog('Offline for '+str(id)) clearSensorsFor(id)
def fastRead(self, id): debugLog('Fastread for '+str(id)) fastRead(id)
def online(self, id): debugLog('Online for '+str(id)) readSensorsFor(id)
def online(self, id): debugLog("Online for " + str(id)) readSensorsFor(id)
def offline(self, id): debugLog("Offline for " + str(id)) clearSensorsFor(id)
def advanceToRunlevel(self, runlevel): if self.interval == self.runlevel_settings[runlevel]: print debugLog('Skipped runlevel change as there is no change in timer') return debugLog('ATR advancing to '+str(runlevel)+' with '+str(self.runlevel_settings[runlevel])) self.interval = self.runlevel_settings[runlevel]
def reread(self, id): debugLog('Reread for '+str(id)) readSensorsFor(id)
def xhandle(self): # Przygotuj statystyki self.device.setStat('thread.handler', 1) self.device.setStat('transmission.errors', 0) self.device.setStat('transmission.successes', 0) self.device.setStat('queue.sent', 0) self.device.setStat('queue.pending', 0) self.device.setStat('connected.on', datetime.now()) self.device.setStat('online', 1) self.device.setStat('last.tick', None) Get(afsObj.online(self.id)) self.device.setStat('thread.handler.status', 'start') rant = ReaderThread(proxy(self)) rant.start() mkCONFIRMATION(self.packet) self.packet.writeOut() debugLog('Passing onto main loop for ' + str(self.id)) while True: self.device.setStat('thread.handler.status', 'WAIT') try: order = self.orders.get(True, 61) # czekaj na następny rozkaz except: debugLog('Disconnected ' + str(self.id) + ' because of no orders') raise Exception, 'no orders' if isinstance(order, ReadOrder): self.stall_incoming() rti = [ mkGET_HOLDING_RET_ERROR, mkGET_COIL_RET_ERROR, mkGET_INPUT_RET_ERROR ] rti[order.regtype](self.packet, order.address, order.register) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, WriteOrder): self.stall_incoming() rti = [mkWRITE_HOLDING, mkWRITE_COIL] rti[order.regtype](self.packet, order.address, order.register, order.value) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) debugLog('sent write') elif isinstance(order, NetinfoGetOrder): self.stall_incoming() mkGIVE_ME_SETTINGS(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, NetinfoSetOrder): self.stall_incoming() mkCOMPLEX_SETTINGS_PRZEPIER( self.packet, (order.iptuple, order.subnettuple, order.routertuple, order.dnstuple, order.target)) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, KeepaliveOrder): self.stall_incoming() mkKEEPALIVE(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance( order, RebootOrder ): # Jak najprościej zrobić reboota? Rozłączyć urządzenie. return elif isinstance(order, SleepOrder): sleep(order.seconds) elif isinstance(order, VendorinfoGetOrder): self.stall_incoming() mkGETVENDORINFO(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) self.device.setStat('last.tick', datetime.now())
def reread(self, id): debugLog("Reread for " + str(id)) readSensorsFor(id)
def xhandle(self): # Przygotuj statystyki self.device.setStat('thread.handler', 1) self.device.setStat('transmission.errors', 0) self.device.setStat('transmission.successes', 0) self.device.setStat('queue.sent', 0) self.device.setStat('queue.pending', 0) self.device.setStat('connected.on', datetime.now()) self.device.setStat('online', 1) self.device.setStat('last.tick', None) Get(afsObj.online(self.id)) self.device.setStat('thread.handler.status', 'start') rant = ReaderThread(proxy(self)) rant.start() mkCONFIRMATION(self.packet) self.packet.writeOut() debugLog('Passing onto main loop for '+str(self.id)) while True: self.device.setStat('thread.handler.status', 'WAIT') try: order = self.orders.get(True, 61) # czekaj na następny rozkaz except: debugLog('Disconnected '+str(self.id)+' because of no orders') raise Exception, 'no orders' if isinstance(order, ReadOrder): self.stall_incoming() rti = [mkGET_HOLDING_RET_ERROR, mkGET_COIL_RET_ERROR, mkGET_INPUT_RET_ERROR] rti[order.regtype](self.packet, order.address, order.register) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, WriteOrder): self.stall_incoming() rti = [mkWRITE_HOLDING, mkWRITE_COIL] rti[order.regtype](self.packet, order.address, order.register, order.value) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) debugLog('sent write') elif isinstance(order, NetinfoGetOrder): self.stall_incoming() mkGIVE_ME_SETTINGS(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, NetinfoSetOrder): self.stall_incoming() mkCOMPLEX_SETTINGS_PRZEPIER(self.packet, (order.iptuple, order.subnettuple, order.routertuple, order.dnstuple, order.target)) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, KeepaliveOrder): self.stall_incoming() mkKEEPALIVE(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) elif isinstance(order, RebootOrder): # Jak najprościej zrobić reboota? Rozłączyć urządzenie. return elif isinstance(order, SleepOrder): sleep(order.seconds) elif isinstance(order, VendorinfoGetOrder): self.stall_incoming() mkGETVENDORINFO(self.packet) self.packet.writeOut() self.incoming.put(order.supplyId(self.id)) self.device.setStat('last.tick', datetime.now())
def fastRead(self, id): debugLog("Fastread for " + str(id)) fastRead(id)