Go, Vue et 3 jours pour développer: un système de suivi des patients en temps réel

En novembre 2019, les gens ont entendu parler des premiers cas d'une maladie mortelle inconnue en Chine. Maintenant, tout le monde sait que cette maladie s'appelle COVID-19. Apparemment, l'épidémie a changé à jamais le monde que nous connaissions. Le virus est dangereux et très contagieux. Et l'humanité n'en sait pas encore grand-chose. J'espère vraiment qu'un remède à cette maladie sera bientôt trouvé. La nature du virus est telle qu'il est très difficile d'empêcher sa propagation. Au Sri Lanka, où j'habite, nous sommes confrontés à la même situation que les habitants d'autres pays. Ici, je veux parler de la façon dont les programmeurs ont pu fournir toute l'aide possible à ceux qui combattent la maladie face à face.





Risques liés aux soins aux patients


Une personne peut être infectée même si elle commet une petite erreur. Les médecins doivent périodiquement visiter les services d'isolement infectieux pour vérifier les signes vitaux des patients. Après avoir visité le centre de détention, les combinaisons de protection doivent être détruites. Et tout cela, c'est juste pour regarder les indicateurs affichés sur les écrans des dispositifs médicaux.

Des représentants des autorités sanitaires nous ont adressé une proposition visant à développer un système de télésurveillance des patients. Il existe des solutions de surveillance clé en main qui sont très coûteuses. Mais le Sri Lanka n'est pas un pays aussi riche.

Début des travaux


Donc, nous (I et Keshara ) avons fait des recherches et avons découvert que les appareils qui doivent être prélevés sur les indicateurs, les moniteurs de chevet, utilisent le protocole commun HL7 (niveau de santé 7) pour échanger des données médicales (telles que les indicateurs vitaux).

Nous avons passé un peu de temps à étudier ce protocole. Il nous semblait un peu étrange. Nous n'avions jamais travaillé avec lui auparavant. Pour nous, c'était un nouveau défi.

Voici à quoi ressemblent les messages HL7.


Package HL7

Dans la section, lesMessagedonnées médicales du patient sont présentées comme indiqué ci-dessous. <CR>- Il\rs'agit d'un caractère de saut de ligne utilisé pour séparer les messages.

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>

Ça a l'air bizarre, non? Cela nous a semblé. Il utilise le format Pipehat. Le symbole est utilisé ici pour séparer les segments de données |. Je ne vais pas parler beaucoup du protocole lui-même. Il existe de nombreux documents sur Internet à ce sujet.

Nous avons réussi à trouver de bonnes bibliothèques pour traiter les messages HL7 écrits dans différentes langues.

Pourquoi avons-nous choisi Go?


Voici ce qu'ils écrivent à propos de Go: «Go ou Golang est un langage à typage statique dont la syntaxe est basée sur la syntaxe de C. frappe dynamique. Go a été développé par Google en 2007. La langue a été créée par un groupe de spécialistes hautement qualifiés. Ce sont Robert Griesmer, Rob Pike et Ken Thompson. »

Go est conçu avec un support pour l'exécution de code multi-thread, les mécanismes correspondants sont intégrés dans le langage. Go a ce qu'on appelle des goroutins et des canaux, dont l'utilisation permet au programmeur de développer rapidement et avec un minimum d'effort des programmes avec un haut niveau de parallélisme.

Par conséquent, nous avons décidé de choisir Go. Si nous parlons du problème auquel nous sommes confrontés, nous pensons que, pour le résoudre, nous devrons faire face à la nécessité de travailler avec une variété de tâches parallèles. De plus, les exécutables Go sont compilés de manière statique, ce qui simplifie l'installation des programmes sur les ordinateurs des hôpitaux, éliminant ainsi le besoin de soins de dépendance.

Nous avons cherché de bonnes bibliothèques pour prendre en charge le protocole HL7 écrit en Go, et à la fin nous avons trouvé celui- ci convenable . Son auteur, entre autres, a écrit de bons articles sur HL7.

