Beginnen wir mit Eisen

Ich habe einmal in derselben Fabrik gearbeitet, in der alle Arten von Elektronik modelliert wurden, die nicht sehr kompliziert waren und manchmal unter die Definition von „Internet der Dinge“ fielen. Zum größten Teil alle Arten von Sensoren für Sicherheitssysteme: Rauch, Lärm, Eindringen, Feuer und mehr. Das Sortiment war groß, manchmal waren es weniger als 500 Stück, und fast für jedes Produkt musste ich eine separate Testvorrichtung herstellen - tatsächlich wurde nur eine Blechdose, in der das Produkt getestet wurde, durch einen Deckel gepresst und von unten Kontaktnadeln an Kontaktpunkte gedrückt auf einer Leiterplatte so etwas:
Somit war es möglich, physisch mit dem Gerät zu kommunizieren. Das Kommunikationsprotokoll, das wir hatten, war in der Branche weit verbreitet - RS232 (COM-Port, eine Art UART). Alle Arten von einfachen gesteuerten Geräten zum Testen des Endprodukts wurden ebenfalls in die Schachtel gelegt. Alle diese Hilfsinstrumente wurden auf die gleiche Weise gesteuert. Die gesamte Struktur war sehr schwach und alle möglichen Probleme gehörten zum Tagesablauf.
Das Spektrum der Probleme war sehr groß - schlechte Kontakte, umgekehrte Polarität während der Installation, Probleme mit dem getesteten Produkt, mit Steuer- und Messgeräten, mit Kontaktnadeln, mit dem Testcode ... aber Sie wissen es nie! Aber es war notwendig, ständig zu testen, und wenn irgendwo Tests einsetzten, musste einer der Ingenieure auf die Leitung stampfen und anfangen, alles manuell zu überprüfen.
Zunächst wurde Docklight gestartet - ein gutes Dienstprogramm für die „Kommunikation“ über COM-Ports, das jedoch viele Einschränkungen aufwies. Und hier nähern wir uns dem Wesen der Sache.
Warum passte Docklight nicht zu mir?
Nun, lass uns gehen.
- Das erste Problem ist, dass Docklight nur unter Windows ausgeführt wird. So könnte die Installation des "Nervenzentrums" in Form von RaspberryPi, das alle Geräte oder ähnliches verbinden würde, vergessen werden. Ich musste NUC installieren - die billigste Lösung in dieser Situation. Schwer, ziemlich groß und nicht der billigste. Übrigens, als diese Testvorrichtungen von Ort zu Ort gezogen wurden, haben NUCs sehr, sehr viel gekämpft (obwohl ich zugebe, dass ihr Design ziemlich solide ist).
- Der zweite - der Fernzugriff konnte nur über die Desktop-Freigabe erfolgen - wurde sogar über das lokale Netzwerk verlangsamt und war sogar über das Internet völlig lahm.
- Drittens hatte jedes Gerät seinen eigenen Befehlssatz, und Docklight konnte eine Datei mit einer Liste von Befehlen laden. Wenn Sie beispielsweise eine ähnliche Liste mit jemandem in der Abteilung teilen mussten, senden Sie entweder eine E-Mail mit der Datei oder ... senden Sie einen Link zu der Datei im freigegebenen Ordner! Natürlich erforderte jede Docklight-Installation solche Dateien lokal, und all dies musste Dutzende (wenn nicht Hunderte Male) manuell durchgeführt werden - für jeden NUC zog jeder Ingenieur seine bevorzugten und praktischen Befehlslisten. Und auf dem Hof 2019 möchte ich Sie daran erinnern ...
- Viertens können Sie mit Docklight einen COM-Anschluss nicht automatisch einem Gerätenamen zuordnen: Wenn Sie beispielsweise das Netzteil anschließen, kommuniziert Windows über COM12 mit dem Gerät. Wenn Sie die Strings manuell ziehen möchten, müssen Sie in Docklight COM12 öffnen. Wie können wir herausfinden, dass es nur um die Stromversorgung geht und nicht etwa um SwitchBoard? Nun, Sie können jedes Mal in den Geräte-Manager schauen und versuchen, nicht zu vergessen, welches Gerät an welchen Port angeschlossen ist. Gleichzeitig garantiert niemand, dass der vorherige Port bei diesem Gerät verbleibt, wenn Sie das Gerät einfach herausziehen und dann wieder anschließen. Kurz gesagt, jedes Mal, wenn Sie es manuell tun müssen. Und glauben Sie mir, am Ende des Tages drehte sich mein Kopf davon.
- Fünftens benötigte jeder Port eine separate Kopie des Programms, und natürlich mussten alle Vorgänge für jedes Gerät einzeln ausgeführt werden, und obwohl Docklight die Skripterstellung unterstützt, gibt es keine Interaktion zwischen den einzelnen Instanzen.
Weiter. Es wurde keine Integration mit einem anderen Produkt bereitgestellt. Es scheint eine Kleinigkeit zu sein, aber hier ist eine Situation, in der es zu weißer Hitze kam: Der Test fiel, und wir müssen herausfinden, warum. Zunächst müssen Sie eine Verbindung zu den Geräten herstellen und prüfen, ob sie überhaupt tot sind. Wir gehen zum Geräte-Manager, schauen uns an, auf welchem Port sich unser Gerät befindet, öffnen Docklight, initiieren die Kommunikation mit unserem Port ... Fehler. Verdammt! Ich habe vergessen, den auf dem NUC installierten Dienst zu beenden und alle Ports beizubehalten. Exklusiv, wissen Sie. Okay, wir verlangsamen den Dienst, öffnen den Port, laden die Datei mit den Befehlen des Geräts, senden die Befehle, wir erhalten (oder erhalten keine) Antworten, wir lösen das Problem. Wir führen den Test erneut aus, er stürzt erneut ab ... Oh, verdammt, ich habe vergessen, Docklight zu schließen und den Dienst neu zu starten. Alles scheint keine Fehler zu sein. Aber das ist für die nächsten paar Stunden, bis wieder etwas schief geht. Und glauben Sie mir, es war notwendig, solche Probleme öfter zu lösen, als wir möchten.
Nun, und natürlich über alle Erweiterungen, fügen Sie hinzu. Es konnte keine Funktionen oder ähnliches geben - das Produkt ist geschlossen, lange geschrieben (es scheint, dass sie nicht mehr speziell entwickelt wurden), es gibt keine Anpassung.
Nun, ich habe beschlossen, etwas von mir zu tun, aber die Situation mit den beschriebenen Problemen zu korrigieren (oder zu verbessern).
Es stellte sich so etwas wie Zabbix heraus, aber mit Schärfen für eine bestimmte Situation.
Was ist der Unterschied?
Vielleicht ist es sinnvoll, mit einer allgemeinen Beschreibung der Architektur zu beginnen und dann auf Details einzugehen.
Das Schema sieht folgendermaßen aus:

