Go, Vue y 3 días para desarrollar: un sistema en tiempo real para monitorear pacientes

En noviembre de 2019, la gente escuchó sobre los primeros casos de una enfermedad mortal desconocida en China. Ahora todos saben que esta enfermedad se llama COVID-19. Aparentemente, la epidemia cambió para siempre el mundo que conocíamos. El virus es peligroso y muy contagioso. Y la humanidad aún no sabe mucho al respecto. Realmente espero que pronto se encuentre una cura para esta enfermedad. La naturaleza del virus es tal que es muy difícil evitar su propagación. En Sri Lanka, donde vivo, nos enfrentamos a la misma situación que las personas en otros países. Aquí quiero hablar sobre cómo los programadores pudieron brindar toda la asistencia posible a aquellos que luchan contra la enfermedad cara a cara.





Riesgos relacionados con la atención al paciente.


Una persona puede infectarse incluso si comete un pequeño error. Los médicos periódicamente tienen que visitar salas de aislamiento infeccioso para verificar los signos vitales de los pacientes. Después de visitar el centro de detención, los trajes de protección deben ser destruidos. Y todo esto es solo para mirar los indicadores que se muestran en las pantallas de los dispositivos médicos.

Representantes de las autoridades sanitarias se dirigieron a nosotros con una propuesta para desarrollar un sistema de monitoreo remoto de pacientes. Existen soluciones de monitoreo llave en mano que son muy caras. Pero Sri Lanka no es un país tan rico.

Comienzo de trabajo


Entonces, nosotros ( Keshara y yo ) investigamos un poco y descubrimos que los dispositivos que deben tomarse de los indicadores, los monitores de cabecera, usan el protocolo común HL7 (Nivel de salud 7) para intercambiar datos médicos (como indicadores vitales).

Pasamos un tiempo estudiando este protocolo. Nos pareció un poco extraño. Nunca habíamos trabajado con él antes. Para nosotros fue un nuevo desafío.

Así es como se ven los mensajes HL7.


Paquete HL7

En la sección, losMessagedatos médicos del paciente se presentan como se muestra a continuación. <CR>- Este\res un carácter de avance de línea utilizado para separar mensajes.

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>

Se ve raro, ¿verdad? Nos pareció a nosotros. Utiliza el formato Pipehat. El símbolo se usa aquí para separar segmentos de datos |. No voy a hablar mucho sobre el protocolo en sí. Hay muchos materiales en Internet sobre esto.

Logramos encontrar buenas bibliotecas para procesar mensajes HL7 escritos en diferentes idiomas.

¿Por qué elegimos ir?


Esto es lo que escriben sobre Go: “Go o Golang es un lenguaje estáticamente tipado cuya sintaxis se basa en la sintaxis de C. Pero Go se caracteriza por algunas características adicionales como la presencia de un recolector de basura en el lenguaje (como en Java), trabajo seguro con tipos y algunas características para escritura dinámica Go fue desarrollado por Google en 2007. El lenguaje fue creado por un grupo de especialistas altamente calificados. Estos son Robert Griesmer, Rob Pike y Ken Thompson ".

Go está diseñado con soporte para la ejecución de código multiproceso, los mecanismos correspondientes están integrados en el lenguaje. Go tiene los llamados goroutins y canales, cuyo uso permite al programador desarrollar rápidamente y con un mínimo esfuerzo programas con un alto nivel de paralelismo.

Por lo tanto, decidimos elegir Ir. Si hablamos sobre el problema que nos enfrentamos, entonces pensamos que, al resolverlo, tendríamos que lidiar con la necesidad de trabajar con una multitud de tareas paralelas. Además, los ejecutables Go se compilan estáticamente, lo que simplifica la instalación de programas en las computadoras del hospital, eliminando la necesidad de atención de dependencia.

Buscamos buenas bibliotecas para que soporte el protocolo HL7 escrito en Ir, y al final encontramos esta uno adecuado . Su autor, entre otras cosas, escribió un buen material sobre HL7.

