日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【转】02.Dicom 学习笔记-DICOM C-Find 消息服务

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】02.Dicom 学习笔记-DICOM C-Find 消息服务 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

??前篇介紹了 DICOM C-Store 消息服務(wù),本文結(jié)合開(kāi)源 DICOM 庫(kù) fo-dicom 詳細(xì)介紹一下 C-Find 服務(wù)。

?

C-Find 消息服務(wù)

??C-Find 服務(wù)是一個(gè)查詢(xún)服務(wù),用于一個(gè) DIMSE-service-user 在同等的DIMSE-service-user 上查詢(xún)復(fù)合 SOP 實(shí)例的屬性滿(mǎn)足查詢(xún)條件給出的一組屬性的復(fù)合 SOP 實(shí)例。簡(jiǎn)單點(diǎn)理解就是我們可以使用 C-Find 服務(wù)查詢(xún) PACS 系統(tǒng)里面符合條件的影像,我們的查詢(xún)條件可以是單個(gè)屬性(例如:PatientID 患者 ID 或 Modality 設(shè)備類(lèi)型等),也可以是多個(gè)屬性的組合(例如:PatientID 患者 ID和 StudyInstanceUID 檢查唯一標(biāo)識(shí)等)。在實(shí)際的場(chǎng)景中,worklist 會(huì)用到 C-Find 服務(wù),成像設(shè)備向 PACS 系統(tǒng)發(fā)起 C-Find 請(qǐng)求,然后 PACS 系統(tǒng)請(qǐng)求 RIS 系統(tǒng)獲取登記待檢查的患者列表,然后逐層返回給成像設(shè)備。
??C-Find 服務(wù)流程如下:

?

C-Find 流程

?

C-Find SCU

??同 C-Store SCU 一樣,使用開(kāi)源庫(kù) fo-dicom 我們可以很輕松的實(shí)現(xiàn) C-Find SCU,fo-dicom 已經(jīng)封裝好了 C-Find Request,具體代碼可以在 GitHub 上查看 DicomCFindRequest.cs,我們只需要如下的代碼就可以實(shí)現(xiàn) C-Find SCU:
這里需要引用命名空間【Dicom】和【Dicom.Network】

?

using Dicom; using Dicom.Network;

?

var client = new DicomClient(); client.NegotiateAsyncOps();var request = {構(gòu)造一個(gè) DicomCFindRequest};// 聲明返回對(duì)象 var studyUids = new List<string>(); request.OnResponseReceived += (req, response) => {DebugStudyResponse(response);// response.Dataset,這里獲取返回對(duì)象,先判斷 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 參考代碼

?

// 查詢(xún)哪一級(jí),患者、檢查、序列或影像等 var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);// 編碼 request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");// 查詢(xún)條件,可以根據(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 可以通過(guò)派生 DicomService 服務(wù)類(lèi)來(lái)實(shí)現(xiàn) Dicom 服務(wù)的基本框架,然后實(shí)現(xiàn) IDicomServiceProvider 和 IDicomCFindProvider 接口來(lái)實(shí)現(xiàn)。具體代碼可以參考這里。

?

C-Find 過(guò)程分析

??我分別在兩臺(tái)計(jì)算機(jī)上部署好 C-Find SCU(10.3.13.202) 和 C-Find SCP(10.3.2.209),然后從 C-Find SCU 向 C-Find SCP 發(fā)起一個(gè) C-Find 請(qǐng)求,并且使用 wireshark 將整個(gè)過(guò)程的數(shù)據(jù)包抓取下來(lái),下圖就是抓取的完整 C-Find 請(qǐng)求過(guò)程的數(shù)據(jù)包。

?

C-Find

??上圖紅色方框內(nèi)的三條數(shù)據(jù)包就是 TCP 建立連接的過(guò)程:

  • C-Find SCU(10.3.13.202)通過(guò)端口55074向 C-Find SCP(10.3.2.209) 的3333端口發(fā)送 SYN 包請(qǐng)求連接;
  • C-Find SCP(10.3.2.209) 通過(guò)3333端口向 C-Find SCU(10.3.13.202)的55074端口發(fā)送 ACK+SYN 包進(jìn)行確認(rèn);
  • C-Find SCU(10.3.13.202)通過(guò)端口55074向 C-Find SCP(10.3.2.209) 的3333端口發(fā)送 ACK 包確認(rèn)并建立連接;
  • ??TCP連接已經(jīng)通了,緊接著藍(lán)色框內(nèi)的兩行是兩個(gè) AE 建立 association 的過(guò)程:

  • C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 A-ASSOCIATE 請(qǐng)求;
  • C-Find SCP(10.3.2.209)響應(yīng) C-Find SCU(10.3.13.202)的 A-ASSOCIATE 請(qǐng)求,然后兩個(gè) AE 就建立了一個(gè) association;
  • ??association 建立好了之后,接著就是第一個(gè)黃色框內(nèi)的內(nèi)容,C-Find 請(qǐng)求交互的過(guò)程:

  • C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 C-Find 請(qǐng)求,展開(kāi) DICOM 協(xié)議層可以看到請(qǐng)求數(shù)據(jù)是 PatientName,另外編碼格式是 ISO_IR 100;
  • ?

    C-Find

  • C-Find SCP(10.3.2.209)返回給 C-Find SCU(10.3.13.202)關(guān)于 C-Find 請(qǐng)求結(jié)果;
  • ??association 然后第二個(gè)黃色框內(nèi)的內(nèi)容還是 C-Find SCP(10.3.2.209)給 C-Find SCU(10.3.13.202)返回 C-Find 請(qǐng)求,這里是告訴 C-Find SCU 查詢(xún)結(jié)果已經(jīng)發(fā)送完畢;
    ??接下來(lái)藍(lán)色框內(nèi)的兩行是通過(guò)發(fā)送 A-RELEASE 請(qǐng)求釋放 association:

  • C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 A-RELEASE 請(qǐng)求斷開(kāi) association;
  • C-Find SCP(10.3.2.209)響應(yīng) C-Find SCU(10.3.13.202)的 A-RELEASE 請(qǐng)求,然后斷開(kāi)兩個(gè) AE 之間的 association;
  • ??最后就是斷開(kāi) TCP 連接,這里就不再多介紹了。



    作者:Statmoon
    鏈接:https://www.jianshu.com/p/035dfa708077
    來(lái)源:簡(jiǎn)書(shū)
    著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

    總結(jié)

    以上是生活随笔為你收集整理的【转】02.Dicom 学习笔记-DICOM C-Find 消息服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。