【转】02.Dicom 学习笔记-DICOM C-Find 消息服务
引言
??前篇介紹了 DICOM C-Store 消息服務(wù),本文結(jié)合開源 DICOM 庫 fo-dicom 詳細介紹一下 C-Find 服務(wù)。
?
C-Find 消息服務(wù)
??C-Find 服務(wù)是一個查詢服務(wù),用于一個 DIMSE-service-user 在同等的DIMSE-service-user 上查詢復(fù)合 SOP 實例的屬性滿足查詢條件給出的一組屬性的復(fù)合 SOP 實例。簡單點理解就是我們可以使用 C-Find 服務(wù)查詢 PACS 系統(tǒng)里面符合條件的影像,我們的查詢條件可以是單個屬性(例如:PatientID 患者 ID 或 Modality 設(shè)備類型等),也可以是多個屬性的組合(例如:PatientID 患者 ID和 StudyInstanceUID 檢查唯一標識等)。在實際的場景中,worklist 會用到 C-Find 服務(wù),成像設(shè)備向 PACS 系統(tǒng)發(fā)起 C-Find 請求,然后 PACS 系統(tǒng)請求 RIS 系統(tǒng)獲取登記待檢查的患者列表,然后逐層返回給成像設(shè)備。
??C-Find 服務(wù)流程如下:
?
C-Find 流程
?
C-Find SCU
??同 C-Store SCU 一樣,使用開源庫 fo-dicom 我們可以很輕松的實現(xiàn) C-Find SCU,fo-dicom 已經(jīng)封裝好了 C-Find Request,具體代碼可以在 GitHub 上查看 DicomCFindRequest.cs,我們只需要如下的代碼就可以實現(xiàn) C-Find SCU:
這里需要引用命名空間【Dicom】和【Dicom.Network】
?
using Dicom; using Dicom.Network;?
var client = new DicomClient(); client.NegotiateAsyncOps();var request = {構(gòu)造一個 DicomCFindRequest};// 聲明返回對象 var studyUids = new List<string>(); request.OnResponseReceived += (req, response) => {DebugStudyResponse(response);// response.Dataset,這里獲取返回對象,先判斷 response.Dataset 是否為空,然后從中獲取需要的返回信息,例如下面獲取 StudyInstanceUIDstudyUids.Add(response.Dataset?.GetSingleValue<string>(DicomTag.StudyInstanceUID)); }; client.AddRequest(request); client.Send({C-Find SCP IP}, {C-Find SCP Port}, false, {C-Find SCU AE Title}, {C-Find SCP AE Title});構(gòu)造 DicomCFindRequest 參考代碼
?
// 查詢哪一級,患者、檢查、序列或影像等 var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);// 編碼 request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");// 查詢條件,可以根據(jù)需要添加 request.Dataset.AddOrUpdate(DicomTag.PatientName, "xxx"); request.Dataset.AddOrUpdate(DicomTag.PatientID, "xxx"); request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, "xxx"); request.Dataset.AddOrUpdate(DicomTag.StudyDate, "xxx"); request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, "xxx"); request.Dataset.AddOrUpdate(DicomTag.StudyDescription, "xxx"); request.Dataset.AddOrUpdate(DicomTag.StudyTime, "xxx"); …………C-Find SCP
??C-Find SCP 可以通過派生 DicomService 服務(wù)類來實現(xiàn) Dicom 服務(wù)的基本框架,然后實現(xiàn) IDicomServiceProvider 和 IDicomCFindProvider 接口來實現(xiàn)。具體代碼可以參考這里。
?
C-Find 過程分析
??我分別在兩臺計算機上部署好 C-Find SCU(10.3.13.202) 和 C-Find SCP(10.3.2.209),然后從 C-Find SCU 向 C-Find SCP 發(fā)起一個 C-Find 請求,并且使用 wireshark 將整個過程的數(shù)據(jù)包抓取下來,下圖就是抓取的完整 C-Find 請求過程的數(shù)據(jù)包。
?
C-Find
??上圖紅色方框內(nèi)的三條數(shù)據(jù)包就是 TCP 建立連接的過程:
??TCP連接已經(jīng)通了,緊接著藍色框內(nèi)的兩行是兩個 AE 建立 association 的過程:
??association 建立好了之后,接著就是第一個黃色框內(nèi)的內(nèi)容,C-Find 請求交互的過程:
?
C-Find
??association 然后第二個黃色框內(nèi)的內(nèi)容還是 C-Find SCP(10.3.2.209)給 C-Find SCU(10.3.13.202)返回 C-Find 請求,這里是告訴 C-Find SCU 查詢結(jié)果已經(jīng)發(fā)送完畢;
??接下來藍色框內(nèi)的兩行是通過發(fā)送 A-RELEASE 請求釋放 association:
??最后就是斷開 TCP 連接,這里就不再多介紹了。
作者:Statmoon
鏈接:https://www.jianshu.com/p/035dfa708077
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的【转】02.Dicom 学习笔记-DICOM C-Find 消息服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长江养老添年享和国寿安鑫利365天的区
- 下一篇: 兴业虚拟信用卡可以办分期吗