Go, Vue e 3 dias para desenvolver: um sistema em tempo real para monitorar pacientes

Em novembro de 2019, as pessoas ouviram falar dos primeiros casos de uma doença mortal desconhecida na China. Agora todo mundo sabe que esta doença é chamada COVID-19. Aparentemente, a epidemia mudou para sempre o mundo que conhecíamos. O vírus é perigoso e muito contagioso. E a humanidade ainda não sabe muito sobre isso. Eu realmente espero que uma cura para esta doença seja encontrada em breve. A natureza do vírus é tal que é muito difícil impedir a sua propagação. No Sri Lanka, onde moro, enfrentamos a mesma situação que as pessoas de outros países. Aqui, quero falar sobre como os programadores foram capazes de fornecer toda a assistência possível àqueles que combatem a doença pessoalmente.





Riscos relacionados ao atendimento ao paciente


Uma pessoa pode ser infectada mesmo se cometer um pequeno erro. Os médicos periodicamente precisam visitar as enfermarias de isolamento infeccioso para verificar os sinais vitais dos pacientes. Depois de visitar o centro de detenção, roupas de proteção devem ser destruídas. E tudo isso é apenas observar os indicadores exibidos nas telas dos dispositivos médicos.

Representantes das autoridades de saúde nos dirigiram com uma proposta para desenvolver um sistema de monitoramento remoto de pacientes. Existem soluções de monitoramento prontas para uso que são muito caras. Mas o Sri Lanka não é um país tão rico.

Início do trabalho


Então, nós (eu e Keshara ) fizemos algumas pesquisas e descobrimos que os dispositivos que precisam ser retirados de indicadores, monitores de cabeceira, usam o protocolo HL7 comum (Nível de Saúde 7) para trocar dados médicos (como indicadores vitais).

Passamos algum tempo estudando esse protocolo. Ele parecia um pouco estranho para nós. Nós nunca tínhamos trabalhado com ele antes. Para nós, foi um novo desafio.

Aqui está a aparência das mensagens HL7.


Pacote HL7

Na seção, osMessagedados médicos do paciente são apresentados como mostrado abaixo. <CR>- Este\ré um caractere de avanço de linha usado para separar mensagens.

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>

Parece estranho, certo? Pareceu-nos. Ele usa o formato Pipehat. O símbolo é usado aqui para separar segmentos de dados |. Não vou falar muito sobre o próprio protocolo. Existem muitos materiais na Internet sobre isso.

Conseguimos encontrar boas bibliotecas para o processamento de mensagens HL7 escritas em diferentes idiomas.

Por que escolhemos Go?


Aqui está o que eles escrevem sobre Go: “Go ou Golang é uma linguagem de tipo estatístico cuja sintaxe é baseada na sintaxe de C. Mas Go é caracterizado por alguns recursos adicionais, como a presença de um coletor de lixo na linguagem (como em Java), trabalho seguro com tipos e alguns recursos para digitação dinâmica. Go foi desenvolvido pelo Google em 2007. A linguagem foi criada por um grupo de especialistas altamente qualificados. Estes são Robert Griesmer, Rob Pike e Ken Thompson. ”

O Go foi projetado com suporte para execução de código multithread, os mecanismos correspondentes são incorporados ao idioma. O Go possui os chamados goroutins e canais, cuja utilização permite ao programador desenvolver, rapidamente e com o mínimo esforço, programas com alto nível de paralelismo.

Portanto, decidimos escolher Ir. Se falarmos sobre o problema que nos confrontou, pensamos que, ao resolvê-lo, teríamos que lidar com a necessidade de trabalhar com uma infinidade de tarefas paralelas. Além disso, os executáveis ​​do Go são compilados estaticamente, o que simplifica a instalação de programas nos computadores do hospital, eliminando a necessidade de atendimento a dependências.

