Ein Modul, das die Eingabe-Ausgabe-Module für den Raspberry Pi
netzwerkfähig macht.
Der Server kann mit folgenden Zeilen einfach erstellt werden:
>>> from eapi.net import EAModulServer
>>> easerver = EAModulServer("localhost", 9999)
Anschließend wird er mit einem Aufruf gestartet.
easerver.serve_forever()
Ebenso kann der Server über die Kommandozeile mit dem folgenden Befehl
gestartet werden.
$ python3 -m eapi.net startserver
Nun wartet der Server auf dem Port 9999 auf UDP-Pakete. Ein an den Server
gesendeter Request besteht aus genau einem Byte - weitere gesendete Bytes
werden ignoriert. Die letzen sechs Bit (0 oder 1) des gesendeten Bytes, werden
als Werte für die rote, gelbe und grüne LED interpretiert:
? ? 0 0 1 1 1 0
^ ^ ^
| | |
| | grün
| gelb
rot
Für jede Farbe werden zwei Bit verwendet. Das erste Bit besagt, ob die
entsprechende LED geschaltet werden soll (1) oder nicht (0). Wenn die LED
geschalet werden soll, beschreibt das zweite Bit den Zustand, in den die LED
geschaltet werden soll: an (1) oder aus (0). Wenn die LED nicht geschaltet
werden soll, ist der Wert beliebig.
Die Bitsequenz ?? 0? 11 10 (? bedeutet 'beliebig') belässt die rote LED in
ihrem bisherigen Zustand, schaltet die gelbe LED an und die grüne LED aus.
Mit Netcat und echo kann ein Byte einfach an einen Testserver wie folgt
gesendet werden:
$ echo -en '\\xE' | nc -4u localhost 9999
Der Hexwert E entspricht dem Binärwert 00001110. Mit der Option -e wird eine
Escapesequenz verschickt, die Option -n besagt, dass kein Zeilenumbruch
gesendet werden soll - also nur die angegebenen Bytes. Die Option -4 von nc
sendet ein IPv4-Paket, das als UDP-Paket (-u) verschickt werden soll.
Das Modul enthält einen einfachen Konsolenclient, der über die Konsole
gestartet werden kann:
$ python3 -m eapi.net startclient
Mit dem Python-Modul socket kann ein Packet in Python selbst erstellt und an
den Server gesendet werden.
>>> import socket
>>> client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> daten = bytes([0xe])
Die zu sendenen Daten bestehen aus nur einem Byte.
>>> client.sendto(daten, ("localhost", 9999))
1