Unsere bisherigen Pläne für ZABOS sehen vor, dass wir die Funktionalität der Alarmierung per SMS über Fünfton-Folgeruf (ZVEI) erweitern – nämlich um die digitalen Protokolle POCSAG und FMS. Unserer bisheriger Fünfton-Folgerufempfänger ist ein selbstenwickeltes Board mit Mikrocontroller, der die Fünfton-Folgen aufnimmt und dann über die serielle Schnittstelle an ZABOS weiterreicht.
Bereits vor einiger Zeit hatten wir begonnen, uns nach Alternativen umzuschauen, denn die Eigenentwicklung der Auswertungssoftware für die digitalen Protokolle würde zu viel Zeit in Anspruch nehmen. Außerdem war für jedes neue ZABOS-System ein neues Mikrocontroller-Board nötig. Da wir keine Hardwareschmiede sind, wollten wir darauf verzichten.
Als Alternativen liefen uns schließlich FMS Crusader über den Weg und außerdem auch das Open Source-Tool monitord, das recht gut in unsere zukünftige Produktstrategie passte.
monitord ist in C++ geschrieben und läuft sowohl unter Linux als auch unter Windows. Mit einer Lua-Scripting-API kann die Funktionalität des Systems erweitert werden. Allerdings wollte ich aus architekturbedingten Gründen keinen REST-Service auf ZABOS-Seite zum Übermitteln der Alarmierungen schreiben.
Stattdessen sollten die eingehenden Alarmierungen für zukünftige ZABOS-Versionen in einer Message-Queue in Form von ActiveMQ auflaufen.
ZABOS kann dann innerhalb von ActiveMQ z.B. drei verschiedene Topics (zabos.pocsag, zabos.zvei und zabos.fms) abonnieren und die jeweiligen Schleifen im System alarmieren, sobald eine Nachricht in dem jeweiligen Topic veröffentlicht wird. monitord hingegen nimmt die Funksignale über zwei Soundkarten auf (damit werden wir das Board mit dem Mikrocontroller und die nötige serielle Schnittstelle los), verarbeitet sie und und publiziert sie im passenden Topic der Queue.
Neben der Lua-API existiert in monitord auch eine eigene Plugin-Schnittstelle die z.B. für das MySQL-Plugin genutzt wird. Diese Plugins können dann direkt in C++ geschrieben werden.
Nachdem ich mich mit dem gesamten Konzept sehr schnell angefreundet hatte, schaute ich erst einmal nach, ob ActiveMQ denn irgenwelche Bindings für C++ besaß. Glücklicherweise haben die Jungs von Apache (wie so oft) gute Arbeit geleistet und somit konnte ich mir ActiveMQ-CPP herunterladen und kompilieren. Vorher musste ich noch libaprutil1-dev nachinstallieren.
Das der ActiveMQ-CPP-Distribution beiliegende Beispiel unter src/examples/producers/SimpleProducer.cpp war für mein Vorhaben genau der richtige Einstieg – mehr sollte mein Plugin ja auch eigentlich nicht können.
ActiveMQ-CPP hatte ich also soweit installiert – nun ging es daran, monitord mit ActiveMQ bekannt zu machen. Zuerst ließ ich den monitord-Quellcode kompilieren und testete, ob dieser soweit überhaupt in Ordnung war.
Das Kompilieren funktionierte zwar, allerdings konnte der Daemon meine Soundkarte nicht erkennen. Erstaunlicherweise stand im Log, dass er über OSS auf die Soundkarte zugreifen wollte, obwohl ich explizit in der monitord.xml als Soundkarte “plughw” verwendet und auch beim Kompilieren –with-alsa mitgegeben hatte. Ich schaute mir die configure-Ausgabe noch einmal an und stellte fest, dass das Paket libasound2-dev für ALSA benötigt wurde – ist irgendwie auch klar -, ich es aber nicht installiert hatte. Das configure-Script brach aber bei fehlenden Headern nicht ab, sondern kompilierte stattdessen mit OSS-Support.
Ich also libasound2-dev nachinstalliert und meine Soundkarte wurde schließlich erkannt.
Die rudimentäre Logik zum Laden der ActiveMQ-Konfiguration innerhalb der monitord.xml, dem Initalisieren der Verbindung u.s.w. tipperte ich in knapp drei Stunden runter, nachdem ich immer wieder mal in die C++-Dokumentation schauen musste. Glücklicherweise konnte ich viel von dem ActiveMQ-Beispiel als auch von dem monitord-MySQL-Plugin übernehmen.
Anschließend erweiterte ich die configure.ac und Makefile.ac um die nötigen ActiveMQ-Abhängigkeiten und konnte mit –with-activemq auch mein Plugin kompilieren.
Das ActiveMQ-Plugin ist noch nicht vollständig, sowohl Testen als auch das Veröffentlichen der Nachrichten in der Queue ist noch nicht implementiert. Ist aber auch nicht wild, da es mir erst einmal um die Evaluierung des Konzepts ging. Und das ging alles recht schnell, obwohl ich von C++ und den GNU-Buildtools null Ahnung habe 😉
Die geänderten Sourcen habe ich auf Github veröffentlicht – enthält natürlich noch massig Bugs und ist ungetestet.
0 Comments