Dicom 學(xué)習(xí)筆記-DICOM C-Find 消息服務(wù)

引言


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

C-Find 消息服務(wù)


??C-Find 服務(wù)是一個(gè)查詢服務(wù)涛碑,用于一個(gè) DIMSE-service-user 在同等的DIMSE-service-user 上查詢復(fù)合 SOP 實(shí)例的屬性滿足查詢條件給出的一組屬性的復(fù)合 SOP 實(shí)例朴爬。簡(jiǎn)單點(diǎn)理解就是我們可以使用 C-Find 服務(wù)查詢 PACS 系統(tǒng)里面符合條件的影像丰歌,我們的查詢條件可以是單個(gè)屬性(例如:PatientID 患者 ID 或 Modality 設(shè)備類型等)荒澡,也可以是多個(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 一樣昼接,使用開源庫 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 是否為空一睁,然后從中獲取需要的返回信息,例如下面獲取 StudyInstanceUID
    studyUids.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 參考代碼

// 查詢哪一級(jí)佃却,患者者吁、檢查、序列或影像等
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ù)類來實(shí)現(xiàn) Dicom 服務(wù)的基本框架复凳,然后實(shí)現(xiàn) IDicomServiceProvider 和 IDicomCFindProvider 接口來實(shí)現(xiàn)瘤泪。具體代碼可以參考這里

C-Find 過程分析


??我分別在兩臺(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è)過程的數(shù)據(jù)包抓取下來,下圖就是抓取的完整 C-Find 請(qǐng)求過程的數(shù)據(jù)包髓棋。

C-Find

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

  1. C-Find SCU(10.3.13.202)通過端口55074向 C-Find SCP(10.3.2.209) 的3333端口發(fā)送 SYN 包請(qǐng)求連接实檀;
  2. C-Find SCP(10.3.2.209) 通過3333端口向 C-Find SCU(10.3.13.202)的55074端口發(fā)送 ACK+SYN 包進(jìn)行確認(rèn);
  3. C-Find SCU(10.3.13.202)通過端口55074向 C-Find SCP(10.3.2.209) 的3333端口發(fā)送 ACK 包確認(rèn)并建立連接按声;

??TCP連接已經(jīng)通了膳犹,緊接著藍(lán)色框內(nèi)的兩行是兩個(gè) AE 建立 association 的過程:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 A-ASSOCIATE 請(qǐng)求;
  2. 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)求交互的過程:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 C-Find 請(qǐng)求豺旬,展開 DICOM 協(xié)議層可以看到請(qǐng)求數(shù)據(jù)是 PatientName,另外編碼格式是 ISO_IR 100芯义;
C-Find
  1. 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 查詢結(jié)果已經(jīng)發(fā)送完畢扛拨;
??接下來藍(lán)色框內(nèi)的兩行是通過發(fā)送 A-RELEASE 請(qǐng)求釋放 association:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 發(fā)送 A-RELEASE 請(qǐng)求斷開 association;
  2. C-Find SCP(10.3.2.209)響應(yīng) C-Find SCU(10.3.13.202)的 A-RELEASE 請(qǐng)求举塔,然后斷開兩個(gè) AE 之間的 association绑警;

??最后就是斷開 TCP 連接,這里就不再多介紹了央渣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末计盒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芽丹,更是在濱河造成了極大的恐慌北启,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔第,死亡現(xiàn)場(chǎng)離奇詭異咕村,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚊俺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門懈涛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泳猬,你說我怎么就攤上這事批钠。” “怎么了指郁?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵洋腮,是天一觀的道長(zhǎng)悯恍。 經(jīng)常有香客問我,道長(zhǎng)罢防,這世上最難降的妖魔是什么咒吐? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任同眯,我火速辦了婚禮硅确,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大莫。我一直安慰自己烙丛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布搁凸。 她就那樣靜靜地躺著护糖,像睡著了一般锰扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上京闰,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死辆雾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的月劈。 我是一名探鬼主播度迂,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼藤乙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了惭墓?” 一聲冷哼從身側(cè)響起坛梁,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腊凶,沒想到半個(gè)月后划咐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧萍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年褐缠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片风瘦。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡队魏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弛秋,到底是詐尸還是另有隱情器躏,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布蟹略,位于F島的核電站登失,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挖炬。R本人自食惡果不足惜揽浙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望意敛。 院中可真熱鬧馅巷,春花似錦、人聲如沸草姻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撩独。三九已至敞曹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間综膀,已是汗流浹背澳迫。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剧劝,地道東北人橄登。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拢锹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谣妻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • __ __ |__| _____ __ __ ┌...
    wangchuang2017閱讀 6,732評(píng)論 2 1
  • 12月18日,大同溫州商會(huì)2016年年會(huì)隆重舉行面褐。大同市委常委拌禾、統(tǒng)戰(zhàn)部長(zhǎng)黃岑麗、溫州市人大常委會(huì)副主任王小同等兩地...
    半屏山人閱讀 2,019評(píng)論 0 2
  • 期待已久的預(yù)售一期終于結(jié)束 (°_°) 今晚我要回去睡展哭,其他想法等我醒了再說湃窍!
    Tayii閱讀 164評(píng)論 0 0
  • 在我童年里沒什么父親的記憶,對(duì)于媽媽匪傍,獲得她的認(rèn)同貫穿我的整個(gè)童年您市,雖然她只是不斷地說教,從不認(rèn)同我役衡,但與她還是有...
    A君閱讀 372評(píng)論 5 7
  • 今天我很幸運(yùn)茵休,下午在餐館吃完午飯回家時(shí)不小心把我隨身攜帶的洞簫遺忘在了餐館的座位上。當(dāng)我在回家的公交車上發(fā)現(xiàn)我忘拿...
    若水Dewlight閱讀 144評(píng)論 0 0