Verification Service Examples

The DICOM Verification Service allows an Application Entity to verify application level communication between itself and another AE by using the DIMSE C-ECHO service. It only has a single supported SOP Class.

The Verification Service is mostly used to verify basic connectivity and as a starting point when troubleshooting associations, particularly when handlers are bound to the more fundamental notification events like evt.EVT_PDU_RECV or evt.EVT_DATA_RECV or with the log level set to debug:

from pynetdicom import debug_logger

debug_logger()

Verification SCU

Associate with a peer DICOM Application Entity and request the use of the Verification Service.

from pynetdicom import AE
from pynetdicom.sop_class import Verification

# Initialise the Application Entity
ae = AE()

# Add a requested presentation context
ae.add_requested_context(Verification)

# Associate with peer AE at IP 127.0.0.1 and port 11112
assoc = ae.associate("127.0.0.1", 11112)

if assoc.is_established:
    # Use the C-ECHO service to send the request
    # returns the response status a pydicom Dataset
    status = assoc.send_c_echo()

    # Check the status of the verification request
    if status:
        # If the verification request succeeded this will be 0x0000
        print('C-ECHO request status: 0x{0:04x}'.format(status.Status))
    else:
        print('Connection timed out, was aborted or received invalid response')

    # Release the association
    assoc.release()
else:
    print('Association rejected, aborted or never connected')

You can also use the inbuilt VerificationPresentationContexts when setting the requested contexts.

from pynetdicom import AE, VerificationPresentationContexts

ae = AE()
ae.requested_contexts = VerificationPresentationContexts

Verification SCP

Create an AE that supports the Verification Service and then listen for association requests on port 11112. When a verification request is received over the association we rely on the default handler bound to evt.EVT_C_ECHO to return an 0x0000 Success status.

 from pynetdicom import AE
 from pynetdicom.sop_class import Verification

 # Initialise the Application Entity
 ae = AE()

 # Add the supported presentation context
 ae.add_supported_context(Verification)

# Start listening for incoming association requests in blocking mode
ae.start_server(("127.0.0.1", 11112), block=True)

You can also optionally bind your own handler to evt.EVT_C_ECHO. Check the handler implementation documentation to see the requirements for the evt.EVT_C_ECHO handler.

from pynetdicom import AE, evt
from pynetdicom.sop_class import Verification

# Implement a handler for evt.EVT_C_ECHO
def handle_echo(event):
    """Handle a C-ECHO request event."""
    return 0x0000

handlers = [(evt.EVT_C_ECHO, handle_echo)]

ae = AE()
ae.add_supported_context(Verification)
ae.start_server(("127.0.0.1", 11112), evt_handlers=handlers)