Esta biblioteca facilita enormemente el trabajo con mensajes HL7.

¿Por qué elegimos Vue?


De la documentación de Vue , puede encontrar lo siguiente: “Vue (pronunciado / vjuː /, algo así como ver) es un marco progresivo para crear interfaces de usuario. A diferencia de los marcos monolíticos, Vue está hecho para un despliegue gradual ".

Gracias al uso de Vue, pudimos crear fácilmente interfaces reactivas agradables. Elegimos Vue porque es una herramienta poderosa y conveniente para crear interfaces. Además, utilizamos Vuetify como una biblioteca de interfaz de usuario.

Monitor de cabecera


Después de estudiar el manual de Mindray Bedside Monitor para programadores (hay muchos de estos dispositivos en el hospital, así que lo elegimos), creamos un pequeño prototipo para decodificar mensajes HL7. El prototipo pudo decodificar correctamente los mensajes y convertirlos correctamente al formato JSON. Lo hicimos utilizando la interfaz de resultados no solicitados que se describe en el manual.


Mindray uMec10

Pero cuando teníamos un dispositivo real a nuestra disposición, se negaba a funcionar. Después de eso, Keshara y yo comenzamos a analizar paquetes en Wireshark, tratando de descubrir qué estaba haciendo realmente el dispositivo. Al final resultó que, el dispositivo no utilizó este protocolo. Utilizó la interfaz de resultados en tiempo real, una interfaz bastante antigua que ya no era compatible con el fabricante.

Recuperando mensajes de paquetes HL7


Aquí se explica cómo recuperar mensajes HL7 de dispositivos. Utilizamos un objeto para esta tarea bufio.Reader, ya que proporciona al desarrollador mecanismos eficientes de procesamiento de flujo. En lugar de acceder a la capa de red cada vez, Readernos permitió leer eficientemente los datos de una conexión 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
}

Arquitectura del sistema



Arquitectura del sistema ( original )

El sistema está diseñado para que, a la larga, funcione de manera confiable. Hemos seleccionado cuidadosamente las mejores herramientas para resolver los desafíos que enfrentamos.

Elegimos PostgreSQL como DBMS, ya que este sistema es estable y confiable. Al usar HA, puede crear un sistema de almacenamiento de datos confiable para el sistema de monitoreo. Además, el sistema que seleccionamos admite el procesamiento de grandes volúmenes de datos de entrada, lo que fue una ventaja para nosotros.

En el futuro, usando TimescaleDB, planeamos crear un sistema de análisis en tiempo real. Como resultado, PostgreSQL se ha convertido en nuestra opción ideal, ya que TimescaleDB se puede instalar sobre PostgreSQL.

Dividimos la API Health 24 y la puerta de enlace Health 24 según las consideraciones de administración del sistema. Al crear la puerta de enlace, nos esforzamos por ser compactos y confiables. Gracias al uso de Golang, resolver este problema fue fácil y agradable.

Entrando en el mundo real


Los monitores de cabecera informan su presencia transmitiendo mensajes UDP. Necesitábamos capturar y procesar estos paquetes para extraer los datos necesarios para organizar el acceso a los dispositivos.

Usando Go, creamos un servicio separado diseñado para detectar transmisiones UDP de difusión y registrar nuevos dispositivos en el sistema. El siguiente paso en nuestro trabajo fue conectar dispositivos a la puerta de enlace. Hemos creado en Go otro servicio diseñado para soportar las conexiones TCP correspondientes.


Detección de dispositivos

Dado que la puerta de enlace necesitaba conectarse al dispositivo como cliente, tuvimos que coordinar y desconectar los dispositivos. Además, el estado de cada monitor tenía que ser monitoreado en la puerta de enlace.

Mediante el uso de canales Go, podríamos almacenar fácilmente datos relevantes en una base de datos PostgreSQL para su posterior análisis.

Los canales le permiten organizar una interacción conveniente entre goroutines. Usarlos fue muy conveniente.

