STM32 基础系列教程 37 - Lwip_igmp
前言
組播通信的特點是報文從一個源發出,被轉發到一組特定的接收者。但在組播通信模型中,發送者不關注接收者的位置信息,只是將數據發送到約定的目的組播地址。要使組播報文最終能夠到達接收者,需要某種機制使連接接收者網段的組播路由器能夠了解到該網段存在哪些組播接收者,同時保證接收者可以加入相應的組播組中。IGMP就是用來在接收者主機和與其所在網段直接相鄰的組播路由器之間建立、維護組播組成員關系的協議。
本文將給大家演示一下基本 stm32 以太網接口+LWIP實現IGMP組播通信功能。
示例詳解
基于硬件平臺: MCU 的型號是?STM32F407VGT6, 使用stm32cubemx 工具自動產生的配置工程,使用KEIL5編譯代碼。本示例所用的最小系統板原理圖:
?
?
?
?
?
?
?
同時給工程加入我們事先準備好的 multicast.c文件并指定multicast.h路徑
?
?
要在cube 中實現IGMP功能,直接要CUBEMX工具的配置界面無法使能IGMP(不知道具體原因,好幾個版本的都是一樣不行,可能是cubemx的bug或不完善之處),本示例我們直接從代碼中更改,首先是在Lwipopts.h頭文件中把宏MEMP_NUM_SYS_TIMEOUT屏蔽(使用lwip/opt.h中的定義),并在文件末端定義 LWIP_IGMP 宏為1 :
要實現IGMP的接收,還要去hal庫中網絡接口文件,如本例中修改stm32f4xx_hal_eth.c源文件,將第1640行的參數macinit.MulticastFramesFilter值修改成ETH_MULTICASTFRAMESFILTER_NONE:
最后也是最關鍵一步在工程ethernetif.c文件中low_level_init函數中下圖所示位置處加入紅框處代碼(注,如果你的ethernetif.c文件中有變量EthInitStatus的定義,可以把紅框中屏蔽的代碼 // EthInitStatus = hal_eth_init_status; 取消屏蔽 ):
編譯工程,下載代碼, ip為路由器自動分配,如果設備網口及LWIP成功運行,在路由器列表中同樣也應該可以看到我們的設備,同時也應該是可以PING通的。
?
?
用TCP,UDP測試工具來測試一下UDP收發功能(本例是一個數據回顯功能),相應的工具會在資料包中提供,打開軟件,按下圖所示步驟操作:
?
程序燒錄后,上電可以出現如下圖所示操作結—在接收區打印出我們程序中的測試輸出:
?
本示例還是一個回顯示例,在發送區發送數據,接收可以接收到同樣的數據,注意因為是IGMP組播且發送端口與接收端口號一致,上位機自身發送的數據其自已也能接收到,故會出現下圖中發送一次數據能接收到兩次數據的現象:
?
上面的實驗過程在Wireshark工具中能看到具體的數據包信息如下:
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,會有不定期技術干貨推出!!
?
文中資料下載,在公眾號里給十三發消息:
下載|STM32基礎系列教程37
關注十三公眾號
?
總結
以上是生活随笔為你收集整理的STM32 基础系列教程 37 - Lwip_igmp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 基础系列教程 36 - Lw
- 下一篇: STM32 基础系列教程 38 - Lw