Cette bibliothèque facilite grandement le travail avec les messages HL7.

Pourquoi avons-nous choisi Vue?


Dans la documentation de Vue , vous pouvez trouver ce qui suit: «Vue (prononcé / vjuː /, quelque chose comme view) est un cadre progressif pour créer des interfaces utilisateur. Contrairement aux cadres monolithiques, Vue est conçu pour un déploiement progressif. »

Grâce à l'utilisation de Vue, nous avons pu créer facilement de belles interfaces réactives. Nous avons choisi Vue parce que c'est un outil puissant et pratique pour créer des interfaces. De plus, nous avons utilisé Vuetify comme bibliothèque d'interface utilisateur.

Moniteur de chevet


Après avoir étudié le manuel Mindray Bedside Monitor pour les programmeurs (il y a beaucoup de tels appareils à l'hôpital, nous l'avons donc choisi), nous avons créé un petit prototype pour décoder les messages HL7. Le prototype a pu décoder correctement les messages et les convertir correctement au format JSON. Nous l'avons fait en utilisant l'interface des résultats non sollicités décrite dans le manuel.


Mindray uMec10

Mais quand nous avions un vrai appareil à notre disposition, il refusait de fonctionner. Après cela, Keshara et moi avons commencé à analyser les paquets dans Wireshark, essayant de comprendre ce que l'appareil faisait réellement. Il s'est avéré que l'appareil n'a pas utilisé ce protocole. Il utilisait l'interface de résultat en temps réel - une interface assez ancienne qui n'était plus prise en charge par le fabricant.

Récupération des messages des packages HL7


Voici comment récupérer des messages HL7 à partir d'appareils. Nous avons utilisé un objet pour cette tâche bufio.Reader, car il fournit au développeur des mécanismes de traitement de flux efficaces. Au lieu d'accéder à la couche réseau à chaque fois, Readercela nous a permis de lire efficacement les données d'une connexion TCP.

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
}

Architecture du système



