【转】04.Dicom 学习笔记-DICOM C-Move 消息服务
引言
??前篇介紹了 DICOM C-Get 消息服務,本文結合開源 DICOM 庫 fo-dicom 詳細介紹一下 C-Move 服務。
?
C-Move 消息服務
??C-Move 服務可以用來獲取影像和轉存影像,用于一個 DIMSE-service-user 在同等的 DIMSE-service-user 上查詢復合 SOP 實例的屬性滿足查詢條件給出的一組屬性的復合 SOP 實例,并取回這些符合條件的復合 SOP 實例,同時在這個過程中將觸發一個或多個 C-STORE 子操作過程,所有的 C-STORE 子操作觸發在另外一個單獨的 Association 連接中。從這里可以看出 C-Move 和 C-Get 服務很類似,唯一的區別在于 C-Move 所觸發的 C-Store 子操作在另外一個單獨的 Association 連接中,而 C-Get 所觸發的 C-Store 子操作是和 C-Get 在同一個 Association 連接中。
??DICOM 標準中是這樣定義的:
The C-MOVE service is used by a DIMSE-service-user to match a set of Attributes against the Attributes of a set of composite SOP Instances maintained by a peer DIMSE-service-user, and retrieve all composite SOP Instances that match. It triggers one or more C-STORE sub-operations on a separate Association. It is a confirmed service.
??所以C-Move 可以支持兩方通信,也可以支持三方通信。
??C-Move 服務兩方通信流程圖如下:
?
C-Move flowchart
?
C-Move SCU
??開源 DICOM 庫 fo-dicom 已經封裝好了 C-Move Request,具體代碼可以在 GitHub 上查看 DicomCMoveRequest.cs,我們只需要通過如下代碼就能夠構造一個簡單的 C-Move SCU,需要引用命名空間【Dicom.Network】。
?
using Dicom.Network;?
var client = new DicomClient(); var request = new DicomCMoveRequest({C-Store SCP AE Title}, {StudyInstanceUID}); client.AddRequest(request); client.Send({C-Move SCP IP}, {C-Move SCP Port}, false, {C-Move SCU AE Title}, {C-Move SCP AE Title});- C-Store SCP AE Title:影像歸檔目的地的 AE Title,之所以這樣寫,是因為 C-Move 既可以是兩方通信,也可以是三方通信,如果是兩方通信,那么 C-Move SCU 同時需要提供 C-Store SCP 的功能,這里就可以寫 C-Move SCU 的 AE Title;如果是三方通信,那么這個影像歸檔的目的地之需要提供 C-Store SCP 的功能,所以這里的參數就要寫C-Store SCP 的 AE Title;
- StudyInstanceUID:檢查唯一標識;
- C-Move SCP IP:C-Move 服務端的 IP 地址或機器名;
- C-Move SCP Port:C-Move 服務端的端口;
- C-Move SCU AE Title:C-Move 客戶端應用實體的名稱;
- C-Move SCP AE Title:C-Move 服務端應用實體的名稱;
??如果我們需要獲取 C-Store 過程中的一些信息,例如成功數量、失敗數量和待 C-Store 操作數量這些,可以加上下面的代碼:
?
request.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) => {if (response.Status.State == DicomState.Pending){Console.WriteLine("Sending is in progress. please wait: " + response.Remaining + " SOP instances need to do C-Store options");}else if (response.Status.State == DicomState.Success){Console.WriteLine("Sending successfully finished");}else if (response.Status.State == DicomState.Failure){Console.WriteLine("Error sending datasets: " + response.Status.Description);}Console.WriteLine(response.Status); };C-Move SCP
??C-Move SCP 可以通過派生 DicomService 服務類來實現 Dicom 服務的基本框架,然后實現 IDicomServiceProvider 和 IDicomCMoveProvider 接口來實現,部分代碼可以參考這里,核心部分是實現 OnCMoveRequest 方法。
?
C-Move 過程分析
??由于包的數據量比較大,所以和之前分析 C-Get 服務一樣,我過濾掉不能被解碼成 DICOM 協議的包,只分析能被解碼成 DICOM 協議的包,先看第一部分:
?
A-Associate
紅色框內的兩行是兩個 AE 建立 association 的過程:
藍色框中的數據包是 C-Move SCU(10.3.13.202)向 C-Move SCP(10.3.2.209) 發送 C-Move 請求,通過查看包的詳細內容可以看到我們查詢的 level 是檢查這一級,參數是一個 StudyInstanceUID,C-Move 請求發送完畢后接著就是下圖的數據包了:
?
A-Associate
紅色框內的兩行是兩個 AE 建立 association 的過程,這個是 C-Move 請求觸發的 C-Store 子操作所建立的 association 連接:
后續的藍色框就是 C-Move SCP(C-Store SCU,10.3.2.209)向 C-Move SCU(C-Store SCP,10.3.13.202)發送 C-Store 請求,這里一個 SOP 實例對象會被拆分成多個數據包發送,詳見下圖:
?
C-Store Packet
從上圖可以看出單個 SOP 實例對象所有的 C-Store 數據包除了一個都說明了在收到 Frame 12194 后進行重組,同時單個 SOP 實例對象的最后一個數據包是一個畸形數據包,這個數據包重組之前收到的數據包后將 SOP 實例對象的 Tag 值按照 DICOM 標準都可以解析出來了。
?
C-Store Response
接著看上圖,在一個 SOP 實例對象 C-Store 歸檔完后,C-Move SCU(C-Store SCP,10.3.13.202)會向 C-Move SCP(C-Store SCU,10.3.2.209)發送一個 C-Store 響應,會返回 C-Move SCP(C-Store SCU,10.3.2.209) C-Store 的狀態。
?
C-Move Response
在 C-Store 響應之后,C-Move SCP(10.3.2.209) 會向 C-Move SCU(10.3.13.202)發送一個 C-Move 響應,內容包括 C-Move 的狀態、剩余多少個 C-Store 子操作、完成了多少個 C-Store 子操作和失敗了多少個 C-Store 子操作,詳見上圖紅色框部分。接下去就又會觸發另外一個 C-Store 子操作了,數據包和上面的類似,這里不再詳細分析。
?
C-Move Response
上圖是最后一個 C-Store 子操作完成后的 C-Move 響應,這里可以看到狀態寫的是子操作還在進行中,沒有剩余的子操作了,完成的子操作是4個。
?
A-Release
接著看上圖藍色框的兩行,當所有的 C-Store 完成后,為 C-Store 子操作所建立的 Association 連接就會斷開:
斷開這個 association 連接后, C-Move SCP(C-Store SCU,10.3.2.209)會向 C-Move SCU(C-Store SCP,10.3.13.202)發送一個 C-Move 響應,修改 C-Move 的狀態為 Success;
最后紅色框內的兩行是斷開 C-Move 建立的 Association 連接:
以上就是 C-Move 兩方通信詳細交互過程的分析。
作者:Statmoon
鏈接:https://www.jianshu.com/p/7e753628a865
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的【转】04.Dicom 学习笔记-DICOM C-Move 消息服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: console application_
- 下一篇: 【转】医学影像调窗技术!!!!