Wir haben einen Agenten, der an der Station ausgeführt wird, mit der unsere Geräte physisch verbunden sind. Der Agent wurde in Python geschrieben, sodass er unter Windows und Linux problemlos funktioniert. Sie können ihn sicher für die Verwendung auf RaspberryPi und ähnlichen Geräten beenden. Das Programm ist äußerst ressourcenschonend und sehr stabil. Der Agent ist über das Websocket ständig mit dem Server (Back-End) verbunden und empfängt von dort alle Porteinstellungen und deren Parameter, sowohl während der Initialisierung als auch während der Aktualisierungen. Der Agent verfügt in diesem Fall über eine eigene Benutzeroberfläche für Einstellungen und Überwachung (möglicherweise wurde die Verbindung unterbrochen, möglicherweise ist die Lizenz abgelaufen).

Weiter. Der Server (auch bekannt als Back-End) steigt aus dem Docker (und läuft daher nicht nur in Amazon oder Google Cloud, sondern auch auf einem nicht so leistungsstarken Computer in einem LAN mit Linux an Bord). Es wurde in Django in Verbindung mit Redis geschrieben (zur Unterstützung von Websockets). Es speichert alle Einstellungen und ermöglicht die Kommunikation zwischen der Benutzer-GUI (nur eine in ReactJS geschriebene Seite) und über Agent - mit unseren Geräten. Zweiwege-Kommunikation, vollständig asynchron. Alle Einstellungen werden in Postgres und Mongo gespeichert.
Nun, und vielleicht ist der wichtigste Teil des Systems der Client selbst (einfach eine Seite in einem Browser, die für mehr Dynamik für ReactJS geschrieben wurde).

Ja, visuelles Design ist alles andere als perfekt, aber dies kann behoben werden.
Nun, dies kann abgerundet werden, ich werde nur ein paar Worte über den Status des Projekts und die Demo hinzufügen.
- Dies ist ein ziemlich frühes Alpha, um potenzielle Annehmlichkeiten zu demonstrieren und das Interesse zu überprüfen.
- Spielen Sie eine Demo - hier
Um sich anzumelden
Benutzername: operator_0
Passwort: 123456789
Wir wählen QA_Test und jede Station aus (dies ist nur ein Versuch, die Struktur des Unternehmens zu simulieren - die Ports sind mit den Stationen verbunden, sie sind in Abteilungen unterteilt und jedes Büro hat seine eigene Struktur).
Im Prinzip werde ich bei Interesse Unterstützung für https hinzufügen und die Assemblys des Agenten für verschiedene Plattformen erstellen sowie alle anderen Funktionen hinzufügen.
Ich freue mich über Feedback und Anregungen. Kritik ist willkommen!