SEN-ACT

Das SENsor-ACTor-Protokoll, kurz SENACT, ist mein aktueller Versuch meine heimischen IoT Experimente unter einen Hut zu bekommen.

Und ja, es soll eine Eigenlösung sein … weil … ich habe einfach überhaupt keine Freude daran “etwas Fertiges” herunterzuladen, was dann am Ende eben nicht so funktioniert, wie ich es möchte.


Zielsetzung

Ich hätte gerne eine Codebase, die überall (und zwar wirklich überall) läuft und numerische Werte mit ein paar Metadaten senden und empfangen kann.

Gesteuert werden soll:

  • Das Anfragen bzw Publizieren von Abmessungen von Sensoren
  • Das setzen von Zuständen in Aktoren (wie z.B. Motoren oder Status-LEDs)

Handycap: Bitte ohne memcpy()

Tja, ein bisschen schwierig soll es schon sein. Und nachdem ich ohnehin dezent verstört bin, wie unterschiedlich die unterstützen Funktionen in Embedded- und MCU-Dev-Kits sind, soll die Bibliothek auf gar nichts von außen angewiesen sein.

Aber mal ehrlich, memcpy() ist auf 8-bit System selten etwas anderes als:

 1void memcpy(void* dst, void const* src, size_t count)
 2{
 3  char* ptr_dst = (char*)dst;
 4  char const* ptr_src = (char const*)dst;
 5
 6  while(count-- != 0)
 7  {
 8    *(ptr_dst++) = *(ptr_src++);
 9  }
10}

Und diesen 10-Zeiler kann man ja auch selbst ausliefen und schon ist man von der Standard-Bibliothek (bzw. deren nicht-vorhanden-sein) unabhängig.

Zeilen-basierte Kommunikation

Die Bibliothek übersetzt eine Anfrage in einen Byte-Puffer, der auf der Zielplattform nur noch versendet werden muss. Umgekehrt kann aus einem gelesenen Byte-Puffer wieder eine Nachricht dekodiert werden.

Trennzeichen ist LF (also das von Linux bekannt Line-Feed Zeichen) oder alternativ CR (also ENTER), oder beide, die ein Zeilenende beschreiben.

Die Daten in der Zeile sollen nur aus Text-Zeichen (Zahlen und Buchstaben) bestehen. Womit man eine Steuerung per Tastatur manuell durchführen kann.

Im Unterschied zu AT-Kommandos sind Anfragen und Antworten aber immer einzeilig, was ein komplexes Parsing von mehrzeiligen Blöcken verhindert.

Vorgesehen ist auch ein optionaler User-Parameter in Anfragen, der bei Antworten wieder zurückgeschickt wird. So können viele Anfragen parallel verschickt und die Antworten exakt zugeordnet werden.

Status

Die Implementierung findet zwar im Rahmen des GATE Projektes statt, ist aber vollkommen davon unabhängig und eine simple C-Header-Only Lösung.
Ich überlege allerdings hieraus ein eigenes Projekt zu machen und diese mit Anbindungen an Arduino und an GATE auszustatten.

Am Ende soll der gleiche Code am Mikrocontroller und in einer GATE App die Kommunikationsübersetzung vornehmen. Dann sind nur noch Treiber für die gewünschten Geräte an SENACT anzubinden und schon kann man (fast) alles fernsteuern.

Ich hoffe mir bleibt ausreichend Zeit, die Umsetzung vorantreiben.