Go,Vue和3天的开发时间:用于监控患者的实时系统

2019年11月,人们听说了中国首例未知的致命疾病病例。现在每个人都知道这种疾病称为COVID-19。显然,这种流行病永远改变了我们所知道的世界。该病毒是危险的,具有极强的传染性。人类对此还不了解。我真的希望能尽快找到治愈这种疾病的方法。 病毒的性质使得很难阻止其传播。在我居住的斯里兰卡,我们面临着与其他国家的人同样的处境。在这里,我想谈一谈程序员如何能够为面对疾病的人们提供所有可能的帮助。





与患者护理有关的风险


一个人即使犯了一个小错误也可能被感染。医生需要定期去感染隔离病房检查病人的生命体征。参观拘留中心后,必须销毁防护服。而所有这些只是看医疗设备屏幕上显示的指示器。

卫生当局的代表向我们提出了一项建议,以开发一种用于远程监控患者的系统。有些交钥匙监控解决方案非常昂贵。但是斯里兰卡不是一个富裕的国家。

开始工作


因此,我们(我和Keshara)进行了一些研究,发现需要从指示器,床旁监护仪中取出的设备使用通用的HL7协议(健康等级7)来交换医学数据(例如生命指标)。

我们花了一些时间研究此协议。他对我们似乎有些陌生。我们以前从未与他合作过。对我们来说,这是一个新的挑战。

HL7消息如下所示。


HL7包装

在该部分中,Message如下所示显示患者的医疗数据。<CR>-这\r是换行符,用于分隔消息。

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>

看起来很奇怪吧?在我们看来。它使用Pipehat格式。该符号在此处用于分隔数据段|我不会谈论太多有关协议本身的内容。互联网上有许多有关此的资料。

我们设法找到了很好的库来处理用不同语言编写的HL7消息。

我们为什么选择Go?


这是他们写的关于Go的内容:“ Go或Golang是一种静态类型的语言,其语法基于C的语法。但是Go的特征是具有一些附加功能,例如该语言中存在垃圾收集器(如Java),类型的安全工作以及一些用于动态类型。 Go由Google在2007年开发。该语言是由一群高技能的专家创建的。这些是Robert Griesmer,Rob Pike和Ken Thompson。”

Go的设计支持多线程代码执行,该语言内置了相应的机制。 Go具有所谓的goroutins和通道,程序员可以通过它们使用它们并快速地开发具有高度并行性的程序。

因此,我们决定选择Go。如果我们谈论我们面临的问题,那么我们认为,在解决这一问题时,我们将不得不处理处理各种并行任务的需求。此外,Go可执行文件是静态编译的,从而简化了在医院计算机上程序的安装,从而消除了对依赖关系的需要。

我们寻找了很好的库来支持用Go编写的HL7协议,最后我们发现一个合适的库它的作者除其他外,撰写了有关HL7的材料

该库极大地简化了HL7消息的工作。

我们为什么选择Vue?


Vue 文档中,您可以找到以下内容:“ Vue(发音为/vjuː/,类似于view)是用于创建用户界面的渐进框架。与整体框架不同,Vue适合逐步部署。”

由于使用了Vue,我们能够轻松创建漂亮的反应式接口。我们选择Vue是因为它是创建界面的强大而便捷的工具。另外,我们使用Vuetify作为UI库。

床头监视器


在研究面向程序员 Mindray床头监视器手册(医院中有很多此类设备,因此我们选择了它)之后,我们创建了一个用于解码HL7消息的小型原型。该原型能够正确解码消息并将其正确转换为JSON格式。我们使用手册中描述的未经请求的结果界面进行了此操作。


Mindray uMec10

但是,当我们拥有一台真正的设备可供使用时,它就无法工作。在那之后,我和Keshara开始在Wireshark中分析数据包,试图弄清设备的实际功能。事实证明,该设备未使用此协议。它使用了实时结果界面-制造商不再支持的相当旧的界面。

从HL7包中检索消息


这是从设备检索HL7消息的方法。我们使用一个对象来完成此任务bufio.Reader,因为它为开发人员提供了有效的流程处理机制。Reader它使我们能够从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
}

系统架构