Procuramos boas bibliotecas para suportar o protocolo HL7 escrito em Go e, no final, achamos esse adequado . Seu autor, entre outras coisas, escreveu um bom material sobre o HL7.

Essa biblioteca facilita muito o trabalho com mensagens HL7.

Por que escolhemos Vue?


Na documentação do Vue , você pode descobrir o seguinte: “O Vue (pronunciado / vjuː /, aproximadamente como a vista) é uma estrutura progressiva para criar interfaces de usuário. Diferentemente das estruturas monolíticas, o Vue é adequado para implantação gradual. ”

Graças ao uso do Vue, conseguimos criar facilmente interfaces reativas agradáveis. Escolhemos o Vue porque é uma ferramenta poderosa e conveniente para criar interfaces. Além disso, usamos o Vuetify como uma biblioteca de interface do usuário.

Monitor de cabeceira


Depois de estudarmos o manual do Mindray Bedside Monitor para programadores (existem muitos desses dispositivos no hospital, então escolhemos), criamos um pequeno protótipo para decodificar mensagens HL7. O protótipo conseguiu decodificar corretamente as mensagens e convertê-las corretamente para o formato JSON. Fizemos isso usando a Interface de resultado não solicitado descrita no manual.


Mindray uMec10

Mas quando tínhamos um dispositivo real à nossa disposição, ele se recusava a funcionar. Depois disso, Keshara e eu começamos a analisar pacotes no Wireshark, tentando descobrir o que o dispositivo estava realmente fazendo. Como se viu, o dispositivo não usou esse protocolo. Ele usou a Interface de resultados em tempo real - uma interface bastante antiga que não era mais suportada pelo fabricante.

Recuperando mensagens de pacotes HL7


Veja como recuperar mensagens HL7 dos dispositivos. Usamos um objeto para esta tarefa bufio.Reader, pois ela fornece ao desenvolvedor mecanismos eficientes de processamento de fluxo. Em vez de acessar a camada de rede de cada vez, Readernos permitiu ler com eficiência dados de uma conexão 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
}

Arquitetura do sistema



Arquitetura do sistema ( original )

O sistema foi projetado para que, a longo prazo, funcione de maneira confiável. Selecionamos cuidadosamente as melhores ferramentas para resolver os desafios que enfrentamos.

Escolhemos o PostgreSQL como DBMS, pois esse sistema é estável e confiável. Ao usar o HA, você pode criar um sistema confiável de armazenamento de dados para o sistema de monitoramento. Além disso, o sistema que selecionamos suporta o processamento de grandes volumes de dados de entrada, o que foi uma vantagem para nós.

No futuro, usando o TimescaleDB, planejamos criar um sistema de análise em tempo real. Como resultado, o PostgreSQL se tornou a escolha ideal, pois o TimescaleDB pode ser instalado no PostgreSQL.

Dividimos a API do Health 24 e o gateway do Health 24 com base em considerações de gerenciamento do sistema. Ao criar o gateway, buscamos compacidade e confiabilidade. Graças ao uso do Golang, a solução desse problema foi fácil e agradável.

Entrando no mundo real


Os monitores de cabeceira relatam sua presença transmitindo mensagens UDP. Precisávamos capturar e processar esses pacotes para extrair dados deles necessários para organizar o acesso aos dispositivos.

Usando o Go, criamos um serviço separado, projetado para detectar transmissões UDP de broadcast e registrar novos dispositivos no sistema. O próximo passo no nosso trabalho foi conectar dispositivos ao gateway. Criamos no Go outro serviço projetado para oferecer suporte às conexões TCP correspondentes.


Descoberta de dispositivos

Como o gateway precisava se conectar ao dispositivo como um cliente, tivemos que coordenar e desconectar os dispositivos. Além disso, o status de cada monitor precisava ser monitorado no gateway.

Através do uso de canais Go, podemos facilmente armazenar dados relevantes em um banco de dados PostgreSQL para análise posterior.

Os canais permitem que você organize uma interação conveniente entre goroutines. Usá-los foi muito conveniente.

