#!/usr/bin/env python # -*- coding: iso-8859-1 -*- ''' Proxy für Maltes AVR-Temperaturfühler Liefert beim Connect aof den in config gesetzten PORT eine Zeile zurück, die den Wert des Temperaturfühlers enthält ''' import asyncore, serial, select, socket # Globale Variable enthält FuehlerWert FuehlerWert = 0 class TempChannel( asyncore.dispatcher ): '''Diese Klasse behandelt ein Verbindung. Sie scheibt den FuehlerWert gefolgt von \n und schließt dann den socket''' def handle_write( self ): # ============ self.send( "%s\n" % FuehlerWert ) self.close() # und fertig class TempServer(asyncore.dispatcher): '''Die Server-Klasse. sie lauscht auf dem angegebenen Port, nimmt jede neue Verbindung und instanziiert einen TempChannel zur Bearbeitung''' def __init__( self, port = 80 ): # ======== self.create_socket( socket.AF_INET, socket.SOCK_STREAM ) self.set_reuse_addr() self.bind( ("", port) ) self.listen( 5 ) if config.DEBUG: print "TempServer started on port", port def handle_accept(self): # ============= channel, addr = self.accept() if config.DEBUG: print "Connection from", addr TempChannel( channel ) if __name__ == "__main__": # Als eigenständiges Programm gestartet? import config ser = serial.Serial( config.DEVICE, baudrate = config.BAUDRATE ) # Server starten, liefert 0 zurück, solange serielle nichts sagt server = TempServer( config.PORT ) ser.flushInput() # Inputbuffer der seriellen saubermachen while 1: if ser.inWaiting() > 14: # Mindestens zwei Zeilen (d.h. eine korrekte Zeile) im Buffer ser.readline() # saubermachen, s.o. FuehlerWert = ser.readline().strip() ser.flushInput() # eventuelle weitere Zeilen verwerfen if config.DEBUG: print FuehlerWert asyncore.poll( 1, asyncore.socket_map ) # eine Sekunde auf connections warten, dann wieder um serielle kümmern