为什么我的 DICOM MWL SCP 仅发送 SUCCESS 响应而没有数据集?

问题描述 投票:0回答:1

我正在尝试使用 pynetdicom 编写一个简单的 DICOM MWL Worklist 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()
python dicom pynetdicom
1个回答
0
投票

我从未使用过该工具包,但我认为以下代码行是问题所在:

yield (0x0000, identifier)  # Success

0x0000
SUCCESS
,应在末尾发送,不附加任何数据集(在您的情况下为
identifier
)。在此之前,对于每个数据集,您的状态应为
0xFF00
,即
PENDING

我不了解相关编程语言的语法;如果我错了请纠正我。您的代码可能如下所示:

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

请参阅this答案了解更多详情。以下为原话:

MWL SCU(在您的情况下 - CR)使用它适合的(可选)过滤器启动查询。像往常一样,关联发生并且 MWL SCP 收到 MWL 请求。然后,它从数据库中获取与过滤器匹配的数据(如果有)。然后,它为从数据库获取的每一行发送一个 MWL 响应,每个响应的状态为 PENDING。传输所有行后,将发送最终的 SUCCESS 响应。如果没有找到与过滤器匹配的行,则仅发送最终响应。如果出现问题,则会发送正确的故障响应。然后,SCU 发送释放请求并在收到释放响应后关闭关联。

© www.soinside.com 2019 - 2024. All rights reserved.