如何在三天內使用Go和Vue建立實時Covid-19患者監護系統 -kasvith.me
作為醫護人員,我們的前線人員必須在隔離病房中徘徊,以不時檢查患者的生命體徵。還涉及接觸後處置防護裝備。這些接觸只是為了檢查醫療裝置上的讀數。衛生當局要求開發隔離病房的遠端監控系統。有昂貴的軟體可以遠端監視它們。但是斯里蘭卡可能沒有那麼多錢花這麼多錢。
因此,我們(我和Keshara)做了一些背景研究,發現這些裝置通常支援稱為HL7(健康等級7)的通用協議來交換生命體徵等醫學資料。
我們研究了HL7協議一段時間。有點奇怪。我們從未使用過該協議。這是一種新的體驗。
HL7訊息的框架如下
HL7封包
訊息部分內的患者醫療資料如下所示打包,《CR》是\r用於分離訊息的回車
HL7訊息樣本:
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具有goroutines和通道,可讓程式設計師以最少的努力快速開發高度併發的程式。
因此,我們決定去Golang。對於這項任務,我們認為我們將不得不處理許多併發任務。另外,Go二進位制檔案是靜態構建的,因此可以輕鬆在醫院系統上安裝軟體,而無需新增其他依賴項。
我們一直在尋找用Go編寫的好的庫,並發現此庫是一個很好的庫。它的作者也撰寫了一篇有關HL7 的精彩部落格文章。它支援輕鬆選擇和解析訊息。
為什麼選擇VueJS
在VueJS中,我們可以輕鬆地建立漂亮的反應式UI。我們已經使用它,因為您已經知道它非常棒,簡單而強大。我們還將Vuetify用於UI庫
我們有一個真正的裝置
瞭解Mindray床邊監護儀的程式設計師指南後(這在醫院很普遍),我們製作了一個小的原型來解碼hl7訊息。它可以正確解碼hl7訊息並將資料正確轉換為JSON。我們使用《程式設計師手冊》中定義的“未經請求的結果介面”進行了此操作。
但是,當我們親身體驗真正的裝置時,它實際上是行不通的。因此,我和Keshara開始在Wireshark中分析資料包,以檢視裝置實際在做什麼。因此,我們發現它根本不是在談論此協議。它使用的是實時結果介面,該介面很舊,製造商無法維護。
讓我們從HL7中提取一條訊息
從裝置中提取HL7訊息的過程如下。我們使用bufio.Reader該任務是因為它具有處理輸入流的有效方法。與其每次都訪問網路層,不如讓Reader有效地從基礎TCP連線中讀取資料。
func (d *Device) ProcessHL7Packet() (hl7.Message, error) { // read message start 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") } // read payload payloadWithDelimiter, err := d.ReadBytes(byte(0x1C)) if err != nil { return nil, fmt.Errorf("error reading payload: %s", err) } // just verify and process next byte on the line 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") } // skip last two bytes from the hl7 packet 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,因為它穩定且可靠。透過HA設定,我們可以為監視系統建立一個很好的可靠資料庫系統。此外,PG還支援高吞吐量資料提取,這是一個加號。
將來使用TimeScaleDB時,我們也會將其用於實時分析。因此,PG是最佳的整體選擇,因為將來可以將TimeScale安裝在它上面。
我們出於管理目的將閘道器和API分開。Gateway的設計輕巧且堅固。感謝GoLang,這是一次很酷的體驗。
走向真實世界
床頭監視器透過UDP協議廣播了它的存在。我們必須捕獲UDP資料包並對其進行處理,以提取必要的詳細資訊才能訪問監視裝置。
我們建立了一個單獨的Go Service,以檢測UDP廣播並在系統中註冊新裝置。下一階段是從閘道器連線裝置內部的資料伺服器。我們在Go中建立了另一個服務來處理這些TCP連線。
裝置發現
由於閘道器需要作為客戶端連線到裝置,因此我們也必須協調客戶端斷開連線。另外,我們還必須在閘道器中的每個監視器狀態上保留選項卡。
使用Go Channels,我們可以輕鬆地將Alarms儲存到PostgreSQL資料庫中,以供以後分析之用。
通道允許goroutine之間無互斥的通訊,而不會感到痛苦。使用它們真棒。
我在開發稱為Kache的Redis相容記憶體資料庫中的經驗為我們解決許多關鍵問題提供了很多幫助。
實時顯示生命體徵
我們同時開始開發一個良好的前端應用程式,以顯示醫務人員裝置的實時結果。Keshara做了UI部分的繁重工作,我覺得它很棒。在短短三天內,我們就完成了一個非常好的UI。
從Vuetify開始,我們研究了類似於床頭顯示器介面的自定義佈局。
使用Vuex進行狀態管理,我們還開發了基於優先順序的警報服務,可在任何緊急情況下向員工發出警報。
我們使用Socket.io連線了API和Frontend ,這使我們能夠建立有效的通訊渠道來實時交付結果。
我必須再次感謝Keshara在UI開發過程中所做的努力。
部署方式
這些裝置正在以高吞吐量傳送資料。我們決定為裝置使用單獨的VLAN,為API使用另一個VLAN,以處理流量,而不會淹沒醫院網路。我們的大學講師Asitha Bandaranayake [url=http://www.ce.pdn.ac.lk/academic-staff/suneth-namal-karunarathna/]博士[/url]和Suneth Namal Karunarathna [url=http://www.ce.pdn.ac.lk/academic-staff/asitha-bandaranayake/]博士[/url]也為我們提供了幫助
在他們的支援下,我們能夠建立一個堅實的網路。接下來,我們啟動了Ubuntu 18.04盒子並開始部署系統。
Keshara在這裡也進行了繁重的工作,冒著可能感染COVID患者的醫院冒著生命危險。
點選標題見原文
相關文章
- 如何使用遊戲引擎進行實時渲染和內容建立遊戲引擎
- 如何使用 IFTTT 零成本建立網站內容監控系統?網站
- 使用 Filament Panels 快速建立獸醫診所患者管理系統
- 基於PLC的物料分揀系統如何實現雲端監控和遠端維護
- 實時監控系統,統一監控企業APIAPI
- windows10系統如何更改檔案建立和修改時間Windows
- 使用Python建立一個系統監控程式Python
- 技術分享| 如何使用Prometheus實現系統程式監控Prometheus
- 使用Sar實現系統監控
- 硬體監測和系統維護工具:TechTool Pro for macMac
- win10系統如何開啟windows defender實時保護【圖文】Win10Windows
- 實時成本監控系統淺談薦
- 智勝空天·安全護航 | 無人機系統安全問題和防護技術無人機
- Go 系統監控利器-gopsutilGo
- 使用 Go、SSE 和 htmx 實時更新網站Go網站
- 患者360系統說明書
- 建立和維護大型Vue.js專案的10個最佳實踐Vue.js
- TechTool Pro 18 for Mac 硬體監測和系統維護工具Mac
- .NET 開源實時監控系統 - WatchDog
- 施耐德PLC如何實現組態監控和遠端維護?
- win10監護人模式如何進入 win10系統進入監護人模式的步驟Win10模式
- linux 如何建立定時任務?crontab -e 定時任務使用的時間是系統時間Linux
- 通過Mesos、Docker和Go,使用300行程式碼建立一個分散式系統DockerGo行程分散式
- 通過 Mesos、Docker 和 Go,使用 300 行程式碼建立一個分散式系統DockerGo行程分散式
- 三、產品實戰:如何在一天內交付一個招聘評估系統
- Go實戰準備工作---建立攜程池和定時任務Go
- Go實戰準備工作---建立協程池和定時任務Go
- 守護程式的概念和建立實驗
- 水庫雨量、流量實時監測物聯網系統
- 如何使用nload實時監控網路頻寬
- windows10系統如何設定自動維護時間Windows
- 硬體監測和系統維護工具:TechTool Pro for mac 中文版Mac
- WGCLOUD實時視覺化監控 使用監測FTP和SFTP教程GCCloud視覺化FTP
- 技術分享| 如何使用Prometheus實現系統監控報警郵件通知Prometheus
- Linux系統行為新型實時監控技術Linux
- [譯] 使用 Go 和 ReactJS 構建聊天系統 (四)GoReactJS
- [譯] 使用 Go 和 ReactJS 構建聊天系統 (三)GoReactJS
- [譯] 使用 Go 和 ReactJS 構建聊天系統 (二)GoReactJS