Architecture du système (d' origine )

Le système est conçu de manière à ce que, à long terme, il fonctionne de manière fiable. Nous avons soigneusement sélectionné les meilleurs outils pour résoudre les défis auxquels nous sommes confrontés.

Nous avons choisi PostgreSQL comme SGBD, car ce système est stable et fiable. En utilisant HA, vous pouvez créer un système de stockage de données fiable pour le système de surveillance. De plus, le système que nous avons sélectionné prend en charge le traitement de grands volumes de données d'entrée, ce qui était un plus pour nous.

À l'avenir, en utilisant TimescaleDB, nous prévoyons de créer un système d'analyse en temps réel. En conséquence, PostgreSQL est devenu notre choix idéal, car TimescaleDB peut être installé sur PostgreSQL.

Nous avons divisé l'API Health 24 et la passerelle Health 24 en fonction de considérations de gestion du système. Lors de la création de la passerelle, nous avons recherché la compacité et la fiabilité. Grâce à l'utilisation de Golang, la résolution de ce problème a été facile et agréable.

Entrer dans le monde réel


Des surveillants de chevet signalent leur présence en diffusant des messages UDP. Nous devions capturer et traiter ces paquets pour en extraire les données nécessaires à l'organisation de l'accès aux appareils.

À l'aide de Go, nous avons créé un service distinct conçu pour détecter les transmissions UDP diffusées et enregistrer de nouveaux périphériques dans le système. La prochaine étape de notre travail consistait à connecter des appareils à la passerelle. Nous avons créé sur Go un autre service conçu pour prendre en charge les connexions TCP correspondantes.


Découverte de périphérique

Étant donné que la passerelle devait se connecter au périphérique en tant que client, nous avons dû coordonner et déconnecter les périphériques. De plus, l'état de chaque moniteur devait être surveillé sur la passerelle.

Grâce à l'utilisation des canaux Go, nous pourrions facilement stocker les données pertinentes dans une base de données PostgreSQL pour une analyse ultérieure.

Les canaux vous permettent d'organiser une interaction pratique entre les goroutines. Les utiliser était très pratique.

Mon expérience avec le projet Kache , qui est une base de données basée sur la mémoire compatible avec Redis, m'a été utile pour résoudre les différentes difficultés que nous avons rencontrées au cours de notre travail.

Sortie en temps réel des signes vitaux


Lors du développement de la partie serveur du projet, nous avons également traité sa partie client. Il était destiné aux médecins et visait à démontrer les données lues sur les moniteurs de chevet. Le frontend était principalement occupé par Keshara. En conséquence, une très bonne interface système a été créée en seulement 3 jours.

En utilisant Vuetify , nous avons créé une disposition d'interface qui ressemblait à l'interface d'un moniteur de chevet.

Pour gérer l'état de l'application, nous avons utilisé Vuex et développé un service d'alerte qui prend en compte la priorité des tâches, qui sert à prévenir le personnel hospitalier en cas de situations dangereuses.

Nous avons combiné l'API et le frontend en utilisant Socket.io, ce qui nous a permis de créer un canal de communication efficace, dont les données sont transmises en temps réel.

Je tiens à remercier encore une fois Keshara pour l'excellent travail sur le frontend.


Tableau de bord en temps réel

Déploiement du système


Les moniteurs de chevet envoient de grandes quantités de données au réseau. Nous avons décidé d'utiliser un VLAN distinct pour les appareils et un autre VLAN pour l'API. L'objectif était de permettre un traitement fiable du trafic sans créer de congestion dans le réseau hospitalier. De plus, nous avons été aidés par nos professeurs d'université - Dr. Asitha Bandaranaike et Sunet Namal Karunaratna .

Grâce à leur soutien, nous avons pu mettre en place un réseau fiable. Ensuite, nous avons lancé Ubuntu 18.04 sur le serveur et commencé à déployer le système.

Keshara a fait beaucoup dans ce domaine, risquant de contracter COVID-19 à l'hôpital.


Keshara déploie un système dans un hôpital

Conclusion du système en production


Voici une vidéo montrant comment travailler avec le système.


Le Dr Wikramasinghe teste le système





Nous avons créé le complexe de programmes ci-dessus à la demande de représentants des autorités sanitaires. Ce projet n'est pas commercial. Même en tenant compte de la présence de ce système à l'hôpital, nous recommandons fortement aux médecins de visiter les patients et de vérifier personnellement leurs signes vitaux.

Comme ce complexe a été développé très rapidement, lors d'une pandémie, nous l'avons libéré, en ne l'équipant que du plus important: la capacité de surveillance. De plus, nous avons effectué ses longs tests, en utilisant de nombreux appareils pendant les tests. Jusqu'à présent, il s'est montré bon.

Cela ne signifie pas que nous avons créé un système qui est déjà impossible à améliorer. Nous travaillons constamment pour l'améliorer et corriger les erreurs, en obtenant une stabilité élevée du système.

Par conséquent, nous devons avertir les médecins qu'ils doivent utiliser ce système avec prudence.

Sommaire


Les travailleurs médicaux à l'avant-garde de la lutte contre le virus travaillent sans repos. Nous devons leur fournir toute l'assistance possible. Nous, étudiants en informatique, avons fait tout notre possible pour les soutenir.

Le système de surveillance à distance de l'état des patients permet de résoudre certains problèmes sans contact direct avec les patients, ce qui signifie qu'il aide les médecins à faire leur travail plus efficacement et en toute sécurité.

Nous remercions tous ceux qui ont développé de merveilleux outils et bibliothèques open source, sans lesquels notre projet ne serait pas destiné à voir le jour.

La décision d'utiliser Golang était une idée brillante. L'utilisation de ce langage nous a permis de créer un système très stable en quelques jours seulement. On peut en dire autant de Vue. Grâce à ce framework, nous avons pu créer très rapidement une interface de haute qualité et conviviale.

Ensemble, nous pouvons vaincre COVID-19.

Chers lecteurs! Comment feriez-vous pour construire un système similaire à celui décrit dans cet article?


All Articles