楊 蓉, 鄭建立, 謝雅欣, 周文杰
(上海理工大學健康科學與工程學院, 上海 200093)
物聯網、大數據等信息技術的不斷發展,推動了醫療信息化的發展。 通過將具備數據輸出功能的醫療儀器連接物聯網、采集醫療設備大數據需求也越來越普遍。 除了醫學影像類的醫療儀器,如CT(Computed Tomography)、MR(Magnetic Resonance)、US(Ultrasonic)等數據接口已經廣泛采用了醫學數字影像傳輸標準 DICOM (Digital Imaging and Communications in Medicine)。 但其他醫療儀器如監護儀、麻醉機、呼吸機等產品的信息接口標準化程度相對滯后,仍然缺乏標準數據接口,諸多廠商自定義信息接口、數據通信協議以及通信方式,導致醫療儀器信息集成困難[1-2]。
針對醫療儀器信息集成困難,國際組織醫療健康信息集成協會(Integrating the Healthcare Enterprise,IHE)開發了病人護理設備(Patient Care Device,PCD)技術框架[3-4]。 PCD 技術框架規范了通信場景以及醫療設備與醫療設備數據接收單元之間的流程,從而促進醫療環境中設備數據的交換效率,但是應用不夠廣泛。 目前常見的辦法就是針對已知的協議編寫一對一的通信程序,效率低下。 研究通用的通信協議轉換技術,將非標準化的儀器私有協議轉換為標準化協議具有重要的意義。 已有研究提出基于JS 引擎的醫療儀器協議轉換技術的解決方案,通過協議轉換引擎執行協議轉換腳本,實現對多種消息的醫療協議進行轉換[5];基于OpenPLC 的醫療儀器通信協議解決方案,針對目標協議通過拼接組件生成相應配置文件,實現協議轉換[6]。 在非醫療儀器領域,有通過協議模版來進行轉換的集成網關案例,通過將協議分成幀頭、幀尾、位處理以及函數處理4 部分,對協議模版進行定義[7-8];基于通用描述符的協議轉換,通過描述符的生成,處理以及不斷修改,完成整個協議轉換過程[9]。 但現有解決方案,對于結構較復雜的協議,解析流程不直觀,可拓展性差。
本文通過對現有的協議進行分析,提出了一種基于行為樹(Behavior Tree)的協議描述新方法,利用行為樹有序的邏輯分層、代碼耦合度低、決策邏輯和數據分離優點解決協議解析流程不直觀與可拓展性差問題。
行為樹(Behavior Tree)是包含邏輯節點和行為節點的倒掛型樹結構,用模塊化的方式描述了一組有限任務之間的切換。 其本質是一段邏輯代碼,可以通過行為樹編輯器轉換為各種編程語言代碼[10]。行為樹通過節點(Node)描述行為邏輯,行為樹示意如圖1 所示。

圖1 行為樹示意圖Fig. 1 Schematic diagram of BehaviorTree
行為樹可以分為3 部分:樹的根部、樹的枝干、樹的末端。 樹的根部是根節點(Root),即行為樹邏輯執行的起點;樹的枝干實現行為邏輯的選擇判斷,由組合節點(Combination Node) 和修飾節點(Decoration Node)構成;樹的末端是葉節點(Leaf Node),用來實現具體的動作[11]。 行為樹節點分類,見表1。

表1 行為樹節點分類Tab. 1 Node classification of behavior tree
行為樹在遍歷過程中,由組合節點和修飾節點決定下一個執行節點,通過動作節點作出行為決策,執行定義好的動作,當葉子節點執行完畢后,會將執行結果反饋給上層節點[12]。 在這一過程中,每個節點在執行后,都會向上層節點返回執行狀態,執行狀態包括成功(Success)、失敗(Failure)、運行中(Running),上層節點會根據子節點的返回狀態決定后續的邏輯執行過程。
1.2.1 根節點
根節點是行為樹執行的起點,只能是選擇節點和序列節點,當對行為樹初始化或執行過程中無法找到有效的動作節點時,執行指針回到父節點。
1.2.2 組合節點
包括順序節點、隨機節點、并行節點、選擇節點:
(1)順序節點:該節點的遍歷方式為從左到右依次執行其所有子節點,如果有子節點的執行結果返回值是Success,就會繼續執行該節點的其他子節點。 順序節點只有在子節點執行結果返回值都是Success 時,父節點的返回值才會置為Success。
(2)隨機節點:該節點的執行方式是隨機執行其所有子節點,如果有一個節點的執行結果返回值是Success 或者Running 時,就會向父節點返回當前這個子節點的執行結果返回值并停止執行其他的所有子節點。
(3)并行節點: 該節點與其子節點的執行結果返回值無關,執行方式是左至右開始依次執行所有的子節點。
(4)選擇節點:該節點的遍歷方式是從左到右依次執行所有子節點,當第一次遇到子節點執行結果返回值為Success 時,則停止繼續執行其他子節點;當子節點執行結果返回值為Failure 時,則繼續執行其他子節點,直至一個子節點返回Success 或者Running,否則向父節點返回Failure;當子節點執行結果返回值為Running 時,則停止繼續執行其他子節點。
1.2.3 修飾節點
修飾節點(Decorator)只能有一個節點,該節點決定是否可以執行樹中的分支或者單個節點,本質上是一個條件,可以用來控制行為樹執行流的跳轉等。
1.2.4 葉節點
葉節點包括條件節點與行為節點
(1)條件節點:此節點對應編程語言中用到的if-else結構,用來判斷設置的邏輯條件與當前的環境狀態是否一致,如果一致,就會向父節點返回Success,否則的話返回Failure。
(2)行為節點:用來執行節點關聯的特定動作,并根據動作執行狀態向父節點返回執行結果。 這類節點隨應用目的的不同有很大的差異性,需要自行編寫,這也是本文主要的工作內容。
醫療儀器通信協議的解析是將輸入的字節流中醫療儀器數據提取出來,并將其轉換為符合目標格式規范的數據幀輸出,通信協議解析框架示意圖如圖2 所示。 輸入模塊將醫療儀器的數據傳入到解析模塊;解析模塊從輸入模塊中提取所需的數據項,并將這些數據項傳入轉換模塊,對傳入的數據進行校驗得到正確的數據幀,再從正確數據幀中,根據協議的定義,將原來的數據項提取出來;轉換模塊將解析模塊所傳入的原始數據項,根據要求的輸出數據項格式對原始數據進行格式或者數值的轉換;輸出模塊將轉換模塊所得到的數據幀按照網絡協議進行傳送。

