FO-DICOM 实现C-Find + C-Move 客户端SCU 文件传输例子

DICOM
540
FO-DICOM
DICOM协议
C-Find
C-Move
DICOM

DICOM协议下 C#实现 CFind CMove的SCU简单例子

FO-DICOM 实现C-Find + C-Move 客户端SCU 文件传输例子

学习过程中理解到关于 CFind 、CMove 的一些业务逻辑说明 以及实现代码(复制粘贴即可使用),不讲解底层原理,大佬请无视

近期在项目需求有用到 CFind CMove 这两种方式一起的文件传输模式 (老实说觉得挺麻烦的),但该做还是要做的。 因为是第一次接触这种通信方式的项目,看了些网络相关资料,并不复杂,但多数对新人不是很友好 没有相关经验的理解起来比较困难,磕磕绊绊 总算是搞明白了,这里做下记录。

  1. C-Find 释义:可以想象成一个数据查询接口 提交对应查询条件(这个要看服务端查询的实现情况,服务端不支持的条件 加了也没用) 服务端返回给你对应的检查数据集合 (这里以StudyInstanceUID 为返回结果为例) 例子:
static string pacsIp = "127.0.0.1";///测试的服务IP
static int pacsPort = 5678;///测试的服务端口
static string localAe = "YUANTK";///本地的AE
static string remoteAe = "CONQUEST";///服务的AE

///查询10天内的Study数据(前提是服务器那边支持)
DicomDateRange SearchDateRange= new DicomDateRange(DateTime.Now.AddDays(-10), DateTime.Now);
DicomClient client = new DicomClient(pacsIp, pacsPort, false, localAe, remoteAe);
//var cfind = DicomCFindRequest.CreateStudyQuery(null,null,SearchDateRange);//调用演示例子
//由于本次测试的服务端并不支持时间范围查询 所以我这里测试没用加这个条件
var cfind = DicomCFindRequest.CreateStudyQuery();
///C-Find绑定结果回调事件 接收服务器返回的结果
cfind.OnResponseReceived = (rq, res) =>
{
          Console.WriteLine("cfind 请求完成");
          string StudyInstuceUID = res.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyInstanceUID, "");

         if (res.Status==Dicom.Network.DicomStatus.Success)
          {
                        Console.WriteLine("C-Find查询结束");
                        return;
		 }
          //到这里就可以拿到返回StudyInstuceUID 为后续的C-Move 做准备
          Console.WriteLine($"CFind 返回StudyInstuceUID :{StudyInstuceUID} ");
 };
///添加请求
client.AddRequestAsync(cfind).Wait();
///发送请求
client.SendAsync().Wait();
  1. C-Move 释义:就是发送一个指定StudyInstuceUID查询的然后 服务器会将查询结果以CStore的方式发送到指定的SCP收图服务 例子:
DicomClient CMoveClient = new DicomClient(pacsIp, pacsPort, false, localAe, remoteAe);

///理解这里耗费了学习过程的大部分时间
string TargetAe="CStoreSCP";//注意 这个是服务端配置的 请求成功后 服务会往对应的节点发送CStore文件请求
///创建CMove请求 指定对应的TargetAe 以及需要目标 StudyInstuceUID
DicomCMoveRequest CMoveRequest = new DicomCMoveRequest(TargetAe, StudyInstuceUID, Dicom.Network.DicomPriority.Medium);
///CMove绑定结果回调事件 接收服务器返回的结果
CMoveRequest.OnResponseReceived +=
(Dicom.Network.DicomCMoveRequest rq1, Dicom.Network.DicomCMoveResponse rs) =>
 {
        //成功后pacs会往指定的AE(TargetAe)发送CStore文件请求
	    if (rs.Status == Dicom.Network.DicomStatus.Success)
      {
             Console.WriteLine("CMove 请求完成");
             return;
      }
};
///添加请求
CMoveClient.AddRequestAsync(CMoveRequest).Wait();
///发送请求
CMoveClient.SendAsync().Wait();

说明:由于Fo-DICOM 的开源库 使用 版本不一样,可能会出现代码不完全一样的情况。

本文测试使用的模拟服务器软件是 CONQUEST 有兴趣的可以去官网下载一个做模拟测试

fo-dicom 怎么将图片png合成打包为dcm打印文件
医疗从业者必知!DICOM 3.0 标准基础知识入门资料(虽然枯燥乏味)
Windows下nginx通过网络反向代理DICOM设备间接直连外网服务器
DICOM 协议PrintSCP 对接GE设备打印无法通讯问题
fo-dicom如何实现print scu 虚拟打印软件发送图像
解决DicomTag中文乱码的编码解析对照表
DICOM浏览/DICOM虚拟打印/DICOM传输/处理/转换DICOM修改/医学数字成像
fo-dicom .net core 如何获取图像bitmap
FO-DICOM对接西门子CT(型号SOMATOM go.Now)Worklist服务的一些注意事项
关于fo-dicom对接岛津DR设备DICOM胶片打印PresentationLUT不支持
FO-DICOM胶片C-PrintSCP 虚拟打印服务端实现源码
FO-DICOM网络传输之C-ECHO和C-STORE简单实现例子
一款用于医疗DICOM胶片打印通信的调试测试PrintSCU工具
DicomStoreSCU-DICOM 协议 C-StoreSCU 医疗影像DCM批量转发测试工具
医疗领域DC-StoreSCP服务收图协议兼容性质测试工具
DICOM传输协议C-StoreSCU大批量转发测试工具
基于fo-dicom实现的DicomPrintScp胶片打印服务器收图源码
Dicom文件查看器|Dicom图像阅读器(MicroDicom Viewer 3.4.7)软件下载
基于dcmtk-3.6.7的编译好的资源包含了可以直接使用的exe和dll文件
DVTK工具包-DICOM验证工具DVTk-DICOM-Network-Analyzer
西门子医疗CT设备(SOMATOM go family)DICOM一致性声明电子说明文档
dicomTool.exe用于模拟DICOM协议客户端SCU的模拟测试工具
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删