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

引言

  前篇介绍了 DICOM C-Store 消息服务,本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Find 服务。

 

C-Find 消息服务

  C-Find 服务是一个查询服务,用于一个 DIMSE-service-user 在同等的DIMSE-service-user 上查询复合 SOP 实例的属性满足查询条件给出的一组属性的复合 SOP 实例。简单点理解就是我们可以使用 C-Find 服务查询 PACS 系统里面符合条件的影像,我们的查询条件可以是单个属性(例如:PatientID 患者 ID 或 Modality 设备类型等),也可以是多个属性的组合(例如:PatientID 患者 ID和 StudyInstanceUID 检查唯一标识等)。在实际的场景中,worklist 会用到 C-Find 服务,成像设备向 PACS 系统发起 C-Find 请求,然后 PACS 系统请求 RIS 系统获取登记待检查的患者列表,然后逐层返回给成像设备。
  C-Find 服务流程如下:

 

C-Find 流程

 

C-Find SCU

  同 C-Store SCU 一样,使用开源库 fo-dicom 我们可以很轻松的实现 C-Find SCU,fo-dicom 已经封装好了 C-Find Request,具体代码可以在 GitHub 上查看 DicomCFindRequest.cs,我们只需要如下的代码就可以实现 C-Find SCU:
这里需要引用命名空间【Dicom】和【Dicom.Network】

 

using Dicom;
using Dicom.Network;

 

var client = new DicomClient();
client.NegotiateAsyncOps();var request = {构造一个 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});

构造 DicomCFindRequest 参考代码

 

// 查询哪一级,患者、检查、序列或影像等
var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);// 编码
request.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");// 查询条件,可以根据需要添加
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 服务类来实现 Dicom 服务的基本框架,然后实现 IDicomServiceProvider 和 IDicomCFindProvider 接口来实现。具体代码可以参考这里。

 

C-Find 过程分析

  我分别在两台计算机上部署好 C-Find SCU(10.3.13.202) 和 C-Find SCP(10.3.2.209),然后从 C-Find SCU 向 C-Find SCP 发起一个 C-Find 请求,并且使用 wireshark 将整个过程的数据包抓取下来,下图就是抓取的完整 C-Find 请求过程的数据包。

 

C-Find

  上图红色方框内的三条数据包就是 TCP 建立连接的过程:

  1. C-Find SCU(10.3.13.202)通过端口55074向 C-Find SCP(10.3.2.209) 的3333端口发送 SYN 包请求连接;
  2. C-Find SCP(10.3.2.209) 通过3333端口向 C-Find SCU(10.3.13.202)的55074端口发送 ACK+SYN 包进行确认;
  3. C-Find SCU(10.3.13.202)通过端口55074向 C-Find SCP(10.3.2.209) 的3333端口发送 ACK 包确认并建立连接;

  TCP连接已经通了,紧接着蓝色框内的两行是两个 AE 建立 association 的过程:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 发送 A-ASSOCIATE 请求;
  2. C-Find SCP(10.3.2.209)响应 C-Find SCU(10.3.13.202)的 A-ASSOCIATE 请求,然后两个 AE 就建立了一个 association;

  association 建立好了之后,接着就是第一个黄色框内的内容,C-Find 请求交互的过程:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 发送 C-Find 请求,展开 DICOM 协议层可以看到请求数据是 PatientName,另外编码格式是 ISO_IR 100;

 

C-Find

  1. C-Find SCP(10.3.2.209)返回给 C-Find SCU(10.3.13.202)关于 C-Find 请求结果;

  association 然后第二个黄色框内的内容还是 C-Find SCP(10.3.2.209)给 C-Find SCU(10.3.13.202)返回 C-Find 请求,这里是告诉 C-Find SCU 查询结果已经发送完毕;
  接下来蓝色框内的两行是通过发送 A-RELEASE 请求释放 association:

  1. C-Find SCU(10.3.13.202)向 C-Find SCP(10.3.2.209) 发送 A-RELEASE 请求断开 association;
  2. C-Find SCP(10.3.2.209)响应 C-Find SCU(10.3.13.202)的 A-RELEASE 请求,然后断开两个 AE 之间的 association;

  最后就是断开 TCP 连接,这里就不再多介绍了。



作者:Statmoon
链接:https://www.jianshu.com/p/035dfa708077
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

转自&#xff1a;https://www.jianshu.com/p/c7f5b9fa597c 引言 前篇介绍了 DICOM C-Find 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Get 服务。 C-Get 消息服务 C-Get 服务主要用于获取影像&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE…

php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...

关于DAO数据访问对象设计其实是关于GoFrame框架工程化实践中比较重要一块设计。DAO设计结合GoFrame的ORM组件性能和易用性都很强&#xff0c;可以极大提高开发和维护效率。看完本章节内容之后&#xff0c;小伙伴们应该能够理解并体会到使用DAO数据库访问对象设计的优点。一、现…

再谈“我是怎么招聘程序员的”

我以前写过一篇“我是怎么招聘程序员的”的文章&#xff08;在CSDN那里有很多人进行了回复&#xff09;。今天&#xff0c;我想再谈谈关于招聘和面试这方面的东西&#xff0c;主要是以下这些原因&#xff1a; 近半年来我在进行了大量的招聘工作&#xff0c;对面试有一些新的体…

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