圖2 通信協議解析框架Fig. 2 Communication protocol analysis framework
基于BehaviorTree 的協議解析平臺由協議解析引擎和低代碼協議解析行為樹編輯器兩部分組成,如圖3 所示。 基于BehaviorTree 框架實現協議解析引擎,在Groot 編輯器上已有的流程控制節點基礎上擴展自編的動作節點,構成圖形化低代碼協議解析行為樹編輯器,組合出協議解析行為樹并保存為XML 格式的協議配置文件。 協議解析時協議解析引擎動態加載XML 協議配置文件,即可完成對應的協議數據的解析,通過替換不同的協議配置文件即可實現不同協議數據的解析,而無需重新修改編譯協議解析引擎,大大提高了可擴展性,降低了使用門檻。 在這個過程中, 使用了樹的所有節點共享的黑板鍵/值存儲方式對數據進行存儲。

圖3 基于BehaviorTree 的協議解析平臺組成框架Fig. 3 Framework for protocol analysis platform based on BehaviorTree
2.2.1 低代碼協議解析行為樹編輯器設計
2.2.1.1 行為樹編輯器節點定義
通過分析多種通信協議,定義以下數據處理節點。
(1)取數:通過分析總結出定長、類型-長度-值和分隔符3 種協議數據封裝方式,設計了3 種取數節點。 定長取數節點獲取指定長度的值,類型-長度-值節點處理有數據長度字段的變長值,分隔符取數節點處理有特殊字符標識的開始與結束。
(2)校驗:驗證協議數據單元正確性,包括循環冗余校驗節點、校驗節點、校驗和節點。
(3)運算:包括算術運算節點、邏輯運算節點、關系運算節點、移位運算節點。
(4)轉換:轉換節點主要包括十六進制、字符串、整型與字符等數據類型之間的兩兩轉換節點共20 個,例如整型轉為字符串,十六進制轉為整型等。
(5)映射:將協議解析結果表示成多種輸出格式。 例如json 格式映射節點需要將信息項根據ID眏射到名稱、單位,并填入值。
2.2.1.2 行為樹編輯器節點編寫
自定義數據處理節點類型后需要對節點進行功能實現。 這些節點都以行為樹的動作節點形式實現。 節點的定義及編寫分為3 個步驟,以自定義取數節點(GetNByte)為例:
(1)配置json 文件。 打開Groot 編輯器源碼的json 配置文件,在此處先聲明節點名稱(GetNByte)與節點的圖案;
(2)實現節點功能。 GetNByte 是在本文中規劃的一種取數行為節點,GetNByte 節點根據輸入的起始位置、固定長度取數,因此設置了輸入端口獲取數據起始位置與數據長度;
(3)注冊節點。 在行為樹工廠函數中通過注冊節點類型函數注冊節點,此處實際類型與入參ID 相同,且與json 配置文件中名稱一致;
完成程序編寫后,自定義數據處理節點成功內置到低代碼協議解析行為樹編輯器中,如圖4 所示。