Mi experiencia con el proyecto Kache , que es una base de datos basada en memoria compatible con Redis, me fue útil para resolver las diversas dificultades que nos enfrentaron en el transcurso de nuestro trabajo.

Salida en tiempo real de signos vitales.


Mientras desarrollamos la parte del servidor del proyecto, también tratamos con su parte del cliente. Estaba destinado a médicos y tenía como objetivo demostrar los datos leídos desde los monitores de cabecera. La interfaz estaba ocupada principalmente por Keshara. Como resultado, se creó una muy buena interfaz del sistema en solo 3 días.

Usando Vuetify , creamos un diseño de interfaz que se parecía a la interfaz de un monitor de cabecera.

Para gestionar el estado de la aplicación, utilizamos Vuex y desarrollamos un servicio de alerta que tiene en cuenta la prioridad de las tareas, que se utiliza para notificar al personal del hospital en caso de situaciones peligrosas.

Combinamos la API y la interfaz usando Socket.io, lo que nos permitió crear un canal de comunicación efectivo, cuyos datos se transmiten en tiempo real.

Quiero agradecer nuevamente a Keshara por el excelente trabajo en la interfaz.


Tablero de instrumentos en tiempo real

Despliegue del sistema


Los monitores de cabecera envían grandes cantidades de datos a la red. Decidimos usar una VLAN separada para los dispositivos y otra VLAN para la API. El propósito de esto era permitir un procesamiento de tráfico confiable sin crear congestión en la red del hospital. Además, nos ayudaron nuestros profesores universitarios: la Dra. Asitha Bandaranaike y Sunet Namal Karunaratna .

Gracias a su apoyo, pudimos establecer una red confiable. Luego, lanzamos Ubuntu 18.04 en el servidor y comenzamos a implementar el sistema.

Keshara ha hecho mucho en esta área, arriesgándose a contraer COVID-19 en el hospital.


Keshara está desplegando un sistema en un hospital

Conclusión del sistema en producción.


Aquí hay un video que muestra cómo trabajar con el sistema.


El Dr. Wikramasinghe prueba el sistema





Hemos creado el complejo del programa anterior a solicitud de representantes de las autoridades sanitarias. Este proyecto no es comercial. Incluso teniendo en cuenta la presencia de este sistema en el hospital, recomendamos enfáticamente que los médicos visiten a los pacientes y verifiquen personalmente sus signos vitales.

Dado que este complejo se desarrolló muy rápidamente, en una pandemia, lo lanzamos y lo equipamos con solo lo más importante: la capacidad de monitorear. Además, realizamos sus largas pruebas, utilizando muchos dispositivos durante las pruebas. Hasta ahora, se ha mostrado bueno.

Esto no indica que hayamos creado un sistema que ya es imposible de mejorar. Trabajamos constantemente para mejorarlo y corregir errores, logrando una alta estabilidad del sistema.

Como resultado, debemos advertir a los médicos que deben usar este sistema con precaución.

Resumen


Los trabajadores médicos al frente de la batalla contra el virus trabajan sin descanso. Debemos proporcionarles toda la asistencia posible. Nosotros, estudiantes de tecnología informática, hicimos todo lo posible para apoyarlos.

El sistema de monitoreo remoto de la condición de los pacientes permite resolver algunos problemas sin contacto directo con los pacientes, lo que significa que ayuda a los médicos a hacer su trabajo de manera más eficiente y segura.

Agradecemos a todos los que han desarrollado maravillosas herramientas y bibliotecas de código abierto, sin las cuales nuestro proyecto no estaría destinado a ver la luz.

La decisión de usar Golang fue una idea brillante. El uso de este lenguaje nos permitió crear un sistema muy estable en solo unos días. Lo mismo se puede decir de Vue. Gracias a este marco, pudimos crear rápidamente una interfaz de alta calidad y fácil de usar.

Juntos podemos derrotar a COVID-19.

¡Queridos lectores! ¿Cómo desarrollarías un sistema similar al descrito en este artículo?


All Articles