Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
_SayHello
548 / 307 / 102
Регистрация: 30.07.2015
Сообщений: 1,101
1

LwIP + UDP + multicast

27.02.2018, 12:05. Просмотров 667. Ответов 2
Метки нет (Все метки)

Добрый день, в предыдущей теме Передача/прием UDP пакетов stm32f107vct6, получилось наладить передачу/прием UDP пакетов с помощью библиотеки lwIP. Теперь возникла задача, засунуть это все в мультикаст, насколько я понимаю lwIP это делать умеет, так как поддерживает IGMP. Осталось придумать, как это прикрутить

Добавлено через 2 часа 39 минут
Разобрался. Для работы с мультикастом необходимо
1) Установить дефайн в opt.h
C++
1
#define LWIP_IGMP                       1
2)Установит флаг IGMP в функции low_level_init d ethernetif.c
C++
1
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_IGMP;
3)добавить в main адрес мультикаста и подключиться к группе
C++
1
2
3
4
5
struct ip_addr Multicast_Addr;
IP4_ADDR(&Multicast_Addr, 224, 0, 0, 7 ); 
#if LWIP_IGMP
    igmp_joingroup(IP_ADDR_ANY,&Multicast_Addr);
#endif
4)Открываем новый сокет UDP
C++
1
2
3
    UDPpcb = udp_new();
    udp_bind(UDPpcb, IP_ADDR_ANY, port);
    udp_recv(UDPpcb, udp_echo_recv, NULL);
5) Шлем в мультикаст пакет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void UDP_Sender(__IO uint32_t localtime )
{
    char buf[] = "bla bla bla Hello!";
    if(localtime - UDPTimer >= 500)
    {    
        UDPTimer = localtime;
        struct pbuf *p;
        p = pbuf_alloc(PBUF_TRANSPORT, strlen(buf), PBUF_RAM);
        if (p == NULL) return;
        struct ip_addr server;
        IP4_ADDR(&server, 192,168,0,2);
        memcpy(p->payload, buf, strlen(buf));
        udp_sendto(UDPpcb, p, &Multicast_Addr, port);
        pbuf_free(p);
    }
}
5) Реализуем функцию приема, просто дергаем светодиод
C++
1
2
3
4
5
6
void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
    /*Тут что хотите, то и делайте по приему пакета*/
    GPIOD->ODR ^= GPIO_Pin_13;
    pbuf_free(p);
}
6) Лезем в настройки хардварного Ethernet и находим строчку при инициализации структуры Ethernet
C++
1
  ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
Меняем на
C++
1
  ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_None;
Отключаем фильтрацию маков по мультикасту, без этого к сожалению завести прием у меня не получилось.
7) лезем в opt.h и lwipopts.h находим строки
C++
1
#define UDP_TTL                 255
меняем на
C++
1
#define UDP_TTL                 1
Для мультикаста должно быть значение 1, иначе пакет если не приняли будет гулять по сети (я так думаю).
8) Втыкаем в хаб плату, уходим в другой кабинет и ловим в WireShark пакеты, радуемся что все идет.
9) Посылаем в мультикаст с любой машины сети, на адрес группы любой пакет в нужный порт и моргаем светодиодом удаленно.
10) Профит.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2018, 12:05
Ответы с готовыми решениями:

STM32F4+PHY+FREERTOS+LWIP+UDP скорость
Кто-нибудь тестировал максимальную скорость передачи данных при использовании...

STM32F217 & LwIP 1.3.2
Имеем плату storterkit STM32F217. Ethernet PHY: KSZ8721BL. OS: FriiRTOS. С...

LWIP на LPC2368
Хочу поднять LWip на LPC2368 без FriirTOS. Необходимо сделать TCP-client,...

STM32F107+LAN8720+lwIP.
Здравствуйте! Понадобилось запустить данную связку и встал вопрос в поиске...

STM32F407-lwip-sockets
Связываю PC и STM32F407, подключаю через socket. Все работает, но, если...

2
Витальич
1272 / 1182 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
27.02.2018, 22:57 2
Цитата Сообщение от _SayHello Посмотреть сообщение
IP4_ADDR(&server, 192,168,0,2);
Смотрю мой адрес на свой поправили , шутка. Но не понимаю зачем этот режим нужен. Хотя скорей всего я мыслю однобоко исходя из своей задачи. Все ровно спасибо нашел время проверить код
0
_SayHello
548 / 307 / 102
Регистрация: 30.07.2015
Сообщений: 1,101
28.02.2018, 00:29  [ТС] 3
Витальич, да уж ваш код стал неплохим подспорьем в работе с API UDP) Хотя самые проблемы были с нижним уровнем и портированием.
Этот режим шибко желает видеть руководство. Хотя по сути Мультикаст используется в основном такими технологиями типа IPTV, где есть один вещатель, и он вещает единый поток по айпишнику из диапазона мультикаста(группу) 224.0.0.0 - 239.0.0.0 вроде, клиентов много, они могут "подписаться" на эту группу, и все они будут слушать поток. В любой момент они могут отключиться и пропускать все мимо ушей. Типа броадкаста, только по группам. При этом сервер может даже не знать адреса клиентов.
Тут как я понял задача стоит в том, что будет много плат - датчиков, все воткнуты в один свич. Делим датчики по группам и объединяем таким образом с сервера можно управлять группой в один мультикатный адрес.
Тут я однако затупил, клиент по идее не должен вещать обратно в мультикаст. Точнее он может вещать, но чувствую будут грабли когда будет много клиентов, ибо пакет от каждого клиента отправленного в сеть будет пойман не только сервером но и остальными клиентами, что есть плохо., наверное.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2018, 00:29

ARM, lwip, ftp
Долгие поиски не помогли мне найти готового решения для связки arm + lwip + ftp...

FreeRTOS+LwIP на TE-STM32F207
Доброго времени суток, такая ситуация: необходимо плату использовать как...

STM32F429+LAN8720A+LwIP
Запускаю подобную связку, интерфейс RMII. Смотрю что на пине REFCLK, а там вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru