【转】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,一经查实,立即删除!

相关文章

linux rar命令没找到,Linux没有rar解压命令

使用微软系统的同学都知道rar解压缩软件,它是一个商业的收费软件,那在免费开源的linux系统怎么解压后缀为rar的文件呢,我相信很多同学都是先把rar的文件下载到电脑本地,然后再用7-zip或者winrar 等等解压缩软件解压再压缩为zip的文…

PID是什么?在做系统的故障排除时如何使用它?

PID Process Identifier, 是一个全局唯一的用来标识进程的整数。在多任务系统中,可用来诊断系统中发生错误的进程。转载于:https://www.cnblogs.com/zhangliang2121/archive/2008/09/17/1292510.html

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

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

查看linux不显示ip,linux系统查看IP地址,不显示IP地址或者只显示127.0.0.1

LUA学习笔记三·时间等操作系统库1.构造时间 2.时间制定格式输出 3.计时器(闭包)os.difftime (t2, t1) 返回以秒计算的时刻 t1 到 t2 的差值. (这里的时刻是由 os.time 返回的值). 在 POS ...String定义与方法//5种构造方法 public void Con(){ Strin…

哪些设计模式最值得学习

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

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

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

linux mysql关闭启动不了了,linux启动或关闭mysql失败的解决办法

linux启动或关闭mysql时提示:Warning: World-writable config file /etc/my.cnf is ignored.什么鬼? 意思是: 警告:全世界都能写的一个配置文件已经被我给忽略了。什么要忽略?因为mysql觉得他太low了,不安全…

对比 SQL Server 2005 和 Oracle

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

C++设计模式之四 模板模式

《TemplateMethod1.h》 #include <iostream> #include <string> using namespace std;class A{public:A(){};virtual ~A(){};void Method();protected:virtual void b() 0;virtual void c() 0;};class B: public A{public:B(){};virtual ~B(){};protected:voi…

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

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

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

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

关于html和javascript在浏览器中的加载顺序问题的讨论(zz)

前一阵子横扫了javascript&#xff0c;当时自我感觉良好。现在一想&#xff0c;又觉得没什么。今天的任务是把asp.net ajax中客户端页面生命周期那一章研究完。然而&#xff0c;因为这一章的内容使我产生了一些迷惑。这些疑惑在书中都没有只字提及。 一、html页面的详细加载过程…

linux中sybase删除数据库,Linux_Sybase ASE数据库的常见问题解答,1 数据库占用磁盘空间的形式 - phpStudy...

Sybase ASE数据库的常见问题解答1 数据库占用磁盘空间的形式是什么&#xff1f;Master数据库的作用是什么&#xff1f;如果master失败后果如何&#xff1f;设备文件. 存储系统表, 系统将无法使用, 除非重建master库2 段的实质是什么&#xff1f;已被SYBASE中对象使用的段可否被…

【转】.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;让我们打开上一章创建的类库项目文件夹…

sql表的所有者

今天建立了一个表&#xff0c;名为tmp_pactrebate,默认的所有者为dbo,如果想改成所有者是自己的名字&#xff0c;例如&#xff1a;wcj 在查询分析器中执行这句话即可 EXEC sp_changeobjectowner dbo.tmp_pactrebate, wcj 改后的表名为:wcj.tmp_pactrebate select * from wcj.tm…

loadrunner linux 端口,Linux下loadrunner generator的安装

Loadrunner linux generator version&#xff1a;9.5Step1&#xff1a;建立一个普通用户loadrunner&#xff0c;目录&#xff1a;/home/loadrunner&#xff0c;将安装文件考到/home/loadrunner下面&#xff0c;但是需要使用root用户安装&#xff0c;./installer.sh –consoleSt…

设计模式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接口…

PHPBB安装

安装phpbb&#xff1a; 1、先下载phpbb安装包&#xff0c;根据自己需要下载中文包或英文包&#xff1b; 2、上传到phpmysql空间里&#xff0c;解压缩&#xff1b; 3、建立数据库&#xff1b; 4、在地址栏里输入自己的域名http://example.com/ 5、根据提示安装&#xff0c;其中会…