为什么我的DICOM MWL SCP只发送成功响应而没有数据集?
我正在尝试用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 会发送释放请求,收到释放响应后就关闭连接。