背景:

如上一篇专栏博文所描述,Worklist可以看做是PACS系统、MODALITY设备和RIS系统之间的信息交换。从RIS系统到MODALITY通过Worklist可以提供诸如患者个人信息(姓名、年龄、生日等)和其他管理数据,以及提供关于成像过程和产生图像相关的一个唯一UID等信息。基本的结构如下图:

(具体来源不清楚了,非本人原创)

问题提出:

上一次利用DCMTK开源库顺利的模拟了“发送C-Find请求,查询worklist信息”的整个过程,通过利用DCMTK开源库提供的wlmscpfs.exe和findscu.exe工具包,使得模拟过程简单明了。此次希望通过fo-dicom(C#版的DCMTK)库来模拟该过程。

解决方案:

1)前提条件:

为了使得该模拟过程与上一篇博文的过程具有可比性,此次只利用fo-dicom库来构建C#版本的发送C-Find请求的过程,worklist服务端依然使用DCMTK提供的工具包wlmscpfs.exe。

2)利用fo-dicom发送C-Find请求:

具体代码如下,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using Dicom;
using Dicom.Network;
using Dicom.Log;namespace FindSCU1
{class Program{static void Main(string[] args){string id = "123456";var cfind = DicomCFindRequest.CreateWorklistQuery(patientId: id);cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>{Console.WriteLine("********Patient Name is  {0}**********", rp.Dataset.Get<string>(DicomTag.PatientName));};var client = new DicomClient();client.AddRequest(cfind);client.Send("127.0.0.1", 104, false, "SCU-LargeV", "OFFIS");Console.Read();}}
}

3)实际测试:

利用wlmscpfs.exe开启worklist服务,输入如下指令:

>wlmscpfs.exe 104 –d –dfp d:\DcmWorklist\wlistdb

显示效果如下:

表示worklist服务端已经顺利启动……

找到步骤2)中生成的可执行程序FindSCU1.exe,双击直接运行,此时服务端和客户端的结果如下:

(客户端) (服务端)

4)错误调试:

只是简单的发送了一次以PatientID为目标的worklist查询服务,代码总共没有几行的,为什么会出现异常呢?根据上述客户端的异常提示,通过单步调试,定位到首次抛出异常的“事故点”:DicomDatasetReaderObserver.cs的OnElement函数中,该函数是从DicomReader.cs的ParseDataset函数中跳转过来的。截取OnElement函数的代码,

发现该函数内部,由于无法识别VR类型为SQ的字段,因此而抛出了throw new DicomDataException("Unhandled VR in DICOM parser observer: {0}", vr.Code)异常。

仔细回想一下我们的代码在哪个位置会出现SQ类型的字段呢?只有在CreateWorklistQuery函数中可能添加过SQ类型的字段,进入到DicomCFindRequest.cs中的CreateWorklistQuery函数内部,发现的确有如下代码:

dimse.Dataset.Add(new DicomSequence(DicomTag.ReferencedStudySequence));

为了证实我们的猜测,此处直接将该行代码注释掉,然后在fo-dicom源码工程中编译DICOM工程,重新生成Dicom.dll程序集。重新编译运行我们的测试工程FinSCU1.exe。服务端和客户端能够顺利运行,

