Go, Vue und 3 Tage zu entwickeln: ein Echtzeitsystem zur Überwachung von Patienten

Im November 2019 hörten die Menschen von den ersten Fällen einer unbekannten tödlichen Krankheit in China. Jetzt weiß jeder, dass diese Krankheit COVID-19 heißt. Anscheinend hat die Epidemie die Welt, die wir kannten, für immer verändert. Das Virus ist gefährlich und sehr ansteckend. Und die Menschheit weiß noch nicht viel darüber. Ich hoffe wirklich, dass bald ein Heilmittel für diese Krankheit gefunden wird. Das Virus ist so beschaffen, dass es sehr schwierig ist, seine Ausbreitung zu verhindern. In Sri Lanka, wo ich lebe, sind wir mit der gleichen Situation konfrontiert wie Menschen in anderen Ländern. Hier möchte ich darüber sprechen, wie Programmierer denjenigen, die die Krankheit von Angesicht zu Angesicht bekämpfen, alle mögliche Hilfe leisten konnten.





Risiken im Zusammenhang mit der Patientenversorgung


Eine Person kann infiziert werden, selbst wenn sie einen kleinen Fehler macht. Ärzte müssen regelmäßig infektiöse Isolationsstationen aufsuchen, um die Vitalfunktionen der Patienten zu überprüfen. Nach dem Besuch des Internierungslagers müssen Schutzanzüge zerstört werden. Und das alles nur, um die Anzeigen zu betrachten, die auf den Bildschirmen von Medizinprodukten angezeigt werden.

Vertreter der Gesundheitsbehörden sprachen uns mit einem Vorschlag an, ein System zur Fernüberwachung von Patienten zu entwickeln. Es gibt schlüsselfertige Überwachungslösungen, die sehr teuer sind. Aber Sri Lanka ist kein so reiches Land.

Arbeitsbeginn


Wir (ich und Keshara ) haben einige Nachforschungen angestellt und festgestellt, dass die Geräte, die von Indikatoren, Nachtmonitoren, entnommen werden müssen, das gemeinsame HL7-Protokoll (Gesundheitsstufe 7) verwenden, um medizinische Daten (wie z. B. Vitalindikatoren ) auszutauschen.

Wir haben einige Zeit damit verbracht, dieses Protokoll zu studieren. Er kam uns etwas seltsam vor. Wir hatten noch nie mit ihm gearbeitet. Für uns war es eine neue Herausforderung.

So sehen die HL7-Nachrichten aus.


HL7-Paket

In diesem Abschnitt werden dieMessagemedizinischen DatendesPatienten wie folgt dargestellt. <CR>- Dies\rist ein Zeilenvorschubzeichen, mit dem Nachrichten getrennt werden.

MSH|^~\&|||||||ORU^R01|103|P|2.3.1|<CR>
PID|||14140f00-7bbc-0478-11122d2d02000000||WEERASINGHE^KESHARA||19960714|M|<CR>
PV1||I|^^ICU&1&3232237756&4601&&1|||||||||||||||A|||<CR>
OBR||||Mindray Monitor|||0|<CR>
OBX||NM|52^||189.0||||||F<CR>
OBX||NM|51^||100.0||||||F<CR>
OBX||ST|2301^||2||||||F<CR>
OBX||CE|2302^Blood||0^N||||||F<CR>
OBX||CE|2303^Paced||2^||||||F<CR>
OBX||ST|2308^BedNoStr||BED-001||||||F<CR>

Es sieht komisch aus, oder? Es schien uns. Es verwendet das Pipehat-Format. Das Symbol wird hier verwendet, um Datensegmente zu trennen |. Ich werde nicht viel über das Protokoll selbst sprechen. Es gibt viele Materialien im Internet darüber.

Es ist uns gelungen, gute Bibliotheken für die Verarbeitung von HL7-Nachrichten in verschiedenen Sprachen zu finden.

Warum haben wir uns für Go entschieden?