引言 前篇介绍了 DICOM C-Get 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Move 服务。 C-Move 消息服务 C-Move 服务可以用来获取影像和转存影像&#xff0c;用于一个 DIMSE-service-user 在同等的 DIMSE-service-user 上查询复合 SOP 实例的属性满足…

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

引言 经过前面几篇的介绍&#xff0c;DIMSE-C 消息服务这块已经讲解了差不多了&#xff0c;还剩最后一个 C-Echo 消息服务&#xff0c;这个服务相对前面的4个服务来说更简单一些&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Echo 服务。 C-Echo 消息服务 首先来…

哪些设计模式最值得学习

最近又在首页看到几篇设计模式相关的学习随笔。回想起来&#xff0c;这几年在园子里发布的有关设计模式的随笔都有一个共同的特点。那就是Factory和Singleton居多&#xff0c;如果是系列的&#xff0c;也往往是从这两个模式开始的。由于能够坚持把《设计模式》中所有模式都写完…

【转】000.DICOM:DICOM标准学习路线图(初稿)!!!!!!!!!!!!

转自&#xff1a;https://zssure.blog.csdn.net/article/details/49231303 题记&#xff1a; DICOM医学图像处理专栏撰写已有两个年头&#xff0c;积累了近百篇文章。 起初 只是用于记录自己科研、工作中遇到的疑难问题&#xff0c;专注于图像处理&#xff08;主要是医学图像…

对比 SQL Server 2005 和 Oracle

在 Microsoft Windows Server 上运行的 SQL Server 2005&#xff0c;为企业级关系数据库和分析解决方案提供了一个平台&#xff0c;在安全、可用性、与 Visual Studio 的整合度&#xff0c;从小企业到大企业的可扩展性以及低费用方面胜过了Oracle 10g。探索下列信息以发现在 这…

【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

转自&#xff1a;https://www.cnblogs.com/Uncle-Joker/p/13686618.html 1.定位线概念&#xff1a;某个方位的影像在另一个方向的影像上的投影相交线&#xff0c;例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线。 举个例子&#xff1a;右边的是MR(核磁共…

C++设计模式之 简单工厂模式讲解(历史上最简单明白的例子)

工作之余&#xff0c;在看资料过程中发现一个极易理解的简单工厂模式的例子&#xff0c;自己亲自试练一番,感觉对这个设计模式不熟悉的朋友&#xff0c; 一看马上就知道是什么回事了。 简单工厂模式根据提供给它的数据&#xff0c;返回几个可能类中的一个类的实例。通常它返的…

【转】.NET Core 可移植类库PCL Portable Class Library详解

转自&#xff1a;https://www.kaifaxueyuan.com/server/dotnet-core/dotnet-core-portable-class-library.html 在这一章中&#xff0c;我们将讨论什么是PCL (可移植类库)&#xff0c;以及为什么我们需要PCL。为了理解这个概念&#xff0c;让我们打开上一章创建的类库项目文件夹…

设计模式C++实现(4)——原型模式、模板方法模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!

转自&#xff1a;医疗业务学习笔记--DICOM协议的基础内容 - 知乎 本文首发于“雨夜随笔”公众号&#xff0c;欢迎关注。 DICOM协议是医疗领域对如何处理、存储、打印和传输医疗图片的一系列标准。DICOM是 Digital Imaging and Communications in Medicine 的缩写&#xff0c;…

linux去掉u盘写保护,最全面win10系统下u盘写保护怎么去掉

U盘写保护就是只能读取U盘中的内容&#xff0c;但是却不能修改或者将其它文件保存在U盘&#xff0c;有时候U盘写保护妨碍我们使用&#xff0c;有些朋友想要将其接除&#xff0c;对此&#xff0c;我给大家整理了win10移除写保护的方法&#xff0c;希望能帮助到你U盘是通过USB接口…

设计模式C++实现(5)——桥接模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

【转】CT基本概念(必须掌握)!!!!!!!!!!!!!!

转自&#xff1a;http://www.bmecn.com/wenku/knowledge/988.html 1.像素&#xff08;Pixel&#xff09;和体素&#xff08;Voxel&#xff09; 像素&#xff08;Pixel&#xff09;是构成图像的基本单位&#xff0c;即图像可被分解成的最小的独立信息单元。因为图像是二维的&a…

推荐笔记本用户使用的硬盘。。。2.5”战胜台式机硬盘 日立7K320-250GB

2.5”战胜台式机硬盘 日立7K320-250GB 相关评测文章参考&#xff1a;http://www.beareyes.com.cn/2/lib/200808/07/20080807034_8.htm 转载于:https://www.cnblogs.com/bingdongli/archive/2008/10/05/1304169.html

设计模式C++实现(6)——适配器模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

设计模式C++实现(7)——装饰模式

装饰模式&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机&#xff0c;允许你为手机添加特性&#xff0c;比如增加挂件、屏幕贴膜等。一种灵活的设…

较为周全的Asp.net提交验证方案 (下)

接上篇。 下面要对这个生成的“提交验证”类进行功能扩展&#xff0c;通过.Net的“部分类”或“扩展方法”技术都可以轻松实现&#xff0c;这里采用的是“部分类”技术&#xff1a; 引用生成的ADO.NET Entity Framework数据模型的命名空间&#xff0c;且声明为部分类。 书写静态…