2

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

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

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

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

然后,我尝试实现 C-FIND 请求,但我从我的应用程序中收到错误“DIMSE No valid Presentation Context ID” (下一段中将详细介绍),但没有来自 DCM4CHEE 的其他日志。然后,我使用命令工具findscu(来自 dcmtk)查看是否存在一些配置问题,但该工具运行良好。因此,为了实现我的 C-FIND 请求,我已经阅读了findscu的源代码(此处)并在我的代码中进行了修改(这意味着我没有使用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)。它起作用了,我在 de server 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, ""); 无论如何,总是返回 0。

我觉得不可能调整movescu工具的代码,因为它看起来非常复杂,不适合简单的检索操作。

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

问候

4

1 回答 1

1

看起来你没有与 PACS 协商关联。

在添加表示上下文之后和发送任何命令之前,SCU 必须连接到 PACS 并与 和 协商DcmSCU::initNetworkPresentationContexts DcmSCU::negotiateAssociation

于 2018-10-04T12:05:38.563 回答