使用JAVA程序中的dcm4che连接到dcm4chee

时间:2018-03-01 11:11:52

标签: java dicom dcm4che

更新

我深入挖掘了dcm4che的源代码,发现如果有IncompatibleConnectionException则抛出true

  • 连接“未安装”
  • 或协议类型未设置或不匹配。

我不知道连接是“已安装”是什么意思,但是这个标志可以手动设置,所以我为getInstalled()的本地和远程连接设置了它(甚至用{{检查了它们) 1}}它们是否“已安装” - 现在是 - 现在这个属性为null)。

关于协议,它们没有指定,因此对于两个连接,我将它们设置为DICOM

结果:我仍然得到相同的例外。

我想使用dcm4chee(5.12.0)工具包在dcm4che(2.18.3)和我的JAVA应用程序之间建立DICOM关联。

问题是它似乎没有关于如何在JAVA应用程序中使用dcm4che的任何文档,所以我所能做的就是读取dcm4che的源代码并尝试弄清楚它的类和方法的用途,但我被困住了。如果有人已经有一个有效的例子,那将会非常有帮助。

到目前为止,我有:

import org.dcm4che3.net.ApplicationEntity;
import org.dcm4che3.net.Association;
import org.dcm4che3.net.Connection;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.pdu.AAssociateRQ;
import org.dcm4che3.net.pdu.PresentationContext;

...

ApplicationEntity locAE = new ApplicationEntity();
locAE.setAETitle("THIS_JAVA_APP");

Connection localConn = new Connection();
localConn.setCommonName("loc_conn");
localConn.setHostname("localhost");
localConn.setPort(11112);
localConn.setProtocol(Connection.Protocol.DICOM);
localConn.setInstalled(true);
locAE.addConnection(localConn);

ApplicationEntity remAE = new ApplicationEntity();
remAE.setAETitle("DCM4CHEE");

Connection remoteConn = new Connection();
remoteConn.setCommonName("rem_conn");
remoteConn.setHostname("localhost");
remoteConn.setPort(11112);
remoteConn.setProtocol(Connection.Protocol.DICOM);
remoteConn.setInstalled(true);
remAE.addConnection(remoteConn);

AAssociateRQ assocReq = new AAssociateRQ();
assocReq.setCalledAET(remAE.getAETitle());
assocReq.setCallingAET(locAE.getAETitle());
assocReq.setApplicationContext("1.2.840.10008.3.1.1.1");
assocReq.setImplClassUID("1.2.40.0.13.1.3");
assocReq.setImplVersionName("dcm4che-5.12.0");
assocReq.setMaxPDULength(16384);
assocReq.setMaxOpsInvoked(0);
assocReq.setMaxOpsPerformed(0);
assocReq.addPresentationContext(new PresentationContext(
    1, "1.2.840.10008.1.1", "1.2.840.10008.1.2"));

Device device = new Device("device");
device.addConnection(localConn);
device.addApplicationEntity(locAE);

Association assoc = locAE.connect(remAE, assocReq);

但我不知道我是否正确地做这件事。

我得到的错误:

org.dcm4che3.net.IncompatibleConnectionException: No compatible connection to DCM4CHEE available on THIS_JAVA_APP
at org.dcm4che3.net.ApplicationEntity.findCompatibelConnection(ApplicationEntity.java:646)
at org.dcm4che3.net.ApplicationEntity.connect(ApplicationEntity.java:651)

2 个答案:

答案 0 :(得分:2)

可能是您错过了您的设置中的Device个实例吗?您似乎需要DeviceApplicationEntityConnection都附加了private final Device device = new Device("findscu"); private final ApplicationEntity ae = new ApplicationEntity("FINDSCU"); private final Connection conn = new Connection(); public FindSCU() throws IOException { device.addConnection(conn); device.addApplicationEntity(ae); ae.addConnection(conn); }

查看来自dcm4che源的FindSCU.java来源。

Connection

我还认为,也许本地localhost:11112对象可以在没有任何参数的情况下实例化,这里的FindSCU示例演示了这一点。也许这些参数让人感到困惑,特别是考虑到你有本地和远程连接都指向Button

但是,必须同意,dcm4che3 API的文档完全不合适。

答案 1 :(得分:0)

修改

显然,我解决了这个问题。从

更改执行程序
Executor exec = (Runnable command) -> {};
device.setExecutor(exec);

ExecutorService executorService = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
device.setExecutor(executorService);
device.setScheduledExecutor(scheduledExecutorService);

做到了,所以我的应用程序正确地从服务器接收到关联响应。这可以作为其他人的参考。

感谢您分享代码。这对我真的很有帮助。

原始帖子

我无法使用类似于您提出的解决方案的代码来执行连接。我试图请求与dcm4che(均为5.14.1)的dcm4chee-arc-light关联,并且具有以下内容:

Device device = new Device(deviceName);
ApplicationEntity locAE = new ApplicationEntity(localAE);
Connection conn = new Connection();
Connection remote = new Connection();
AAssociateRQ rq = new AAssociateRQ();

device.addConnection(conn);
device.addApplicationEntity(locAE);
locAE.addConnection(conn);

