【转】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 的过程:

  1. C-Move SCU(10.3.13.202)向 C-Move SCP(10.3.2.209) 发送 A-ASSOCIATE 请求;
  2. C-Move SCP(10.3.2.209)响应 C-Move SCU(10.3.13.202)的 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 连接:

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

后续的蓝色框就是 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 连接就会断开:

  1. C-Move SCP(C-Store SCU,10.3.2.209)向 C-Move SCU(C-Store SCP,10.3.13.202) 发送 A-RELEASE 请求断开 association;
  2. C-Move SCU(C-Store SCP,10.3.13.202)响应 C-Move SCP(C-Store SCU,10.3.2.209)的 A-RELEASE 请求,然后断开两个 AE 之间的 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 连接:

  1. C-Move SCU(10.3.13.202)向 C-Move SCP(10.3.2.209) 发送 A-RELEASE 请求断开 association;
  2. C-Move SCP(10.3.2.209)响应 C-Move SCU(10.3.13.202)的 A-RELEASE 请求,断开 C-Move 连接的 association;

以上就是 C-Move 两方通信详细交互过程的分析。



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

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

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

相关文章

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

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

哪些设计模式最值得学习

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

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

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

对比 SQL Server 2005 和 Oracle

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.5”战胜台式机硬盘 日立7K320-250GB 相关评测文章参考: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)——适配器模式

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

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

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

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

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

linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面

Ubuntu 14.04上基本完美支持GNOME经典界面,安装配置步骤如下:1. 安装gnome-session-flashbacksudo apt-get install gnome-session-flashback这个包安装后,注销后,在登录界面就能选择GNOME Flashback (Compiz)这个桌面环境了。2. …

设计模式C++实现 —— 策略模式

策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法&#…

【转】DIB位图(Bitmap)的读取和保存

转自:https://www.cnblogs.com/wangguchangqing/p/5417444.html 设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的,可以在W…

【转】DCMTK各模块说明!!!!!!!

转自:https://blog.csdn.net/Kelvin_Yan/article/details/50765693 有删改 原文来自wiki DCMTK:http://support.dcmtk.org/redmine/projects/dcmtk/wiki/modules 各模块说明 These are the modules of the public DCMTK toolkit (version 3.6.0): 关…