Über Go schreiben sie Folgendes: „Go oder Golang ist eine statisch typisierte Sprache, deren Syntax auf der Syntax von C basiert. Go zeichnet sich jedoch durch einige zusätzliche Funktionen aus, z. B. das Vorhandensein eines Garbage Collectors in der Sprache (wie in Java), die sichere Arbeit mit Typen und einige Funktionen für dynamisches Tippen. Go wurde 2007 von Google entwickelt. Die Sprache wurde von einer Gruppe hochqualifizierter Spezialisten erstellt. Das sind Robert Griesmer, Rob Pike und Ken Thompson. “

Go wurde mit Unterstützung für die Ausführung von Multithread-Code entwickelt. Die entsprechenden Mechanismen sind in die Sprache integriert. Go verfügt über sogenannte Goroutins und Kanäle, deren Verwendung es dem Programmierer ermöglicht, schnell und mit minimalem Aufwand Programme mit einem hohen Maß an Parallelität zu entwickeln.

Deshalb haben wir uns für Go entschieden. Wenn wir über das Problem sprechen, mit dem wir konfrontiert waren, dachten wir, dass wir uns bei der Lösung des Problems mit der Notwendigkeit befassen müssten, mit einer Vielzahl paralleler Aufgaben zu arbeiten. Darüber hinaus werden ausführbare Go-Dateien statisch kompiliert, was die Installation von Programmen auf Krankenhauscomputern vereinfacht und die Notwendigkeit einer Abhängigkeitspflege beseitigt.

Wir haben nach guten Bibliotheken gesucht, um das in Go geschriebene HL7-Protokoll zu unterstützen, und am Ende fanden wir dieses geeignet . Sein Autor hat unter anderem gutes Material über HL7 geschrieben.

Diese Bibliothek erleichtert die Arbeit mit HL7-Nachrichten erheblich.

Warum haben wir uns für Vue entschieden?


In der Vue- Dokumentation finden Sie Folgendes: „Vue (ausgesprochen / vjuː /, so etwas wie Ansicht) ist ein fortschrittliches Framework zum Erstellen von Benutzeroberflächen. Im Gegensatz zu Monolith-Frameworks ist Vue für den schrittweisen Einsatz geeignet. “

Dank der Verwendung von Vue konnten wir auf einfache Weise schöne reaktive Schnittstellen erstellen. Wir haben uns für Vue entschieden, weil es ein leistungsstarkes und praktisches Tool zum Erstellen von Schnittstellen ist. Darüber hinaus haben wir Vuetify als UI-Bibliothek verwendet.

Nachttisch Monitor


Nachdem wir das Mindray Bedside Monitor- Handbuch für Programmierer studiert hatten (es gibt viele solcher Geräte im Krankenhaus, also haben wir es ausgewählt), haben wir einen kleinen Prototyp zum Dekodieren von HL7-Nachrichten erstellt. Der Prototyp konnte Nachrichten korrekt dekodieren und korrekt in das JSON-Format konvertieren. Wir haben dies über die im Handbuch beschriebene Schnittstelle für unerwünschte Ergebnisse getan.


Mindray uMec10

Aber als wir ein echtes Gerät zur Verfügung hatten, weigerte es sich zu funktionieren. Danach begannen Keshara und ich, Pakete in Wireshark zu analysieren, um herauszufinden, was das Gerät tatsächlich tat. Wie sich herausstellte, hat das Gerät dieses Protokoll nicht verwendet. Es wurde die Echtzeit-Ergebnisschnittstelle verwendet - eine ziemlich alte Schnittstelle, die vom Hersteller nicht mehr unterstützt wurde.

Abrufen von Nachrichten aus HL7-Paketen


So rufen Sie HL7-Nachrichten von Geräten ab. Wir haben ein Objekt für diese Aufgabe verwendet bufio.Reader, da es dem Entwickler effiziente Ablaufverarbeitungsmechanismen bietet. Anstatt jedes Mal auf die Netzwerkschicht zuzugreifen, Readerkonnten wir Daten von einer TCP-Verbindung effizient lesen.