圖4 GetNByte 節點Fig. 4 GetNByte node
2.2.2 協議解析引擎設計
2.2.2.1 注冊節點
行為樹中通過行為樹工廠類進行節點注冊,該類由3 個容器來保存數據,通過注冊節點類型的方法注冊自定義的數據處理節點。 例如注冊一個節點,該節點的實際節點類型和在樹中的名稱保持一致,實際類型與入參ID 相同,可減少錯誤。
2.2.2.2 加載XML
行為樹按照XML 文件格式來設計、書寫和保存,XML 直觀顯示了不同父樹、子樹的黑板間的映射關聯與節點執行順序。 樹加載和創建XML 通過文本加載方法和文件加載方法實現。 文本加載首先加載和解析文本、檢查各項元素是否符合行為樹的概念要求;其次,創建樹和所有節點的實例、構造樹之間和節點之間與端口的映射關系,再將樹的節點信息綁定給樹實例變量。
2.2.2.3 啟動函數
行為樹是一種樹狀的數據結構,樹上的每一個節點都是一個行為,在行為樹中tick 函數是一個啟用信號,行為樹的運行方式就是從根節點以一定的頻率發送tick 給其他子節點,行為樹執行時邏輯如圖5 所示,本文自定義數據處理節點的實現自行編寫在tick 函數中。

圖5 行為樹執行時邏輯Fig. 5 Behavior tree execution logic
2.2.2.4 調用黑板
黑板是樹中節點傳輸數據的方式,所有節點共享。 每棵樹都有自己的黑板,通過編輯XML 顯式創建不同的父樹、子樹的黑板間的映射關聯,調用黑板設置函數將數據寫入黑板。
本文選擇醫療設備某呼吸機,呼吸機數據及說明見表2。 分別基于C 語言的編程方法與基于行為樹方法進行數據幀測試,測試該協議能否正確校驗數據幀,并輸出對應的解析結果。

表2 呼吸機數據及說明Tab. 2 Ventilator data and description
由表2 可知,協議數據字節的長度不是固定的,以0DH 作為協議數據單元的結束。 該協議數據字節第1 字節01H 為協議開始標志,第2 字節24 為開始響應標志,從第3 字節開始到第(n- 3) 為數據位,第(n- 2) 到第(n- 1) 字節為從第1 字節到第(n- 3) 字節的16 位累加和校驗值,第n字節0DH為Ascii 回車字符。 根據輸入數據幀協議,可將協議解析分為3 步:第一步根據協議的開始與結束標志取出協議數據;第二步為累加和校驗;第三步協議數據轉換。
基于行為樹方法的協議解析步驟分為3 步:
第一步:繪制行為樹。 利用低代碼協議解析行為樹編輯器繪制呼吸機數據協議解析行為樹如圖6所示, 將該協議解析行為樹導出為XML 文件;

圖6 呼吸機數據協議解析行為樹Fig. 6 BehaviorTree of ventilator data protocol analysis
第二步:協議解析引擎加載XML 文件。 測試數據如圖7 所示,根據XML 文件描述依次進行取數、校驗、轉換等過程得到測試結果如圖8 所示。

圖7 測試數據Fig. 7 Test data

圖8 基于行為樹方法測試結果Fig. 8 Test results based on behavior tree method
選擇同一組測試數據分別基于C 語言編程的方法與基于行為樹方法進行協議解析測試,分別記錄兩種方法運行程序需要的時間,記錄100 組,并求出平均值與標準差,結果見表3。

表3 兩種方法程序運行耗時Tab. 3 Two methods of program running time consuming
由表3 可知,基于行為樹方法程序耗時為5.34 ms,基于C 程序方法程序耗時為3.23 ms。 兩種方法均需使用者對協議內容充分掌握,基于C 程序的解析方法程序運行耗時短但對使用者的編程能力有較高要求,而基于行為樹的解析方法僅需使用者根據協議內容對行為樹編輯器節點進行組合,無需掌握較高編程能力,具有較好的普適性,此外基于行為樹的解析方法還有以下優點:
(1)易用性強:低代碼協議解析行為樹編輯器隱藏了代碼實現細節,每個行為節點以圖形化方式展現; 利用基于行為樹方法進行協議解析,只需根據協議要求繪制協議流程圖,技術門檻低;
(2)擴展性強、重用性高:行為樹的行為邏輯和狀態數據分離,可以反復利用;
(3)直觀易于理解:行為樹呈樹狀結構,解析流程直觀易于理解。
醫療儀器的信息解析平臺是現代化醫院不可缺少的支撐,也是國內外醫院數字化建設的重要方向。目前國內對于這類醫療儀器與信息系統集成的研究還在發展階段, 本文提出了基于行為樹(BehaviorTree)的醫療儀器協議解析方法,通過分析常見的醫療儀器協議,總結提取通信協議數據轉換模塊,編寫行為樹節點內置到Groot 編輯器中,構建通用醫療儀器通信協議解析平臺。 在對某一個特定協議解析時,根據協議格式繪制對應的行為樹,保存為XML 文件,即可由協議解析引擎加載運行。 在此過程中,無需再一一實現取數、運算、校驗等功能代碼,也不需要重新編譯代碼,只需在圖形化界面拼接出協議解析流程。 該方法使醫療儀器協議的解析和處理更靈活和更普適,有效降低了醫療儀器協議解析難度,對醫療儀器的信息集成有良好的應用價值,為醫療儀器協議解析提供了新的思路。