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