Dicom 学习笔记-DICOM C-Store 消息服务
引言
之前总体介绍了 DICOM 的消息服务,可以参考这篇博文,但是有关每个服务的详细信息没有讲解,本文就结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Store 服务。
名词简介
在正式讲解前我们还需要弄明白以下几个名词
- SCU:Service Class User,可以理解为客户端(用户端);
- SCP:Service Class Provider。可以理解为服务端;
C-Store 消息服务
前文已经说明了 C-Store 服务用于一个 DIMSE-service-user 在同等的 DIMSE-service-user 上存储一个复合 SOP 实例,其实主要就是用来归档影像,在实际场景中,医院的设备(DR【普放】、CT【断层扫描】、MR【核磁】)做完检查后会产生影像文件(复合 SOP 实例),然后设备会通过 C-Store 服务将这些影像文件归档到 PACS 系统中。在这个过程中设备就相当于客户端,需要实现 C-Store SCU,PACS 系统相当于服务端,需要实现 C-Store SCP。
C-Store 流程如下:
C-Store SCU
结合开源库 fo-dicom 我们可以很轻松的实现 C-Store SCU,fo-dicom 已经封装好了 C-Store Request,具体代码可以在 GitHub 上查看 DicomCStoreRequest.cs,我们只需要如下的代码就可以实现 C-Store SCU:
这里需要引用命名空间【Dicom.Network】
using Dicom.Network;
var client = new DicomClient(); client.NegotiateAsyncOps(); var request = new DicomCStoreRequest({DICOM file path}); request.OnResponseReceived += (req, response) => { Console.WriteLine("C-Store Response Received, Status: " + response.Status); }; client.AddRequest(request); client.Send({C-Store SCP IP}, {C-Store SCP Port}, false, {C-Store SCU AE Title}, {C-Store SCP AE Title});
- DICOM file path 指待归档的 DICOM 文件路径;
- C-Store SCP IP 指 C-Store 服务端的 IP 地址或机器名;
- C-Store SCP Port 指 C-Store 服务端的端口;
- C-Store SCU AE Title 指 C-Store 客户端应用实体的名称;
- C-Store SCP AE Title 指 C-Store 服务端应用实体的名称;
基于以上代码就实现了一个简单的 C-Store 客户端,可用于归档单张影像,涉及到多张影像归档可在外层增加循环实现。
C-Store SCP
C-Store SCP 可以通过派生 DicomService 服务类来实现 Dicom 服务的基本框架,然后实现 IDicomServiceProvider 和 IDicomCStoreProvider 接口来实现。具体代码可以参考这里。
最后我们将 C-Store SCP 的代码运行起来,然后使用上面 C-Store SCU 的代码来归档一张影像,然后我们会在 C-Store SCU 收到如下成功的消息【C-Store Response Received, Status: Success】,同时在 C-Store SCP 工程的【bin】目录下能找到一个【DICOM】文件夹,文件夹里面就是刚刚测试归档的影像。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java入门系列-18-抽象类和接口
抽象类 在第16节继承中,有父类 People People people=new People(); people.sayHi(); 实例化People是没有意义的,因为“人”是一个抽象的概念。 怎么才能避免父类的实例化呢?使用 abstract 关键字修饰类(抽象类)。 抽象父类 public abstract class People { private String name; public People(String name) { super(); this.name = name; } //人类共有方法 哭 public void cry() { System.out.println("呜呜"); } //抽象方法 不做具体实现 public abstract void sayHi(); public String getName() { return name; } public void setName(String name) { this.name = name; } } 子类:Chinese.java //中国人 public class Chinese ext...
- 下一篇
JavaScript学习(二)
一、javascript基本代码 /**/ 多行注释 //单行注释 要养成一个良好的写注释习惯,也可以通过注释来对代码进行简单的测试。 1.JS中严格区分大小写 2.JS中每一条语句以分号结尾。 ---如果不写分号,浏览器会自动添加,但是会消耗一些系统资源。有些时候浏览器会加错分号。 3.JS中会自动忽略多个空格和换行,所以可以利用空格和换行对代码进行格式化 字面量:都是一些不可改变的值,可以直接使用,一般不会直接使用字面量。 比如:1、2、3、4、5 变量:变量可以用来保存字面量,而且变量的值可以任意改变。变量更方便我们使用,通过变量描述字面量,所以在开发中都是使用变量。 声明变量:在JS中,使用var关键字来声明变量。 /*声明变量:使用var关键字 */ var a=3; console.log(a); 标识符:在JS中所有可以由我们自主命名的都可以称为是标识符。例如:变量名、函数名、属性名 命名一个标识符规则:1.标识符中可以含有字母、数字、下划线、$,不能使用数字开头 2...
相关文章
文章评论
共有0条评论来说两句吧...