C++ DCMTK了解;DIMSE无有效的演示文稿上下文ID“;错误

C++ DCMTK了解;DIMSE无有效的演示文稿上下文ID“;错误,c++,dicom,dcmtk,C++,Dicom,Dcmtk,我目前正在开发一个简单的应用程序,用于在PACS上查询/检索数据。为此,我使用DCMTK,并使用DCM4CHEE PACS作为测试服务器 我的目标是实现简单的C-FIND查询和一个C-MOVE检索系统(结合一个定制的SCP来实际下载数据) 为此,我创建了一个CustomSCU类,它继承了DCMTK类 我首先实现了一个C-ECHO消息,它非常有效 然后,我尝试实现C-FIND请求,但从我的应用程序中得到错误“DIMSE No valid Presentation Context ID”(下一段将对

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

我的目标是实现简单的C-FIND查询和一个C-MOVE检索系统(结合一个定制的SCP来实际下载数据)

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

我首先实现了一个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();
//转移语法
列表ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_bigendian明确传输语法);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
//sop类
OFString pc=UID\u移动的PatientRootQueryRetrieveInformationModel;
addPresentationContext(pc、ts);
DcmDataset查询;
putAndInsertOFStringArray(DCM_QueryRetrievel,“患者”);
查询:putAndInsertOFStringArray(DCM_PatientID,);
OFCondition condition=sendMOVERequest(findPresentationContextID(pc,“”),getAETitle(),&query,nullptr);
返回条件。良好();
我还尝试使用UID\u MOVEStudyRootQueryRetrieveInformationModel代替UID\u 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
收到AASociatedRq
pc-1:as=/Patient Root Q/R InfoModel=FIND
ts=/xplicit VR Little Endian
ts=/Explicit VR Big Endian
ts=/VR隐式小端点
这意味着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);
列表ts的
;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_bigendian明确传输语法);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
OFString pc1=UID\u FINDPatientRootQueryRetrieveInformationModel;
OFString pc=UID\u移动的PatientRootQueryRetrieveInformationModel;
addPresentationContext(pc1,ts);
addPresentationContext(pc、ts);
(另请参阅研究根)

但这并没有奏效。 问题似乎在于客户端,如findPresentationContextID(pc,“”);无论发生什么情况,总是返回0

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

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


关于

看来您没有与PACS协商关联事宜


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

非常感谢!这就是问题所在!