本文介绍两种胶片打印的模式,(1)dcm4che通用的,(2)通过dcmtk的exe 命令行链接的.
这两种模式唯一的区别在于通过dcmtk 的exe的命名行的形式打印胶片,一般医院的的胶片打印机型号如果是国产的,或者是通过服务的方式链接的打印引擎,一般需要使用第二种.
一. dcm4che 通用打印引擎(用的dcm4chee里面的类和jar包)
首先得知道这个胶片打印机能不能通,也就是echo服务了
这种链接不能像其他的机器,直接ping ip 和端口的,即使ping通了,但是也不一定能用
(1) 先创建一个 ApplicationEntity 通用程序实体,这个实体其实就是胶片打印机的信息(也称被请求实体 scp)
Device device = new Device(); device.setDeviceName("Remote"); device.setInstalled(true); Connection conn = new Connection(); conn.setHostname(strRemoteIP); conn.setPort(nRemotePort); device.addConnection(conn); ApplicationEntity remoteAE = new ApplicationEntity(); remoteAE.setAETitle(strRemoteAETitle); ---注意一下这个title 在dicom系统里面是唯一的 remoteAE.addConnection(conn); device.addApplicationEntity(remoteAE);
AE Title:在DICOM网络中每一个DICOM系统都会被分配一个名称,即Application Entity Title,简称AETitle。AE Title用于标识DICOM网络中的唯一(Unique)DICOM系统(有点类似于互联网中的IP地址),因此在一个DICOM网络环境中,要确保每一个DICOM系统拥有唯一的名称——这个工作通常由DICOM网络管理员来完成。AE Title最长不超过16个字符,通常在实际应用过程中都采用大写字母来表示,当然也可以使用小写字母及其他ASCII码
(2) 再创建一个 ApplicationEntity 通用程序实体,这个实体其实就是本地服务器的信息(也称请求端实体名称 scp)
Device device = new Device(); device.setDeviceName("Local"); device.setInstalled(true); Connection conn = new Connection(); device.addConnection(conn); ApplicationEntity AE = new ApplicationEntity(); AE.setAETitle("AE"); AE.addConnection(conn); device.addApplicationEntity(AE); device.setExecutor(Executors.newSingleThreadExecutor()); device.setScheduledExecutor(Executors.newSingleThreadScheduledExecutor());
(3)建立联系,scu 客户端 会与scp服务端建立链接
这个链接会带描述,告诉服务端scp想要什么服务,也就是我们说的Presentation Contexts.Presentation Contexts 一般是一系列长度小于128的被称为描述上下文的消息列表,每一个描述上下文代表一种客户端期望的服务. 客户端用DICOM标识符来标识每种服务,即SOP Class UID(Service Object Pair Class Unique Identifier),在DICOM标准的第4部分有详细介绍.
AAssociateRQ aarq = new AAssociateRQ(); aarq.addPresentationContextFor(TCloudDicomUID.VerificationSOPClass, TCloudDicomUID.ImplicitVRLittleEndian);
(4)创建链接
Association as = ae.connect(remoteAE, aarq);
这块大家可以看看源码,其实源码还是通过Socket 进行链接的
(5)取联系的结果
上一步,scu客户端已经链接上了scp服务端,现在需要看看服务端给的反馈结果
DimseRSP rsp = as.cecho(); ----看了源码,会根据具体回应的消息id,来分发到不同的操作里面.
boolean result = rsp.next(); ---这个是建立的联系的结果
这种错误就是本地模拟的胶片打印机 jdicom,出错了,异常了
这种就是链接超时
这种就是正确链接的,下面是jdicom打印出来的log日志
Waiting for invocations from clients...
jdicom: #42:AE >> A-ASSOCIATE-RQ PDU
jdicom: #42:AE << A-ASSOCIATE-AC PDU
jdicom: #42:AE >> C-ECHO-RQ Verification SOP Class
jdicom: #42:AE << C-ECHO-RSP , status #0000H[Success]
jdicom: #42:AE >> A-RELEASE-RQ PDU
jdicom: #42:AE << A-RELEASE-RP PDU
jdicom: #42:AE closing socket
感觉一节有点多,下一篇继续介绍胶片打印了