Skip to content

Latest commit

 

History

History
62 lines (44 loc) · 2.46 KB

File metadata and controls

62 lines (44 loc) · 2.46 KB

Multicast IP Interface

This module implements transport of CAN and CAN FD messages over UDP via Multicast IPv4 and IPv6. This virtual interface allows for communication between multiple processes and even hosts. This differentiates it from the :ref:`virtual_interface_doc` interface, which can only passes messages within a single process but does not require a network stack.

It runs on UDP to have the lowest possible latency (as opposed to using TCP), and because normal IP multicast is inherently unreliable, as the recipients are unknown. This enables ad-hoc networks that do not require a central server but is also a so-called unreliable network. In practice however, local area networks (LANs) should most often be sufficiently reliable for this interface to function properly.

Note

For an overview over the different virtual buses in this library and beyond, please refer to the section :ref:`other_virtual_interfaces`. It also describes important limitations of this interface.

Please refer to the Bus class documentation below for configuration options and useful resources for specifying multicast IP addresses.

Supported Platforms

It should work on most Unix systems (including Linux with kernel 2.6.22+) but currently not on Windows.

Example

This example should print a single line indicating that a CAN message was successfully sent from bus_1 to bus_2:

import time
import can
from can.interfaces.udp_multicast import UdpMulticastBus

# The bus can be created using the can.Bus wrapper class or using UdpMulticastBus directly
with can.Bus(channel=UdpMulticastBus.DEFAULT_GROUP_IPv6, bustype='udp_multicast') as bus_1, \
        UdpMulticastBus(channel=UdpMulticastBus.DEFAULT_GROUP_IPv6) as bus_2:

    # register a callback on the second bus that prints messages to the standard out
    notifier = can.Notifier(bus_2, [can.Printer()])

    # create and send a message with the first bus, which should arrive at the second one
    message = can.Message(arbitration_id=0x123, data=[1, 2, 3])
    bus_1.send(message)

    # give the notifier enough time to get triggered by the second bus
    time.sleep(2.0)

Bus Class Documentation

.. autoclass:: can.interfaces.udp_multicast.UdpMulticastBus
    :members:
    :exclude-members: send