总结验证:

        修改fo-dicom库源码毕竟不是常规方法,在网络上搜索发现Github上有人遇到过类似的情形(https://github.com/rcd/fo-dicom/issues/62#issuecomment-46248073,如下图)最终也是修改fo-dicom源代码解决的。所以猜测可能是fo-dicom源代码中的部分逻辑还没有完善,还存在着些许漏洞。

为了验证是否是由于dimse.Dataset.Add(new DicomSequence(DicomTag.ReferencedStudySequence));添加了SQ格式的字段而导致的服务端错误,我们利用上次创建wlistqry.wl查询文件的DCMTK工程,向其中写入SQ格式的(0008,1110)DCM_ReferencedStudySequence字段,代码如下:

dataset->insertEmptyElement(DCM_ReferencedStudySequence);

然后利用findscu.exe 来进行查询操作,查看worklist服务端程序wlmscpfs是否正常,验证结果图如下:

        由此证明,根本原因并不是由于WorklistQuery中插入了SQ格式的字段所引起的,在此仅仅标记一下,等待后续的继续排查和验证。

(未完待续……)

作者:zssure@163.com

时间:2014-09-01

DICOM医学图像处理:利用fo-dicom发送C-Find查询Worklist相关推荐

  1. DICOM医学图像处理:二零一四▪DICOM专栏一览

    题记 二零一四刚过,新年伊始就发生了"外滩踩踏"恶性事件,告诫我们要珍爱生命,为自己更为家人-- 回顾去年,有些许收获.有些许感慨-- 曾经听过一个段子说两个在公司工作多年的老员工 ...

  2. 【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist

    转自:https://blog.csdn.net/zssureqh/article/details/38775315 背景: DICOM3.0协议中有介绍关于worklist的部分.简而言之,work ...

  3. 【转】DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    转自:https://my.oschina.net/zssure/blog/354816 背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DI ...

  4. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  5. 【转】DICOM医学图像处理:DICOM网络传输

    背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的.当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就 ...

  6. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  7. DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”

    背景: 续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件.即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式. 多幅JPG图像数据存入DCM文件: 为了避免引起歧义,这里着重说 ...

  8. 【转】DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    转自:https://www.cnblogs.com/mfrbuaa/p/4004114.html 有修订 背景介绍: 近期项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发 ...

  9. 【转】DICOM医学图像处理:浅析SWF、MWL、SPS、MPPS

    转自:https://blog.csdn.net/zssureqh/article/details/40151107 背景: 最近重新花时间阅读了DICOM标准,顺带着看了一下HL7标准和IHE,对标 ...

  10. DICOM医学图像处理:浅析SWF、WML、SPS、MPPS

    版权声明:本文为zssure原创文章,转载请注明出处,未经允许不得转载. 目录(?)[+] 背景: 最近重新花时间阅读了DICOM标准,顺带着看了一下HL7标准和IHE,对标题中提到的SWF.WML. ...

最新文章

  1. Android 串口通讯
  2. ps -aux返回超过100%
  3. redhat配置dns服务器bind
  4. python dataframe创建_python 创建一个空dataframe 然后添加行数据的实例
  5. Python 爬虫面试题 102 道
  6. MyBatis 传递多个参数
  7. MySQL 事务 | ACID、四种隔离级别、并发带来的隔离问题、事务的使用与实现
  8. 开发者们都在关注的网站
  9. 热图绘制一个快乐五一
  10. php 热点图,JavaScript_javascript如何写热点图,在gis中,你如果用js来写热点 - phpStudy...
  11. spring实战笔记6---springMVC的请求过程
  12. jsp实现简易购物车
  13. 视频云web播放器样式和组件自定义
  14. 实验室设备管理系统SQL代码
  15. 百度站内搜索使用教程
  16. 在docker中运行自己的eureka服务端
  17. 解决99%的卡刷包无法通过ROM制作工具修改的问题
  18. Pdf.js 解决电子印章问题
  19. 如何为已有的项目添加Maven
  20. S3C2440之IIC裸机驱动

热门文章

  1. 动易 转 html5,动易dedecms数据转成dedecms的php程序
  2. BP神经网络及其设计的一般原则
  3. pert计算公式期望值_PERT方法—用于计算各工序和工时的方法
  4. WPS Office 去广告绿色版(2013.11.13更新)
  5. fcntl函数的SET用法
  6. 双系统删除ubuntu后进入gun grub version 2.04的解决办法
  7. 80个练手H5小游戏实例DEMO和源码
  8. mhd matlab,应用 | 基于磁流体MHD的FLUENT-Maxwell集成耦合开发
  9. 解析kml文件,提取经纬度信息存入csv
  10. 北师计算机应用基础开放作业,北师大计算机应用基础开放作业答案