在2019年的最后一个11月,我们听说了来自中国的第一例未知的致命性疾病。现在每个人都知道它是Covid-19,现在它似乎永远改变了我们的生活。这种病毒是致命的,传染性很强。尽管如此,我们对此知之甚少。我真心希望我们能很快找到治疗方法。
由于这种病毒的性质,很难阻止它的传播。在我居住的斯里兰卡,我们和其他人一样面临着同样的情况。在这里,我们谈谈我们是如何通过做一些小事情来帮助我们的前线的。
这种致命的病毒可以通过一个非常小的错误感染你。作为医护人员,我们的前线不时要在隔离病房内徘徊,检查病人的生命体征,这项工作包括在探访后如何处理防护装备。所有这些都只是为了在设备上检查一些读数。
卫生当局要求我们开发隔离病房的远程监测系统。有昂贵的软件可以远程监控它们。但斯里兰卡可能不会那么富有,不会花这么多钱。
因此,我们(我和克沙拉)做了一些背景研究,发现这些设备通常支持一种称为HL7(健康级别7)的通用协议来交换医疗数据,如生命体征。
我们研究了一段时间的HL7协议。这有点奇怪。我们从来没有和这个协议合作过。这是一种全新的体验。
在消息部分内,患者医疗数据打包如下,<;CR>;是用于\r分隔消息的Carrige Return。
好的,这看起来很奇怪,对吧?我们也感觉到。这就是众所周知的Pipehat格式,它使用|来分隔数据段。你可以在互联网上找到大量的资源。
我们发现了一些用不同语言编写的很酷的库来处理HL7消息。
GO或Golang是一种静态类型的语言,其语法松散地派生自C语言,具有额外的特性,如垃圾收集(如Java)、类型安全和一些动态类型功能。谷歌在2007年由一群聪明人,罗伯特·格里斯默,罗布·派克和肯·汤普森开发的。
Go是为并发而构建的,它支持他们作为语言本身的一等公民。GO具有GORTOUTINE和通道,允许程序员以最小的努力快速开发高度并发的程序。
所以我们决定去接戈朗。至於这项工作,我们觉得要处理很多同时进行的工作。此外,GO二进制文件是静态构建的,因此可以轻松地在医院系统上安装软件,而无需添加额外的依赖项。
我们一直在寻找用围棋编写的好的库,发现这个库就是一个好的库。它的作者也写了一篇关于HL7的很棒的博客文章。
VUE(发音为/vjuː/,如VIEW)是用于构建用户界面的渐进式框架。与其他整体式框架不同,VUE从一开始就被设计为可增量采用。
在VueJS中,我们可以轻松创建漂亮的反应式UI。正如你已经知道的那样,我们使用了它,它纯粹是令人敬畏的,简单而强大的。我们还将Vutify用于UI库。
在使用了迈瑞床边监视器的程序员指南(这在医院很常见,所以我们拿起它)之后,我们制作了一个用于解码HL7消息的小原型。它可以正确解码HL7消息,并将数据正确转换为JSON。我们使用《程序员手册》中定义的Unsolistic Result Interface实现了这一点。
但当我们亲手操作一台真正的设备时,它真的不起作用了。所以Keshara和我开始分析Wireshark中的数据包,看看设备实际在做什么。所以我们发现它根本没有说这个协议。它使用的是实时结果界面,这是一个相当陈旧的界面,制造商已经不能进行维护了。
从设备提取HL7消息如下所示。我们使用bufio.Reader来执行任务,因为它有一种处理输入流的高效方式,Reader允许我们高效地从底层TCP连接读取数据,而不是每次都触及网络层。
函数(d*设备)ProcessHL7Packet()(HL7.。消息,错误){//读取消息开始0x0B b,错误:=d。ReadByte()if err!=nil{return nil,fmt.。Errorf(";读取开始字节:%s";,err)}if b!=byte(0x0B){return nil,fmt。Errorf(";Invalid Header";)}//读取带分隔符的有效负载,err:=d。读取字节(字节(0x1C)),如果错误!=nil{返回nil,fmt。Errorf(";读取有效负载时出错:%s";,err)}//仅验证并处理b行上的下一个字节,err=d。读取字节.。
系统的设计是以长期可靠的方式进行的。我们为这项任务精心挑选了最好的工具。
我们选择的数据库是PostgreSQL,因为它稳定可靠。通过HA设置,我们可以为监控系统创建一个良好可靠的数据库系统,而且PG还支持高吞吐量的数据摄取,它