DCMTK Понять «DIMSE Нет действительного идентификатора контекста представления» ошибка

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

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

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

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

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

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

(тоже пробовал изучать root)

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

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

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

С уважением

1

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector