DCMTK了解“ DIMSE没有有效的演示上下文ID”错误

时间:2018-10-04 11:29:28

标签: c++ dicom dcmtk

我目前正在开发一个简单的应用程序,用于在PACS上查询/检索数据。为此,我使用DCMTK,并使用DCM4CHEE PACS作为测试服务器。

我的目标是实现简单的C-FIND查询和C-MOVE检索系统(与自定义SCP结合以实际下载数据)。

为此,我创建了一个 CustomSCU 类,该类继承了DCMTK DcmSCU类。

我首先实现了一条C-ECHO消息,效果很好。

然后,我尝试实现C-FIND请求,但是从我的应用程序中收到错误“ DIMSE没有有效的演示上下文ID” (在下一段中有更多介绍),但没有其他错误从DCM4CHEE登录。然后,我使用了命令工具 findscu (来自dcmtk)来查看是否存在一些配置问题,但是该工具运行良好。因此,为了实现我的C-FIND请求,我已经阅读了 findscu here)的源代码,并将其修改为我的代码(这意味着我没有使用 DcmSCU :: sendCFindRequest ,但类为 DcmFindSU )。

但是现在,我在C-MOVE请求中遇到了同样的问题。我的代码非常简单:

//transfer syntaxes
OFList<OFString> ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);

//sop class
OFString pc = UID_MOVEPatientRootQueryRetrieveInformationModel;

addPresentationContext(pc, ts);

DcmDataset query;
query.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "PATIENT");
query.putAndInsertOFStringArray(DCM_PatientID, <ThePatientId>);


OFCondition condition = sendMOVERequest(findPresentationContextID(pc, ""), getAETitle(), &query, nullptr);
return condition.good();

我还尝试使用 UID_MOVEStudyRootQueryRetrieveInformationModel 代替 UID_MOVEPatientRootQueryRetrieveInformationModel ,结果相同:我的应用程序显示错误

  

DIMSE没有有效的演示上下文ID

据我了解,表示上下文是一种或多种传输语法和一个SOP类的串联。我读到问题可能来自不接受我的演示文稿上下文的PACS。可以肯定的是,我使用了 movescu 工具(来自DCMTK)。它起作用了,我在服务器DCM4CHEE的日志中看到了这一点:

received AAssociatedRQ
pc-1 : as=<numbers>/Patient Root Q/R InfoModel = FIND
       ts=<numbers>/Explicit VR Little Endian
       ts=<numbers>/Explicit VR Big Endian
       ts=<numbers>/Implicit VR Little Endian

这意味着movecu工具会在尝试实际移动之前进行查找? 因此,我使用:

更改了我的应用程序上下文创建。
OFList<OFString> ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);


OFString pc1 = UID_FINDPatientRootQueryRetrieveInformationModel;
OFString pc = UID_MOVEPatientRootQueryRetrieveInformationModel;

addPresentationContext(pc1, ts);
addPresentationContext(pc, ts);

(也尝试过研究根)

但这并不能解决问题。 问题似乎出在客户端,因为 findPresentationContextID(pc,“”); 无论如何都返回0。

我认为无法改编moveScu工具的代码,因为它看起来非常复杂,不适合简单的检索操作。

我不知道该怎么办。我希望有人能帮助我了解发生了什么。那是我应用程序的最后一部分,因为存储SCP已经可以工作了。

致谢

1 个答案:

答案 0 :(得分:1)

您似乎没有在与PACS进行协商。

添加演示文稿上下文之后,在发送任何命令之前,SCU必须连接到PACS并先与DcmSCU::initNetwork然后与DcmSCU::negotiateAssociation协商PresentationContext。