Skip to content

Latest commit

 

History

History
29 lines (19 loc) · 3.21 KB

README.md

File metadata and controls

29 lines (19 loc) · 3.21 KB

UDP2CAN converter (Linux-embedded)

Есть устройство с 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.