2014-09-18 1 views
0

나는 dcm4che2 라이브러리로 프로그래밍하는 초보자이며 Query/Retrieve Level을 Patient/Series/Image로 설정하여 PACS 서버를 쿼리하는 간단한 프로그램을 작성하고 있습니다.
코드는 매우 간단하고, 어떤 경우에는, 그것을 잘 작동합니다 : 어떤 경우에는 그러나dcm4che : DIMSE RSP의 가끔 예기치 않은 메시지 ID가 있습니까?

dcmqr.setCalledAET("AET_REMOTE", true); 
    dcmqr.setRemoteHost("aa.bb.cc.dd"); 
    dcmqr.setRemotePort(xxxx); 
    dcmqr.getKeys(); 

    dcmqr.setDateTimeMatching(true); 
    dcmqr.setCFind(true); 
    dcmqr.setCGet(false); 
    dcmqr.configureTransferCapability(true); 
    dcmqr.setQueryLevel(DcmQR.QueryRetrieveLevel.IMAGE); 

    dcmqr.addMatchingKey(new int[]{Tag.PatientName},sPatientName); 
    dcmqr.addMatchingKey(new int[]{Tag.Modality},sModality); 
    dcmqr.addMatchingKey(new int[]{Tag.AccessionNumber},sAccession); 
    dcmqr.addMatchingKey(new int[]{Tag.SeriesNumber},sSeriesNumber); 
    dcmqr.addReturnKey(new int[]{Tag.SeriesDescription}); 
    dcmqr.addReturnKey(new int[]{Tag.StudyDescription}); 
    dcmqr.addReturnKey(new int[]{Tag.PatientBirthDate}); 
    dcmqr.addReturnKey(new int[]{Tag.PatientSex}); 

    List<DicomObject> result = null; 

    try{ 
    dcmqr.start(); 
    dcmqr.open(); 
    result = dcmqr.query(); 
    dcmqr.stop(); 
    dcmqr.close(); 
    } 
    catch(Exception e){ 
     ... 
    } 

(내가 설정 때마다 쿼리 /에가 "이미지"레벨을 검색) (쿼리() 메소드가 실패

... 

[main] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << 3:C-FIND-RQ[pcid=1, prior=0 
     cuid=xyz/Study Root Query/Retrieve Information Model - FIND 
     ts=xyz/Implicit VR Little Endian] 

[AE_TITLE_X] INFO org.dcm4che2.net.PDUDecoder - AET_REMOTE(1) >> 2:C-FIND-RSP[ 
pcid=1, status=0H cuid=xyz/Study Root Query/Retrieve Information Model - FIND] 

[main] INFO org.dcm4che2.tool.dcmqr.DcmQR - Send Query Request #3/15 using .../Study Root Query/Retrieve Information Model - FIND: 
(0008,0052) CS #6 [IMAGE] Query/Retrieve Level 
(0008,0060) CS #2 [CT] Modality 
(0010,0010) PN #12 [xxx^yyyy] PatientÆs Name 
(0020,000D) UI #42 [x.y.z.zyx...] Study Instance UID 
(0020,000E) UI #56 [y.x.z.zyx...] Series Instance UID 

[AE_TITLE_X] WARN org.dcm4che2.net.Association - unexpected message ID in DIMSE RSP: 
(0000,0002) UI #28 [x.y.z.zax...] Affected SOP Class UID 
(0000,0100) US #2 [32800] Command Field 
(0000,0120) US #2 [2] Message ID Being Responded To 
(0000,0800) US #2 [257] Command Data Set Type 
(0000,0900) US #2 [0] Status 

[AE_TITLE_X] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << A-ABORT[source=0,  reason=0] 
[AE_TITLE_X] INFO org.dcm4che2.net.Association - AET_REMOTE(1): close Socket[addr=/aa.bb.cc.dd,port=xxx,localport=yyy] 

[main] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << 4:C-FIND-RQ[pcid=1, prior=0 
cuid=.../Study Root Query/Retrieve Information Model - FIND 
    ts=.../Implicit VR Little Endian] 
[main] WARN org.dcm4che2.net.Association - unable to send P-DATA-TF in state: Sta1 

사실, 나는이 오류의 의미와 해결책을 파악 않는 것을 이해할 수 없다 : 아래의보고 "예상치 못한 DIMSE RSP의 메시지 ID")와 A-중단 명령이 발생합니다. 나는 그것이 통신 문제라고 생각한다. 누군가 나를 도울 수 있니?

감사합니다.

답변

0

로깅에서 사용자가 쿼리 요청 # 3을 수행 한 다음 쿼리 요청 # 2에 대한 응답을 수신했음을 나타냅니다. 리스너가 이제 3에 대한 응답을 기대하는 경우 메시지 2에 대한 메시지 ID를 수신 했으므로 예외를 throw합니다.

이렇게하려면 쿼리 호출을 반복 할 경우 인스턴스 대신 목록으로 :

addMatchingKey(new int[] { Tag.SeriesInstanceUID }, "uid1\\uid2\\uid3"); 
+0

답장을 보내 주셔서 감사합니다. 나는 이해할 수 없다. Image 레벨에서 쿼리를 한 번만 만들고 있는데, 특정 시리즈 인스턴스 UID에 대한 이미지 목록을 얻으려고했다. 다음 RSP 메시지를 제대로 잡으려면 청취자 대기 시간을 늘려야합니까? 반대로, 예외를 잡아 더 나은 방법으로 관리 할 수 ​​있습니까? – Michele

+0

이전 쿼리 # 2 (AET_REMOTE (1) >> 2)에서 응답을 받기 전에 쿼리 # 3 (AET_REMOTE (1) << 3)을 작성하는 것처럼 로그에서 보입니다. 결과적으로 청취자는 이제 2가 아닌 메시지 ID 3을 기다리게됩니다. DEBUG 로그를 켜고 타이밍과 사용중인 Association을 조사해야 할 수 있습니다. – cneller

+0

안녕하세요, 감사합니다. 나는 SeriesInstanceUID가 Composite 객체 인스턴스 레벨에서 키들 사이에리스트되지 않는다는 것을 간과했다. SOPInstanceUID로 전환하는 것을 선호합니다. 문제가 해결되었습니다. – Michele