Minha experiência com o projeto Kache , que é um banco de dados baseado em memória compatível com Redis, foi útil para resolver as várias dificuldades que nos enfrentaram no decorrer de nosso trabalho.

Saída em tempo real de sinais vitais


Ao desenvolver a parte do servidor do projeto, também lidamos com a parte do cliente. Destina-se a médicos e visa demonstrar dados lidos em monitores de cabeceira. O frontend foi ocupado principalmente por Keshara. Como resultado, uma interface de sistema muito boa foi criada em apenas 3 dias.

Usando o Vuetify , criamos um layout de interface que parecia a interface de um monitor de cabeceira.

Para gerenciar o estado do aplicativo, usamos o Vuex e desenvolvemos um serviço de alerta que leva em consideração a prioridade das tarefas, que é usada para alertar a equipe do hospital em caso de situações perigosas. Combinamos

a API e o front-end usando o Socket.io, o que nos permitiu criar um canal de comunicação eficaz, cujos dados são transmitidos em tempo real.

Quero agradecer novamente a Keshara pelo excelente trabalho no frontend.


Painel em tempo real

Implantação do sistema


Os monitores de cabeceira enviam grandes quantidades de dados para a rede. Decidimos usar uma VLAN separada para os dispositivos e outra VLAN para a API. O objetivo disso era permitir o processamento confiável do tráfego sem criar congestionamentos na rede hospitalar. Além disso, fomos assistidos por nossos professores universitários, Dr. Asitha Bandaranaike e Sunet Namal Karunaratna .

Graças ao seu apoio, conseguimos estabelecer uma rede confiável. Em seguida, lançamos o Ubuntu 18.04 no servidor e começamos a implantar o sistema.

Keshara fez muito nessa área, arriscando contratar o COVID-19 no hospital.


Keshara está implantando um sistema em um hospital

Conclusão do sistema em produção


Aqui está um vídeo mostrando como trabalhar com o sistema.


Dr. Wikramasinghe testa o sistema





Criamos o complexo do programa acima, a pedido de representantes das autoridades de saúde. Este projeto não é comercial. Mesmo levando em consideração a presença desse sistema no hospital, é altamente recomendável que os médicos visitem os pacientes e verifiquem pessoalmente seus sinais vitais.

Como esse complexo foi desenvolvido muito rapidamente, em uma pandemia, nós o liberamos, equipando-o apenas com o mais importante: a capacidade de monitorar. Além disso, realizamos seus longos testes, usando muitos dispositivos durante os testes. Até agora, ele se mostrou bom.

Isso não indica que criamos um sistema que já é impossível de melhorar. Trabalhamos constantemente para aprimorá-lo e corrigir erros, alcançando alta estabilidade do sistema.

Como resultado, devemos advertir os médicos de que eles devem usar este sistema com cautela.

Sumário


Trabalhadores médicos na vanguarda da batalha contra o vírus trabalham sem descanso. Devemos fornecer a eles toda a assistência possível. Nós, estudantes de tecnologia da computação, fizemos todo o possível para apoiá-los.

O sistema de monitoramento remoto da condição dos pacientes permite solucionar alguns problemas sem contato direto com os pacientes, o que significa que ajuda os médicos a realizar seu trabalho com mais eficiência e segurança.

Agradecemos a todos que desenvolveram maravilhosas ferramentas e bibliotecas de código aberto, sem as quais nosso projeto não estaria destinado a ver a luz.

A decisão de usar Golang foi uma idéia brilhante. O uso dessa linguagem nos permitiu criar um sistema muito estável em apenas alguns dias. O mesmo pode ser dito de Vue. Graças a essa estrutura, conseguimos criar rapidamente uma interface de alta qualidade e fácil de usar.

Juntos, podemos derrotar o COVID-19.

Queridos leitores! Como você construiria um sistema semelhante ao descrito neste artigo?


All Articles