Blog der Heimetli Software AG

Serielle Daten als POST an einen HTTP-Server schicken

Das folgende Programm liest Daten von einem seriellen Port auf dem Raspberry und schickt sie per POST an einen HTTP-Server.

import serial
import requests

PORT = "/dev/ttyACM0" 
URL  = "http://127.0.0.1/receiver.php"

def main():
    with serial.Serial( PORT ) as ser:
        while True:
            line = ser.readline().decode( "utf-8" ).strip()
            print( line )

            response = requests.post( URL, data={ "line" : line } )
            if response.status_code != 200:
                print( "POST failed" )


if __name__ == "__main__":
    main()

Dieser Code ist vorsätzlich so einfach wie möglich. Er setzt voraus dass die Daten zeilenweise ankommen und mit einem Newline ('\n') abgeschlossen sind.

Die Fehlerbehandlung ist ebenfalls SEHR unterentwickelt. Nur wenn der Server keinen OK-Status zurückgibt wird eine Meldung auf die Konsole ausgegeben. Eine falsche PORT-Angabe dagegen führt zu einer Exception, und damit zu einem Programm-Abbruch.

Das Script wurde mit einem Mikrokontroller getestet, deshalb heisst das PORT /dev/ttyACM0. Bei einem USB-Seriell Adapter heisst es normalerweise /dev/ttyUSB0.

readline wartet bis eine vollständige Zeile empfangen wurde. Wenn das Lesen nach einer gewissen Zeit abgebrochen werden soll, kann man das mit einem Timeout bewerkstelligen.

In der aktuellen Form übernimmt der Code einfach die Einstellungen des Ports. Mit zusätzlichen Argumenten im Konstruktor der Serial-Klasse kann man die Baudrate und viele weitere Parameter der Schnittstelle konfigurieren.