ApplicationEntity remAE = new ApplicationEntity();
remAE.setAETitle(remoteAE);

remote.setCommonName("rem_conn");
remote.setHostname(remoteIP);
remote.setPort(remotePort);
remote.setProtocol(Connection.Protocol.DICOM);
remAE.addConnection(remote);

rq.setCalledAET(remAE.getAETitle());
rq.setCallingAET(locAE.getAETitle());
rq.setApplicationContext("1.2.840.10008.3.1.1.1");
rq.setImplClassUID("1.2.40.0.13.1.3");
rq.setImplVersionName("dcm4che-5.14.1");
rq.setMaxPDULength(16384);
rq.setMaxOpsInvoked(0);
rq.setMaxOpsPerformed(0);
rq.addPresentationContext(new PresentationContext(
        1, "1.2.840.10008.5.1.4.1.2.2.1", "1.2.840.10008.1.2"));

Executor exec = (Runnable command) -> {};
device.setExecutor(exec);

//Opens association and connects to remote server
Association as = locAE.connect(conn, remote, rq);

但是,当尝试连接到远程AET时,似乎没有收到来自远程AET的AAssociation响应。我的Java应用程序在Sta5中挂起(等待关联响应),而服务器在Sta6中挂起(准备进行数据传输)。

Java日志:

[main] INFO org.dcm4che3.net.Connection  - Initiate connection from 0.0.0.0/0.0.0.0:0 to localhost:11112
[main] INFO org.dcm4che3.net.Connection  - Established connection Socket[addr=localhost/127.0.0.1,port=11112,localport=50101]
[main] DEBUG org.dcm4che3.net.Association  - /127.0.0.1:50101>localhost/127.0.0.1:11112(1): enter state: Sta4 - Awaiting transport connection opening to complete
[main] INFO org.dcm4che3.net.Association  - DEVICEAE->DCMQRSCP(1) << A-ASSOCIATE-RQ
[main] DEBUG org.dcm4che3.net.Association  - A-ASSOCIATE-RQ[
  calledAET: DCMQRSCP
  callingAET: DEVICEAE
  applicationContext: 1.2.840.10008.3.1.1.1 - DICOM Application Context Name
  implClassUID: 1.2.40.0.13.1.3
  implVersionName: dcm4che-5.14.1
  maxPDULength: 16378
  maxOpsInvoked/maxOpsPerformed: 1/1
  PresentationContext[id: 1
  as: 1.2.840.10008.5.1.4.1.2.2.1 - Study Root Query/Retrieve Information Model - FIND
  ts: 1.2.840.10008.1.2 - Implicit VR Little Endian
 ]
]
[main] DEBUG org.dcm4che3.net.Association  - DEVICEAE->DCMQRSCP(1): enter state: Sta5 - Awaiting A-ASSOCIATE-AC or A-ASSOCIATE-RJ PDU

服务器日志:

19:11:29,397 INFO  - Accept connection Socket[addr=/127.0.0.1,port=50101,localport=11112]
19:11:29,397 DEBUG - /127.0.0.1:11112<-/127.0.0.1:50101(3): enter state: Sta2 - Transport connection open
19:11:29,416 INFO  - DCMQRSCP<-DEVICEAE(3) >> A-ASSOCIATE-RQ
19:11:29,416 DEBUG - A-ASSOCIATE-RQ[
 calledAET: DCMQRSCP
 callingAET: DEVICEAE
 applicationContext: 1.2.840.10008.3.1.1.1 - DICOM Application Context Name
 implClassUID: 1.2.40.0.13.1.3
 implVersionName: dcm4che-5.14.1
 maxPDULength: 16378
 maxOpsInvoked/maxOpsPerformed: 1/1
 PresentationContext[id: 1
 as: 1.2.840.10008.5.1.4.1.2.2.1 - Study Root Query/Retrieve Information Model - FIND
 ts: 1.2.840.10008.1.2 - Implicit VR Little Endian
  ]
 ]
19:11:29,419 DEBUG - DCMQRSCP<-DEVICEAE(3): enter state: Sta3 - Awaiting local A-ASSOCIATE response primitive
19:11:29,419 INFO  - DCMQRSCP<-DEVICEAE(3) << A-ASSOCIATE-AC
19:11:29,419 DEBUG - A-ASSOCIATE-AC[
 calledAET: DCMQRSCP
 callingAET: DEVICEAE
 applicationContext: 1.2.840.10008.3.1.1.1 - DICOM Application Context Name
 implClassUID: 1.2.40.0.13.1.3
 implVersionName: dcm4che-5.14.1
 maxPDULength: 16378
 maxOpsInvoked/maxOpsPerformed: 1/1
 PresentationContext[id: 1
 result: 0 - acceptance
 ts: 1.2.840.10008.1.2 - Implicit VR Little Endian
  ]
 ]
19:11:29,427 DEBUG - DCMQRSCP<-DEVICEAE(3): enter state: Sta6 - Association established and ready for data transfer

我感觉自己丢失了一些东西,但是我找不到问题的根源。感谢您提供任何帮助,因为我还是dcm4che和DICOM协议的新手。

谢谢。