为什么我的DICOM MWL SCP只发送成功响应而没有数据集?

1 投票
1 回答
46 浏览
提问于 2025-04-14 16:10

我正在尝试用pynetdicom编写一个简单的DICOM MWL工作列表SCP(服务控制点)。文档里没有提供示例,只是说它和C-FIND是一样的。

下面的代码只发送了状态SUCCESS,但是在测试MWL SCU时,数据集/病人并没有出现在列表中。我正在使用miele-wl-scu来模拟设备查询工作列表。

import pydicom

from pydicom.dataset import Dataset

from pydicom.uid import UID
from pynetdicom import AE, evt, debug_logger
from pynetdicom.sop_class import ModalityWorklistInformationFind

debug_logger()

def on_c_find(dataset, context= None, info= None):
    """Handle a C-FIND request event."""
    # Check if ScheduledProcedureStepSequence exists        
    
    # Create the response dataset
    identifier = Dataset()

    identifier.PatientName = 'Hahah'
    identifier.AccessionNumber = 'asa'
    identifier.RequestedProcedureDescription = 'asa'
    identifier.is_little_endian = True
    identifier.is_implicit_VR = True

    # Yield the response dataset
    yield (0x0000, identifier)  # Success        

def main():

    ae = AE()

    # Add supported presentation contexts
    ae.add_supported_context(ModalityWorklistInformationFind) # C FIND
    ae.add_supported_context(UID('1.2.840.10008.1.1')) # ECHO
    
    # Set callback functions
    handlers = [(evt.EVT_C_FIND, on_c_find)]

    print("Starting DICOM Worklist Server...")

    # Start the DICOM server
    ae.start_server(('localhost', 11112), evt_handlers=handlers)
    
if __name__ == "__main__":
    main()

1 个回答

1

我没有使用过这个工具包,但我觉得下面这行代码可能是问题所在:

yield (0x0000, identifier)  # Success

这里的 0x0000 代表 SUCCESS,应该在最后发送,而且不需要附带任何数据集(在你的情况下是 identifier)。在此之前,对于每个数据集,你的状态应该是 0xFF00,也就是 PENDING

我对你提到的编程语言的语法不太了解,如果我说错了请纠正我。你的代码可能长这样:

yield (0xFF00, identifier)  # Pending
yield (0x0000, null)  # Success

想了解更多细节,请参考 这个回答。以下是引用内容:

MWL SCU(在你的情况下是 CR)会用合适的(可选的)过滤条件来发起查询。像往常一样,建立连接后,MWL SCP 收到 MWL 请求。然后它会从数据库中获取符合过滤条件的数据。如果有数据,它会为每一行返回一个 MWL 响应,每个响应的状态都是 PENDING。当所有数据行都传输完毕后,会发送最终的 SUCCESS 响应。如果没有找到符合条件的数据,只会发送最终的响应。如果出现问题,会发送适当的失败响应。然后 SCU 会发送释放请求,收到释放响应后就关闭连接。

撰写回答