Есть устройство с Linux в качестве ОС. Данное устройство имеет Ethernet и несколько интерфейсов CAN. Необходимо разработать скрипт или программу, позволяющую использовать данное устройство как конвертер UDP-to-CAN, где каждому CAN-устройству соответствует определенный приемный UDP-порт, данные с которого передаются в соответствующий CAN, и наоборот, данные, пришедшие из CAN, передаются на другой, заранее определенный UDP-порт по заранее определенному IP-адресу. В качестве API работы с CAN рекомендуется использовать SocketCAN.
- перейти в папку с исходным кодом
- собрать проект с помощью make
- запустить
cd udp2can
make
./udp2can
В директории с исходным кодом лежит конфигурационный файл в JSON формате. interface_map.json
. В этом файле задаётся связь между интерфейсом can и udp-портом.
main
:
intfmap_read_mapping_table()
- функция, которая считывает JSON из файла в строку, парсит его и заполнеят внутреннюю структуру данных interface_map
(список соединений udp->can и can->udp). Также в этой функции происходит удаление одинаковых элементов списка, чтобы в дальнейшем не создавались идентичные потоки.
intfmap_get_diff_udp2can_conn
и intfmap_get_diff_can2udp_conn
- функциии считают количество разных соединений. Также, если, например, на один can-интерфейс приходят данные из нескольких портов, выставляется флаг, говорящий о том, что при создании потока для данного соединения, необходимо создать мютекс для синхронного доступа к интерфесу. Мютекс в дальнейшем передаётся потоку в качестве аргументов в структуре conn_data_t
. Такая же логика реализована и для случая, если несколько can-интерфейсов пересылают данные в одну связку ip:port.
На основе этого в фукнции main
создаётся по одному потоку на каждое соединение.
Для проксирования данных из UDP в CAN создаются потоки udp2can_listener
.
Для проксирования данных из CAN в UDP потоки can2udp_listener
.