DCMTK 理解 "DIMSE No valid Presentation Context ID" 错误
DCMTK Understand the "DIMSE No valid Presentation Context ID" error
我目前正在为 PACS 上的 querying/retrieving 数据开发一个简单的应用程序。为此,我使用 DCMTK,并使用 DCM4CHEE PACS 作为测试服务器。
我的目标是实现简单的 C-FIND 查询和 C-MOVE 检索系统(结合自定义 SCP 以实际下载数据)。
为此,我创建了一个 CustomSCU class,它继承了 DCMTK DcmSCU class。
我首先实现了一个 C-ECHO 消息,效果很好。
然后,我尝试实现 C-FIND 请求,但我从我的应用程序中收到错误 "DIMSE No valid Presentation Context ID" (更多内容在下一段),但是没有来自 DCM4CHEE 的其他日志。然后我使用命令工具 findscu(来自 dcmtk)查看是否存在配置问题,但该工具运行良好。因此,为了实现我的 C-FIND 请求,我阅读了 findscu (here) 的源代码并在我的代码中对其进行了调整(这意味着我没有使用DcmSCU::sendCFindRequest 但 class 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 No valid Presentation Context ID
据我了解,表示上下文是一种或多种传输语法与一种 SOP 的串联 class。我读到问题可能来自不接受我的演示文稿上下文的 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
这意味着 movescu 工具会在尝试实际移动之前进行查找?
因此,我更改了我的应用程序上下文创建:
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, ""); 总是 return 0,无论如何。
我觉得不可能调整 movescu 工具的代码,因为它看起来非常复杂并且不适合简单的检索操作。
我不知道该尝试什么。我希望有人能帮助我理解发生了什么。这是我申请的最后一部分,因为存储 SCP 已经可以工作了。
此致
您似乎没有与 PACS 协商关联。
添加演示文稿上下文后发送任何命令之前,SCU 必须连接到 PACS 并与 DcmSCU::initNetwork
协商演示文稿上下文,然后 DcmSCU::negotiateAssociation
。
我目前正在为 PACS 上的 querying/retrieving 数据开发一个简单的应用程序。为此,我使用 DCMTK,并使用 DCM4CHEE PACS 作为测试服务器。
我的目标是实现简单的 C-FIND 查询和 C-MOVE 检索系统(结合自定义 SCP 以实际下载数据)。
为此,我创建了一个 CustomSCU class,它继承了 DCMTK DcmSCU class。
我首先实现了一个 C-ECHO 消息,效果很好。
然后,我尝试实现 C-FIND 请求,但我从我的应用程序中收到错误 "DIMSE No valid Presentation Context ID" (更多内容在下一段),但是没有来自 DCM4CHEE 的其他日志。然后我使用命令工具 findscu(来自 dcmtk)查看是否存在配置问题,但该工具运行良好。因此,为了实现我的 C-FIND 请求,我阅读了 findscu (here) 的源代码并在我的代码中对其进行了调整(这意味着我没有使用DcmSCU::sendCFindRequest 但 class 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 No valid Presentation Context ID
据我了解,表示上下文是一种或多种传输语法与一种 SOP 的串联 class。我读到问题可能来自不接受我的演示文稿上下文的 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
这意味着 movescu 工具会在尝试实际移动之前进行查找? 因此,我更改了我的应用程序上下文创建:
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, ""); 总是 return 0,无论如何。
我觉得不可能调整 movescu 工具的代码,因为它看起来非常复杂并且不适合简单的检索操作。
我不知道该尝试什么。我希望有人能帮助我理解发生了什么。这是我申请的最后一部分,因为存储 SCP 已经可以工作了。
此致
您似乎没有与 PACS 协商关联。
添加演示文稿上下文后发送任何命令之前,SCU 必须连接到 PACS 并与 DcmSCU::initNetwork
协商演示文稿上下文,然后 DcmSCU::negotiateAssociation
。