func (d *Device) ProcessHL7Packet() (hl7.Message, error) {
    //   ,   0x0B
    b, err := d.ReadByte()
    if err != nil {
        return nil, fmt.Errorf("error reading start byte: %s", err)
    }
    if b != byte(0x0B) {
        return nil, fmt.Errorf("invalid header")
    }

    //  
    payloadWithDelimiter, err := d.ReadBytes(byte(0x1C))
    if err != nil {
        return nil, fmt.Errorf("error reading payload: %s", err)
    }

    //       
    b, err = d.ReadByte()
    if err != nil {
        return nil, fmt.Errorf("error reading end byte %s", err)
    }
    if b != byte(0x0D) {
        return nil, fmt.Errorf("invalid message end")
    }

    //   2  hl7-
    payload := payloadWithDelimiter[:len(payloadWithDelimiter)-1]
    log.Debugf("Length of payload %d\n", len(payload))
    m, _, err := hl7.ParseMessage(payload)
    if err != nil {
        return nil, fmt.Errorf("error parsing hl7: %s\n", err)
    }
    return m, err
}

Systemarchitektur



Systemarchitektur ( Original )

Das System ist so konzipiert, dass es auf lange Sicht zuverlässig funktioniert. Wir haben sorgfältig die besten Tools ausgewählt, um die Herausforderungen zu lösen, denen wir gegenüberstehen.

Wir haben PostgreSQL als DBMS gewählt, da dieses System stabil und zuverlässig ist. Mit HA können Sie ein zuverlässiges Datenspeichersystem für das Überwachungssystem erstellen. Darüber hinaus unterstützt das von uns ausgewählte System die Verarbeitung großer Mengen von Eingabedaten, was für uns ein Plus war.

In Zukunft planen wir mit TimescaleDB die Erstellung eines Echtzeit-Analysesystems. Infolgedessen ist PostgreSQL zu unserer idealen Wahl geworden, da TimescaleDB auf PostgreSQL installiert werden kann.

Wir haben die Health 24-API und das Health 24-Gateway basierend auf Überlegungen zur Systemverwaltung aufgeteilt. Bei der Erstellung des Gateways haben wir uns um Kompaktheit und Zuverlässigkeit bemüht. Dank der Verwendung von Golang war die Lösung dieses Problems einfach und angenehm.

Die reale Welt betreten


Bedside-Monitore melden ihre Anwesenheit durch Senden von UDP-Nachrichten. Wir mussten diese Pakete erfassen und verarbeiten, um Daten daraus zu extrahieren, die für die Organisation des Zugriffs auf Geräte erforderlich sind.

Mit Go haben wir einen separaten Dienst erstellt, mit dem Broadcast-UDP-Übertragungen erkannt und neue Geräte im System registriert werden können. Der nächste Schritt in unserer Arbeit war das Anschließen von Geräten an das Gateway. Wir haben on Go einen weiteren Dienst erstellt, der die entsprechenden TCP-Verbindungen unterstützt.


Geräteerkennung

Da das Gateway in das Gerät als ein ClientVerbindung benötigt, mussten wir die Geräte koordinieren undtrennen. Außerdem musste der Status jedes Monitors auf dem Gateway überwacht werden.

Dank der Verwendung von Go- Kanälen konnten wir relevante Daten zur späteren Analyse problemlos in einer PostgreSQL-Datenbank speichern.

Mit Kanälen können Sie eine bequeme Interaktion zwischen Goroutinen organisieren. Ihre Verwendung war sehr praktisch.

Meine Erfahrung mit dem Kache- Projekt, einer Redis-kompatiblen speicherbasierten Datenbank, hat mir geholfen, die verschiedenen Schwierigkeiten zu lösen, mit denen wir im Verlauf unserer Arbeit konfrontiert waren.

Echtzeitausgabe von Vitalfunktionen


Bei der Entwicklung des Serverteils des Projekts haben wir uns auch mit dem Clientteil befasst. Es war für Ärzte gedacht und sollte Daten demonstrieren, die von Nachtmonitoren gelesen wurden. Das Frontend wurde hauptsächlich von Keshara besetzt. Als Ergebnis wurde in nur 3 Tagen eine sehr gute Systemschnittstelle erstellt.

