someipy v2: What’s New

This page outlines the new features and changes introduced in version 2 of the someipy Python package. Version 2 introduces a new architecture and a refined application API, addressing limitations present in version 1.0.

New Architecture

someipy v2 features a redesigned architecture that eliminates key weaknesses of the previous version. In v1, each application utilizing someipy required its own network interface. Version 2 centralizes network interface handling within a dedicated someipyd daemon.

  • someipyd Daemon: A new someipyd.py daemon is introduced to manage all communication, including:

    • SOME/IP service discovery via UDP multicast and unicast.

    • SOME/IP message exchange (methods, events, fields).

  • Unix Domain Socket Communication: Applications using someipy communicate with the someipyd daemon via Unix Domain Sockets, eliminating the need for direct network access.

  • Centralized Network Handling: The someipyd daemon handles all network communication, allowing applications to remain lightweight and focused on application logic.

  • Scalability: Each ECU or PC can run a single someipyd daemon, supporting an arbitrary number of applications.

someipy v2 Architecture

The diagram above illustrates the new architecture, showcasing the central role of the someipyd daemon in managing all SOME/IP communication.

New Application API

The application API has been streamlined for ease of use and flexibility. The following snippets demonstrate the core elements of the new API:

someipy_daemon = await connect_to_someipy_daemon()

Establish a connection to the someipyd daemon.

addition_method = Method(
    id=SAMPLE_METHOD_ID,
    protocol=TransportLayerProtocol.UDP,
)
addition_service = (
    ServiceBuilder()
    .with_service_id(SAMPLE_SERVICE_ID)
    .with_major_version(1)
    .with_method(addition_method)
    .build()
)

Define a service with its methods, eventgroups, and events.

client_instance_addition = ClientServiceInstance(
    daemon=someipy_daemon,
    service=addition_service,
    instance_id=SAMPLE_INSTANCE_ID,
    endpoint_ip=interface_ip,
    endpoint_port=3002,
)

Construct a ClientServiceInstance for service interaction.

method_parameter = Addends(addend1=1, addend2=2)
method_result = await client_instance_addition.call_method(
    SAMPLE_METHOD_ID, method_parameter.serialize()
)

sum = Sum().deserialize(method_result.payload)
print(f"Sum: {sum.value.value}")

Prepare method parameters, call the method, and deserialize the result.

await someipy_daemon.disconnect_from_daemon()

Disconnect from the daemon.