系统架构(原始

该系统经过精心设计,从长远来看,它可以可靠地运行。我们精心挑选了最佳工具来解决我们面临的挑战。

我们选择PostgreSQL作为DBMS,因为该系统稳定可靠。通过使用HA,可以为监视系统创建可靠的数据存储系统。此外,我们选择的系统支持处理大量输入数据,这对我们来说是一个加分项。

将来,我们计划使用TimescaleDB创建一个实时分析系统。因此,PostgreSQL已成为我们的理想选择,因为TimescaleDB可以安装在PostgreSQL之上。

我们根据系统管理注意事项拆分了Health 24 API和Health 24网关。创建网关时,我们力求紧凑和可靠性。由于使用了Golang,解决此问题变得轻松而愉快。

进入现实世界


床头监视器通过广播UDP消息报告其存在。我们需要捕获并处理这些数据包以从中提取数据,这是组织访问设备所必需的。

使用Go,我们创建了一个单独的服务,该服务旨在检测广播UDP传输并在系统中注册新设备。我们工作的下一步是将设备连接到网关。我们在Go上创建了另一个服务,该服务旨在支持相应的TCP连接。


设备发现

由于网关需要作为客户端连接到设备,因此我们必须协调和断开设备连接。另外,必须在网关上监视每个监视器的状态。

通过使用Go通道,我们可以轻松地将相关数据存储在PostgreSQL数据库中以供以后分析。

通过通道,您可以组织goroutine之间的便捷交互。使用它们非常方便。

我对 Kache项目的经验,这是一个Redis兼容的基于内存的数据库,对我解决工作过程中遇到的各种困难非常有用。

实时输出生命体征


在开发项目的服务器部分时,我们还处理了其客户端部分。它是为医生准备的,旨在演示从床头监护仪读取的数据。前端主要由Keshara占用。结果,在短短三天内就创建了一个非常好的系统界面。

使用Vuetify,我们创建了一个界面布局,看起来像床头监视器的界面。

为了管理应用程序的状态,我们使用了Vuex并开发了一种警报服务,该服务考虑了任务的优先级,用于在发生危险情况时通知医院工作人员。

我们使用Socket.io将API和前端结合在一起,这使我们能够创建有效的通信渠道,并通过该渠道实时传输数据。

我要再次感谢Keshara在前端方面所做的出色工作。


实时仪表板

系统部署


床头监视器将大量数据发送到网络。我们决定为设备使用单独的VLAN,为API使用另一个VLAN。其目的是在不造成医院网络拥塞的情况下实现可靠​​的流量处理。此外,我们的大学教授Asitha Bandaranaike博士Sunet Namal Karunaratna也为我们提供了帮助

由于他们的支持,我们得以建立可靠的网络。接下来,我们在服务器上启动了Ubuntu 18.04,并开始部署系统。

Keshara在这方面做了很多工作,冒着在医院感染COVID-19的风险。


Keshara正在医院中部署系统

系统在生产中的结论


这是显示如何使用系统视频。


Wikramasinghe博士对系统进行了测试





我们应卫生当局代表的要求创建了上述计划综合体。该项目不是商业性的。即使考虑到该系统在医院中的存在,我们也强烈建议医生拜访患者并亲自检查其生命体征。

由于此复合体发展很快,因此在大流行中,我们发布了该复合体,仅为其配备了最重要的功能:监视能力。此外,我们在测试过程中使用许多设备进行了冗长的测试。到现在为止,他已经证明自己很出色。

这并不表示我们已经创建了无法改进的系统。我们一直在努力改进它并纠正错误,以实现系统的高度稳定性。

因此,我们必须警告医生,他们应谨慎使用此系统。

摘要


处于与病毒斗争之首的医务工作者无需休息即可工作。我们必须为他们提供所有可能的帮助。我们是计算机技术的学生,我们竭尽所能为他们提供支持。

病人状况的远程监控系统可以解决一些问题而无需直接与病人接触,这意味着它可以帮助医生更有效,更安全地完成工作。

我们感谢开发了出色的开源工具和库的每个人,没有这些工具和库,注定我们的项目注定会失败。

使用Golang的决定是一个绝妙的主意。使用这种语言使我们能够在短短几天内创建一个非常稳定的系统。Vue也可以这样说。由于有了这个框架,我们能够非常快速地创建高质量和用户友好的界面。

我们在一起可以击败COVID-19。

亲爱的读者们!您将如何构建类似于本文所述的系统?


All Articles