Mit Vuetify haben wir ein Schnittstellenlayout erstellt, das der Oberfläche eines Nachtmonitors ähnelt .

Um den Status der Anwendung zu verwalten, haben wir Vuex verwendet und einen Warndienst entwickelt, der die Priorität von Aufgaben berücksichtigt und dazu dient, das Krankenhauspersonal bei gefährlichen Situationen zu benachrichtigen.

Wir haben die API und das Frontend mit Socket.io kombiniertDies ermöglichte es uns, einen effektiven Kommunikationskanal zu schaffen, über den die Daten in Echtzeit übertragen werden.

Ich möchte mich noch einmal bei Keshara für die hervorragende Arbeit am Frontend bedanken.


Echtzeit-Dashboard

Systembereitstellung


Bedside-Monitore senden große Datenmengen an das Netzwerk. Wir haben uns entschieden, ein separates VLAN für die Geräte und ein anderes VLAN für die API zu verwenden. Ziel war es, eine zuverlässige Verkehrsverarbeitung zu ermöglichen, ohne das Krankenhausnetzwerk zu überlasten. Darüber hinaus haben uns unsere Universitätsprofessoren Dr. Asitha Bandaranaike und Sunet Namal Karunaratna geholfen .

Dank ihrer Unterstützung konnten wir ein zuverlässiges Netzwerk aufbauen. Als Nächstes haben wir Ubuntu 18.04 auf dem Server gestartet und mit der Bereitstellung des Systems begonnen.

Keshara hat in diesem Bereich viel getan und riskiert, im Krankenhaus COVID-19 zu bekommen.


Keshara setzt ein System in einem Krankenhaus ein

Fazit des Systems in der Produktion


Hier ist ein Video, das zeigt, wie man mit dem System arbeitet.


Dr. Wikramasinghe testet das System





Wir haben den oben genannten Programmkomplex auf Anfrage von Vertretern der Gesundheitsbehörden erstellt. Dieses Projekt ist nicht kommerziell. Selbst unter Berücksichtigung des Vorhandenseins dieses Systems im Krankenhaus empfehlen wir Ärzten dringend, Patienten zu besuchen und ihre Vitalfunktionen persönlich zu überprüfen.

Da dieser Komplex im Zuge einer Pandemie sehr schnell entwickelt wurde, haben wir ihn freigegeben und ihn nur mit dem Wichtigsten ausgestattet: der Fähigkeit zur Überwachung. Darüber hinaus haben wir die langwierigen Tests mit vielen Geräten während der Tests durchgeführt. Bis jetzt hat er sich als gut erwiesen.

Dies bedeutet nicht, dass wir ein System geschaffen haben, das bereits nicht verbessert werden kann. Wir arbeiten ständig daran, es zu verbessern und Fehler zu korrigieren, um eine hohe Stabilität des Systems zu erreichen.

Daher müssen wir Ärzte warnen, dass sie dieses System mit Vorsicht verwenden sollten.

Zusammenfassung


Medizinische Mitarbeiter an der Spitze des Kampfes gegen das Virus arbeiten ohne Pause. Wir müssen ihnen alle mögliche Hilfe leisten. Wir, Studenten der Computertechnologie, haben alles getan, um sie zu unterstützen.

Das System zur Fernüberwachung des Zustands des Patienten ermöglicht die Lösung einiger Probleme ohne direkten Kontakt mit dem Patienten, was bedeutet, dass Ärzte ihre Arbeit effizienter und sicherer erledigen können.

Wir danken allen, die wunderbare Open-Source-Tools und -Bibliotheken entwickelt haben, ohne die unser Projekt nicht das Licht erblicken würde.

Die Entscheidung für Golang war eine brillante Idee. Mit dieser Sprache konnten wir in wenigen Tagen ein sehr stabiles System erstellen. Gleiches gilt für Vue. Dank dieses Frameworks konnten wir sehr schnell eine qualitativ hochwertige und benutzerfreundliche Oberfläche erstellen.

Zusammen können wir COVID-19 besiegen.

Liebe Leser! Wie würden Sie ein System erstellen, das dem in diesem Artikel beschriebenen ähnelt?


All Articles