基于DCMTK的DICOM通讯服务程序设计与实现
2012-10-15郏岩岩刘哲星艾育华季飞陈芳炯耿仁文
郏岩岩,刘哲星 ,艾育华 ,季飞 ,陈芳炯,耿仁文
1.华南理工大学 电子与信息学院,广东 广州 510641;2. 南方医科大学 生物医学工程学院,广东 广州510515;3. 南方医科大学南方医院,广东 广州 510515
0 前言
DICOM(Digital Imaging and Communications in Medicine)标准是由美国放射学会和美国电器制造商协会组织制定的标准,它涉及到医学数字图像的采集、归档、通信、显示及查询等操作的各个层面。DICOM通讯服务程序是一个基于DICOM标准协议,实现调度和管理DICOM图像文件的应用程序,处于图像存档及通讯系统(PACS)的核心部分。随着远程医疗技术的飞快发展,不同地区或医院的PACS 系统间的DICOM通信量大大增加,为了更加高效、方便地管理这些业务,开发用于区域医疗信息中心和远程会诊的DICOM通信服务程序意义重大。DCMTK(DICOM Tool Kit)是德国OFFIS公司提供的开源项目,经过10多年的开发和维护,已经基本实现了DICOM协议的内容,并且支持不同操作系统下的应用开发,为我们开发DICOM通信软件提供了有力的工具。
1 DICOM通讯基础
1.1 DICOM消息格式
DICOM消息包含命令集和数据集两部分。一个DICOM数据集实际上就是一个SOP(Service Object Pair)实例,DICOM数据集是由DICOM数据元素(Data Element) 按一定的顺序排列组成的,DICOM数据元素则是DICOM文件中最基本的结构单元[1]。命令集的构成类似于数据集,包含很多的命令元素,但不同的是每个命令元素仅包括标签、值长和值域三个部分[2]。DICOM消息格式,见图1。
此外,数据集里的内容是按照层次的关系进行组合的,即对于一个数据集来说,要包含病人(Patient)、检查(Study)、系列(Series)和图像(Image)4层信息。
图1 DICOM消息格式
1.2 DICOM服务类
DICOM服务类由信息对象对(Service Object Pair,SOP)来表述,又由于同样的服务可以操作不同的信息对象定义(Information Object Definition,IOD),所以将SOP称作SOP class[3]。而SOP class 就是由IOD和一组消息服务元素(DIMSE)组成的。如1.1节所述,消息服务元素对应于命令集,而IOD对应数据集。
DICOM为其所定义的信息对象制定了标准化的服务类型。因为DICOM的信息对象包括复合对象和规范化对象两种,相应的服务也分为复合服务和规范化服务。不论是什么服务,都要通过一组消息服务元素(DICOM Message Service Element,DIMSE)来实现。这些DIMSE大致分为两类,即对于复合信息对象定义的5种DIMSE(叫做DIMSE-C),对于规范化信息对象定义的6种DIMSE(叫做DIMSE-N),其表述见表1(指定了服务类型:操作类型和通知类型[2])。
表1 DIMSE表
服务的执行是使用服务原语来描述的,在服务的使用过程中需要明确的是服务发起者还是服务执行者。
1.3 DICOM通信过程[4]
DICOM的网络通信建立在TCP/IP之上,但是由于涉及到个人隐私等问题,所以必须保证通信的安全性,最基本的做法就是只在指定的AE(Application Entity,用来标示应用程序)之间进行通信。
在进行DICOM通信时,通信中的AE之间首先需要进行必要的协商,其中最基本的就是传输语法和抽象语法。传输语法是指数据集所要求的VR方法和字节顺序;抽象语法来表明AE都支持哪些SOP class。这些工作主要是由DICOM的上层协议来完成的,相对于OSI 7层协议的会话层和表示层。
通信的请求方首先使用默认的传输语法给出自己可以用的传输语法和抽象语法清单由对方选择。通信的另一方则根据自身的硬件和操作系统等软件情况选择合适的传输语法和抽象语法,并回答对方。这样协商之后就可以在AE之间确定用于DICOM消息交互的环境。
在DICOM标准协议中,上述连接的建立是通过一对A-ASSOCIATE-RQ和A-ASSOCIATE-AC关联的服务来实现的,之后在这个连接之上就可以将1.2节所述的各种消息服务封装在P-DATA请求原语中进行通信[5]。
以存储服务类SCP端为例,通信过程如下[6]:
(1) 建立TCP连接。DUL (DICOM Upper Layer) FSM(Finite State Machine)初始时处在状态1,在接收到TCP连接指示(Transport Connection Indication)后,发送TCP连接响应(Transport Connect Response),FSM进入状态2,等待连接请求。
(2)建立DICOM连接(Association)。SCP接收到A- ASSOCIATERQ PDU后,开始检查解析此PDU,FSM进入状态3,等待连接响应指示(A-ASSOCIATE Response)。接收到A-ASSOCIATE响应指示,SCP发送A-ASSOCIATE-AC PDU,FSM进入状态6,连接建立,准备接收数据。
(3)消息数据的传递。SCP接收到P-DATA-TF PDU后,发送P-DATA 指示原语,表明数据已接收到,该数据首先应该是DICOM命令集,此处为C-STORE 请求服务,当然也可以包含数据元素,比如请求方AE。此时FSM还是要进入状态6,用来接收DICOM数据集。然后SCP重复上面的动作,不停接收P-DATA-TF PDU,直到所有的数据接收完毕。当接收完数据之后,SCP构造一个不含数据集的命令集封装在P-DATA 请求原语(P-DATA Request Primitive)中,发送给对方,告诉对方可以发送其他数据或安全地释放连接。这时FSM仍然处在状态6。
(4)释放DICOM连接。SCP接收到A-RELEASE-RQ PDU后,发出A-RELEASE指示原语,FSM进入状态8。当再接收到A-RELEASE响应原语(A-RELEASE Response Primitive)时,SCP发出A-RELEASE-RP PDU,FSM进入状态13,等待TCP释放连接。
(5)释放TCP连接。
2 DICOM服务程序设计
2.1 DICOM服务程序功能架构
DICOM服务程序的功能架构,见图2。服务程序既可以接受DICOM AE的存储请求,归档发来的图像,还必须支持对PACS系统中DICOM图像的查询和获取的请求,此外,还要支持数据图像的调度,如将一些特定的图像从一个AE调度到另一个AE[7]。
当然,服务程序的运行需要后台数据库和存储媒介的支持。
图2 DICOM服务程序功能架构图
2.2 DICOM服务程序设计
DICOM服务程序的设计满足以下的基本要求[8]:
(1)对从网络上或设备中获取的图像进行归档,支持检索和获取,所使用的通信协议符合DICOM标准第7部分和第8部分。作为PACS系统的核心部分,服务程序的性能和稳定性直接影响到对图像传输、查询、浏览、储存和处理的速度。对图像归档首先要接受DICOM AE的存储请求,所以服务程序必须支持C-STORE服务;支持检索和获取,移动不同DICOM AE之间的数据,则要求程序具有提供C-FIND,C-MOVE和C-GET服务的能力;此外,还需提供用于通讯测试的C-ECHO服务。
(2)数据库的设计反映了医学影像中各实体的及其状态在计算机中的信息描述。DICOM标准第6部分对医学影像中所有可能涉及到的各种实体、操作和处理过程中的数据类型和属性都做了详细的定义[9-11]。
数据库表的创建主要依赖DICOM Query/Retrieve 信息模型,根据DICOM标准可知,DICOM信息模型分为4个内容层次:病人(Patient),检查(Study),系列(Series)和图像(Image)。一个病人可以包含一个或多个检查,一个检查包含一个或多个系列,一个系列又可以包含一个或多个图像。但是在实际运用中,很多活动都是围绕着检查进行,因此将病人和检查合并为一张表,是提高查询速度、减少数据存储冗余度的一个方法。所以需要创建Study表、Series表和Image表,表的对应关系为Study表中的一条记录对应多条Series表的记录,Series中的一条记录对应多条Image表的记录。表设计时并没有使用STUDY_INSTANCE_UID,SERIES_INSTANCE_UID和 SOP_INSTANCE_UID作为主键,原因在于考虑到实际操作中,所有的图像并非都是来自标准DICOM设备的DICOM格式的图像,对于那些从其他格式转化过来的图像,需要人工分配这些全局唯一值,因此单独另设主键是必要的。另外,为了便于与不同的AE连接,需要添加工作站表,此表所包含的列为AE_TITLE、IP_ADDRESS、HOST_NAME、PORT、DESC。 主键为STATION_KEY[12]。
(3)对影像文件的存储格式应遵循DICOM标准第10部分,支持对DICOM文件的无损和有损压缩存储[13]。
2.3 DICOM服务程序的管理
服务程序具有以下基本的管理界面[14-15]。
(1)进程管理界面。服务程序的运行需要很多功能的支持,包括存储能力、归档能力、查询能力、获取能力、移动图像的能力和验证连通性的能力,这么多的功能可以分别编译成不同的命令行程序,以服务的形式在后台运行。服务程序界面用Qt开发,利用类QTabwidget不同页对应不同的管理界面,进程管理界面,见图3。
图3 服务程序的进程管理界面图
(2)配置界面。包括不同后台程序运行需要的端口配置,服务程序的AE title配置和文件存储路径配置等。
(3)数据库的维护界面。关于数据库的基本操作,如重置数据库,列出数据库的布局信息和清空数据库等操作。
(4)通信的AE titles界面。服务程序需要连接的通信方AE Titles,在这个界面下添加和删除。
(5)服务程序运行状态信息。显示一些服务程序运行过程中的提示状态。
(6)通信操作界面。包括验证连通性和一些查询、获取、存储、移动图像的基本操作。
3 DICOM服务程序开发
3.1 DCMTK简介[16]
DCMTK是由德国OFFIS公司提供的开源项目,已经实现了DICOM协议的大部分内容。该开发包提供所有的源代码、支持库和帮助文档。它完全是由ANSI C和C++写成的,被广泛地应用于各种公司和医院的开发平台中。DCMTK提供了很多的程序包,本服务程序所用的程序包有ofstd,oflog,dcmdata,dcmnet和dcmqrdb。这些程序包以组件的形式进行组合,使用时被编译成lib文件。与DICOM服务程序密切相关的组件是dcmdata,dcmnet和dcmqrdb。
dcmdata是一个DICOM数据编码/解码库,这个模块包含了一些类来管理DICOM数据结构和文件。同时它也提供了对DICOMDIR文件的支持以满足Dicom storage media(存储介质)的需要。
dcmnet是一个网络库。该模块包含了实现DICOM网络通信的所有函数集,即:DICOM上层有限状态机(DUL FSM,DICOM Upper Layer Finite State Machine), 关 联 控 制服务元素(ACSE,Association Control Service Element)以及DICOM消息服务元素(DIMSE ,DICOM Message Service Element)。
dcmqrdb是一个图像数据库服务器。此模块具有图像归档功能,管理一块存储区域,并允许使用DICOM存储服务类将图像存储在这些存储区域中。它也允许使用DICOM查询/获取服务类查询图像属性并获取图像。
3.2 服务程序实现
服务程序要实现C-STORE、C-FIND、C-MOVE、C-GET和C-ECHO客户端服务的功能主要依赖dcmnet组件,分别调用dimse.h中的函数DIMSE_storeUser()、函数DIMSE_findUser()、函数DIMSE_moveUser()、函数DIMSE_getUser()和函数DIMSE_echoUser()使用这些服务请求。对这些服务的实现较为简单,下面重点介绍服务端服务的实现。
服务程序的归档服务的实现是运行存储服务的SCP(STORESCP.exe)先接受DCIOM文件,存放到某一临时文件夹,然后让入库程序(inDicomDatabase.exe)检测,如有文件,则分层次将DICOM文件信息写入数据库。考虑到数据库的不同类型和程序的可移植性,服务程序对数据库的操作使用Qt的QODBC编程。
对DICOM查询获取服务的实现主要依赖dcmqrdb组件中的类DcmQueryRetrieveSCP,该类封装了所有处理细节。在使用该类时,需要用到数据库的操作类,dcmqrdb提供了类DcmQueryRetrieveIndexDatabaseHandle处理文本数据库。查询获取服务程序只需调用类DcmQueryRetrieveSCP的 成 员 函 数 OFCondition waitForAssociation(T_ASC_Network* theNet)就可以完成所有的操作。查询过程如1.3节所述,对该过程的实现都被封装成不同的函数,比如用于接收DICOM连接请求和释放响应的函数分别是函数ASC_receiveAssociation()和函数ASC_acknowledgeRelease()。主要用于处理查询获取服务处理的函数是类DcmQueryRetrieveSCP的私有成员函数dispatch(),在一个连接上,dispatch()函数通过while()循环,可以处理服务C-ECHO、C-FIND、C-MOVE 和C-GET,正常情况下通过A-RELEASE-RQ退出循环。
其中函数ASC_receiveAssociation()由于处理DICOM连接请求,因此需要调用dul.cc中的处理上层协议的函数。其中最为重要的就是函数DUL_ReceiveAssociationRQ(),该函数会处理一些连接所用的私有参数,特别是它会调用函数receiveTransportConnectionTCP()处理一些底层的TCP连接的请求。该函数具有处理多进程的功能,如linux下调用函数fork(),windows下调用WINAPI函数CreateProcess()。
对于一个查询移动服务来说,同时处理来自不同AE的连接请求是一个基本的要求,遗憾的是类DcmQueryRetrieveSCP并不支持多进程,因此需要修改代码来实现多进程功能。选择增加选项“--fork”来控制程序,以便使用receiveTransportConnectionTCP()函数中的多进程代码。不得不提的一个问题,函数waitForAssociation()调用的函数ASC_associationWaiting()中的函数select()会与函数receiveTransportConnectionTCP()中的函数select()相冲突,因此对ASC_associationWaiting()做了一定的修改,对处于底层的receiveTransportConnectionTCP()的代码则保留不变。
组件dcmqrdb并不支持常用数据库,如sqlserver,oracle等。用常用数据库代替文本数据库,需要对类DcmQ ueryRetrieveIndexDatabaseHandle进行替换。由于该类继承虚基类DcmQueryRetrieveDatabaseHandle,因此设计的用于操作常用数据库的新类DcmQueryRetrieveSqlDatabaseHandle,仍使用虚基类提供的接口。同样服务程序对数据库操作使用的是Qt的QODBC编程。
4 结束语
本文描述了基于DCMTK开源库构建DICOM通讯服务程序的过程,并介绍了其基本实现所调用的DCMTK的函数和类。开发的DICOM服务程序的功能还有待完善,运行的性能还需要进一步的优化,如在进程间通讯、多线程管理和高效的数据库访问等方面还需要进一步的研究和改进。
[1] NEMA.Digital Imaging and Communications in Medicine(DICOM) Part 3:information object definitions[S].NEMA Standards Publication,2011.
[2] NEMA.Digital Imaging and Communications in Medicine(DICOM)Part 7:message exchange[S].NEMA Standards Publication,2011.
[3] NEMA.Digital imaging and Communications in Medicine(DICOM) Part 4:Service class specifications[S].NEMA Standards Publication,2011.
[4] NEMA.Digital Imaging and Communications in Medicine(DICOM) Part 8:network communication support for message exchange[S].NEMA Standards Publication,2011.
[5] 王岩,田捷,韩博闻. DICOM通讯机制的设计与实现[J].计算机应用研究,2000,(12):63-64.
[6] 孔祥勇,宋健,顾文军.基于DCMTK的医学影像工作站设计[J].计算机与现代化,2010,(10):78-80.
[7] 徐瑾,胡绍海.医学数字图像通讯标准服务器的设计与实现[J].铁路计算机应用,2005,14(5):15-17.
[8] 刘刚,吴翔虎,曲明成,等.HL7在HIS系统中的应用研究[J].中国医疗设备,2011, 26(2):42-48.
[9] Sahu.DICOM search in medical image archive solution e-Sushrut Chhavi[J].Electronics Computer Technology,2011,6:256-260.
[10] 程梦云,朱俊,宁交贤,等.DICOM医学图像的存档管理和传输技术的研究[J]. 四川大学学报, 2006,43(3):599-604.
[11] Gerard L.Distributed database for a picture archiving and communications system[C].Proceedings of SPIE-The International Society for Optical Engineering,1999.
[12] 邓小琳,朱俊,宁交贤,等.基于Oracle数据库的DICOM医学图像管理系统技术研究[J].中国医学物理学杂志,2008,25(2):574-577.
[13] NEMA.Digital Imaging and Communications in Medicine(DICOM) Part 10:Media storage and file format for media interchange[S].NEMA Standards Publication,2011.
[14] MERGE.eFilm workstation[EB/OL].(2012-05-30)[2011-07-11].Https://estore.merge.com/na/index.aspx
[15] Marcel van Herk.ConQuest[DB/OL].(2012-05-30)[2011-07-11].Http://www.idoimaging.com/program/183
[16] OFFIS. DICOM tool kit 3.6.0[DB/OL].(2012-05-30)[2011-07-11].Http://dicom.offis.de/dcmtk.php.en.