Client
This section provides usage examples for Client implementation.
Sending Requests and Receiving Responses
Example of sending a single request message and collecting all responses until receiving the final one.
"""Send a request and collect all responses."""
from uds.addressing import AddressingType
from uds.client import Client
from uds.message import UdsMessage
from uds.transport_interface import AbstractTransportInterface
def main():
# configure your own Transport Interface
# https://uds.readthedocs.io/en/stable/pages/user_guide/quickstart.html#create-transport-interface
transport_interface: AbstractTransportInterface = ... # TODO: provide your implementation here
# configure client
# https://uds.readthedocs.io/en/stable/pages/user_guide/client.html#configuration
client = Client(transport_interface=transport_interface)
# define an example request message
request = UdsMessage(payload=[0x14, 0xFF, 0xFF, 0xFF],
addressing_type=AddressingType.PHYSICAL)
# send the request and collect all responses
request_record, responses_records = client.send_request_receive_responses(request)
# present sent message
print(f"Sent request: {request_record}")
# present received messages
if responses_records:
for i, response_record in enumerate(responses_records, start=1):
print(f"Response #{i}: {response_record}")
else:
print("No response message received.")
if __name__ == "__main__":
main()
Managing Tester Present
Example of periodic TesterPresent messages sending.
"""Start and stop periodic Tester Present sending."""
from uds.addressing import AddressingType
from uds.client import Client
from uds.transport_interface import AbstractTransportInterface
def main():
# configure your own Transport Interface
# https://uds.readthedocs.io/en/stable/pages/user_guide/quickstart.html#create-transport-interface
transport_interface: AbstractTransportInterface = ... # TODO: provide your implementation here
# configure the client
# https://uds.readthedocs.io/en/stable/pages/user_guide/client.html#configuration
client = Client(transport_interface=transport_interface,
s3_client=1000) # set 1000ms as period for Tester Present sending
client.tester_present_storage_size = 10 # adjust number of records stored if needed
# start periodic Tester Present sending
client.start_tester_present(addressing_type=AddressingType.PHYSICAL, # addressing type to use
sprmib=False) # disable Suppress Positive Response Message Indication Bit
# TODO: perform some action with tester present cyclically sent
# stop periodic Tester Present sending
client.stop_tester_present()
# access records of Tester Present request messages
print(client.last_sent_tester_present_requests)
if __name__ == "__main__":
main()
Using Background Receiving
Example of collecting response messages without sending a request.
"""Start and stop receiving response messages in the background."""
from uds.client import Client
from uds.transport_interface import AbstractTransportInterface
def main():
# configure your own Transport Interface
# https://uds.readthedocs.io/en/stable/pages/user_guide/quickstart.html#create-transport-interface
transport_interface: AbstractTransportInterface = ... # TODO: provide your implementation here
# configure the client
# https://uds.readthedocs.io/en/stable/pages/user_guide/client.html#configuration
client = Client(transport_interface=transport_interface)
# clear queue with response messages
client.clear_response_queue()
# start collecting all response messages sent to the client
client.start_background_receiving()
# try to get a response immediately
response_message_record = client.get_response_no_wait()
if response_message_record is None:
print("No response received so far.")
else:
print("Received response:", response_message_record)
# wait for a response message
response_message_record = client.get_response(timeout=1000) # wait up to 1000 ms for a response
if response_message_record is None:
print("No response received within timeout.")
else:
print("Received response:", response_message_record)
# stop collecting response messages
client.stop_background_receiving()
if __name__ == "__main__":
main()