DCMTK Понимают ошибку «DIMSE Нет действительного идентификатора контекста представления» - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время я разрабатываю простое приложение для запроса / извлечения данных на PACS.Для этой цели я использую DCMTK и PACS DCM4CHEE в качестве тестового сервера.

Моя цель - реализовать простые запросы C-FIND и систему извлечения C-MOVE (в сочетании с пользовательским SCP для фактической загрузки данных).

Для этого я создал класс CustomSCU , который наследует класс DCMTK DcmSCU .

Сначала я реализовал сообщение C-ECHO, которое прекрасно работало.

Затем я попытался реализовать запрос C-FIND, но получил ошибку "DIMSE Нет действительного идентификатора контекста представления" (подробнее об этом в следующем абзаце) из моего приложения, но нет другого журнала из DCM4CHEE.Затем я использовал командный инструмент findcu (из dcmtk), чтобы увидеть, была ли какая-то проблема с конфигурацией, но инструмент просто работал нормально.Поэтому, чтобы реализовать мой запрос C-FIND, я прочитал источник findcu ( здесь ) и адаптировал его в своем коде (это означает, что я не использую 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 Нет действительного идентификатора контекста представления

Как я понимаю, контекст представления - это конкатенация одного или нескольких синтаксисов передачи и одного класса SOP.Я прочитал, что проблема может исходить от PACS, которая не принимает мои контексты презентации.Чтобы быть уверенным, я использовал инструмент movecu (из 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

Это означает, что инструмент movcu выполняет поиск перед попыткой фактического перемещения?Поэтому я изменил создание контекста приложения с помощью:

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);

(также попытался изучить root)

Но это не сработало.Проблема, кажется, лежит на стороне клиента, так как findPresentationContextID (pc, ""); всегда возвращает 0, несмотря ни на что.

Я не чувствую, что возможно адаптироватькод инструмента movcu, поскольку он выглядит очень сложным и не подходит для простых операций извлечения.

Я не знаю, что попробовать.Я надеюсь, что кто-то может помочь мне понять, что происходит.Это последняя часть моего приложения, так как хранилище SCP уже работает.

С уважением

1 Ответ

0 голосов
/ 04 октября 2018

Похоже, вы не договаривались об ассоциации с PACS.

После добавления контекстов представления и перед отправкой какой-либо команды SCU должен подключиться к PACS и согласовать PresentationContexts с DcmSCU::initNetwork, а затемDcmSCU::negotiateAssociation.

...