樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊廣播功能,什么是廣播呢?廣播是指將報文發送給網絡中所有可能的接收方。廣播的用途主要有兩個:一個報文就可以通知本地網絡中在本地網絡中定位一個主機;在本地網絡中減少分組流通,一個報文就可以通知本地網絡中的所有主機。常見的廣播應用報文有:
(1)ARP(Address Resolution Protocol,地址解析協議)。其用途是在本地網絡中廣播一個 ARP請求“IP 地址為 a.b.c.d 的設備,硬件 MAC 地址是多少,請告訴我”。ARP 的廣播屬于二層鏈路層MAC 廣播,而不是三層網絡層 IP 廣播。
(2)DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)。在本地網絡中有 DHCI服務器端的前提下,DHCP客戶端發送目的IP 地址(通常為 255.255.255.255)的DHCP 請求在同一網絡中的 DHCP 服務器端就可以接收到該請求并回復分配的 IP 地址。
廣播主要使用 UDP 協議,不適合使用 TCP 協議,TCP 適用于單播。
1.廣播地址
對于廣播地址,樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊可以分為二層鏈路層 MAC 廣播地址 (FF:FF:FF:FF:FF:FF) 和三層網絡層IP廣播地址(255.255.255.255),以下簡稱為二層地址、三層地址。本節主要介紹三層地址。一般情況下,在報文的三層地址為全 255 的情況下,二層地址通常也為全 FF。因為三層地址為全255 的報文,意味著本地網絡的設備都會收到該報文。如果該報文的二層地址不是全 FF,則該報文在接收設備的二層地址處理中會被丟棄。對于接收設備而言,如果報文的二層地址不是廣播地址,也不是本機的 MAC 地址和組播 MAC 地址(如 01:00:5E:XX:XX:XX),就會丟棄不處理。所以一般三層地址是廣播地址,二層地址也是廣播地址。IPv4地址由子網ID和主機ID 構成,如 地址為 192.168.3.4,子網掩碼為 255.255.255.0的設備,其子網 ID 和主機 ID 是通過 IP 地址和子網掩碼計算求得的。樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊在本例中,子網 ID 是192.168.3.0,主機ID 是4。除了子網ID 和主機D為 255 的情況下是廣播地址,只有主機ID是255 的情況下也是廣播地址。例如,您有一個 192.168.1/24 的子網,那么 192.168.1.255就是該子網的廣播地址。也許有人會有疑問“子網 ID 和主機 ID 全為 255 的廣播地址和只有主機ID是255的廣播地址有什么區別呢?”全為 255 的廣播范圍比特定子網的廣播范圍要大例如,Wi-Fi路由器有兩個子網 192.168.1/24 和 192.168.2/24,在子網 192.168.1/24 里的一個主機 192.168.1.2 向目的地址 192.168.1.25 發送報文,Wi-Fi 路由器只會將該報文轉給192.168.1/24 子網里的主機,并不會轉發給 192.168.2/24 子網里的主機;如果該主機向目的地址255.255.255.255 發送報文,則 Wi-Fi 路由器會將該報文轉發給兩個子網里的主機。所以這種主機 ID 是 255 的廣播地址也稱為子網定向廣播地址。通過子網定向廣播地址可以向指定的子網發送報文,防止局城網中其他不需要接收的子網也收到該報文,避免網絡資源浪費。
2.使用 Socket 實現廣播發送方
函數 esp send broadeast()實現了向局域網內發送 UDP廣播包并且攜帶數據“Are you Espressif IOT Smart Light”,然后等待對端回復的功能。該函數中用到了伯克利套接字(Ber.Sockets)標準接口,也稱為BSD Socket。伯克利套接字是 UNIX 系統中的通用網絡接口,不僅支持不同的網絡類型,而且也是一種內部進程之間的通信機制。本文樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊涉及的 TCP/UDP網編程都使用伯克利套接字,感興趣的可以閱讀人民郵電出版社出版的《UNIX 網絡編卷1:套接字聯網API》,詳細了解伯克利套接字的編程知識,本文只是簡單地介紹如何體套接字編程。
本節首先使用 socket(AF_INET,SOCK_DGRAM,0)函數創建 UDP 套接字,然后使用setsockopt()函數開啟套接字支持廣播,后設置廣播的目的地址為全 255、端口為3333,調用 sendto()函數將報文發送出去??梢愿鶕?sendto()函數的返回值判斷數據是發送成功。
3.使用 Socket 實現廣播接收方
樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊函數 esp_receive_broadcast ()實現了廣播包的接收與單播回復。與發送方的代碼邏輯一樣,首先創建 UDP 套接字,并且設置監聽的報文源地址和端口號,一般作為服務器端,報文源地址設置為 0.0.0.0,表示不對報文源地址進行驗證,調用 bind()函數綁定套接字;然后使用 recvfrom()函數接收報文,當接收到攜帶了“Are you Espressif IOT Smart Light”數據的廣播包后,對端的IP 地址和端口號就保存在 from_addr 里;后以單播的形式將要發送的數據發送給對端。
組播
什么是組播呢? 組播也稱為多播,是指將報文發送給那些感興趣的接收方。相比于單播和廣播尋址方案的兩個“極端”(要么單個要么全部),組播技術提供了折中的方案。顧名思義,組播主要強調組的概念,也就是說,一個主機可以向一個組地址發送報文,所有加入這個的主機都可以收到報文。這有點類似于子網定向廣播,但比子網定向廣播更加靈活,因為個組的主機可以隨時加入或者離開某個組,這樣就可以減輕本地網絡與主機的負擔。
IGMP (Internet Group Management Protocol,互聯網組管理協議)是一種負責IP 組播成員管理的協議,用來在IP 主機和與其直接相鄰的組播 Wi-F 路由器之間建立、維護組播組成員關系。對于組播而言,需要 Wi-Fi路由器支持IGMP 協議。
1.組播地址
組播報文目的地址使用D類IP 地址,第一個字節以二進制的 1110 開始,其范圍是 224.0.0.0~239.255.255.255。由于組播P 地址標識了一組主機,因此組播IP 地址只能作為目標地址,不能作為源地址,源地址總是單播地址。
樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊組播組是一個組,這個組使用特定的組播地址作為標識,組內或者組外的成員往這個組播址發送報文時,由組播地址標識的組內成員就可以收到該報文。組播組可以是永久的,也可以是臨時的。在組播地址中,由官方分配的組播地址的稱為永久組播組:那些既不是保留址也不是永久組播地址的稱為臨時組播組。永久組播組和臨時組播組內的主機數量都是動的,甚至可以沒有主機。
組播地址分類如下:
224.0.0.0~224.0.0.255: 為保留組播地址(永久組播組),地址 224.0.0.0不做分配,其他地址供路由協議使用。
224.0.1.0~224.0.1.255:是公用組播地址,可以用于互聯網。
224.0.2.0~238.255.255.255:為用戶可用的組播地址(臨時組播組),全網范圍內有效。239.0.0.0~239.255.255.255:為本地管理組播地址,僅在特定的本地范圍內有效。
2.使用 Socket 實現組播發送方
組播發送的實現比廣播發送更復雜。組播發送需要設定組播報文的發送接口,如果需要接收某個組播組的報文,還需要加入該組播組。函數 esp_join_multicast_group()實現了組播組發送接口的設置與組播組加入的功能。函數 esp_send_multicast()實現了常規UDP 套接字的創建、綁定、目的地址端口的配置和收發功能。除此之外,還增加了 TTL 的設置,保證該組播組只能在該路由下的局域網中進行。
3.使用 Socket 實現組播接收方
實現組播接收方和實現組播發送方一樣,需要指定組播報文的接口和需要加入的組播組。函數esp_recv_multicast()實現了常規 UDP 套接字的創建、綁定、目的地址端口的配置和收發功能。此外,由于本例中還需要發送組播,所以設置了 TTL (Time To Live)。
廣播與組播對比
廣播與組播的對比所示,從中可以看出來,組播的帶寬開銷比較小,局域網內的備可以自主加入或者離開感興趣的或預先規定的組播組來接收和發送數據,比較靈活。對于廣播而言,局域網內所有設備都會收到報文,無形中會給局域網內的其他設備增加負擔,也會加重局域網帶寬的負擔。
本地發現之組播應用協議 mDNS
在計算機網絡中,樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊多播DNS (Multicast DNS,mDNS)協議將主機名解析為不包含本地名稱服務器端的小型網絡中的IP 地址。這是一種零配置的服務器端,mDNS 與傳統域名解析服(DNS) 有著基本相同的編程接口、數據包格式和操作方式。
mDNS 由 Bill Woodcock和 Bill Manning 于 2000 年在IETF 中首次提出,在 2013 年由 StuatCheshire 和 Marc Krochmal 作為標準協議發布在 RFC 6762,并由 Apple Bonjour 和開源Avahi軟件包實現,包含在大多數 Linux 發行版中(摘錄自維基百科)。
mDNS 是本地網絡的域名解析協議,使用 5353 端口,組播地址是 224.0.0.251,是運行于 UDP之上的應用協議。不同于傳統的 DNS 協議,mDNS 協議不需要 DNS 服務器端進行域名解析可節省本地網絡的域名服務器端配置。
樂鑫ESP32-C3國產wifi芯片藍牙mesh組網模塊啟用了mDNS 服務的主機加入局域網后,會首先向局域網的組播地址 224.0.0.251 組播一個息“我是誰,我的IP 地址是多少,我提供的服務和端口號是多少”局域網中其他啟用 mDN服務的主機收到該消息后會記錄該消息,然后響應“它是誰,它的 P 地址是多少,它提供的服務和端口號是多少”。如果一臺主機想要查詢 mDNS 域名,會先查詢自己的緩存信息,如里沒有查詢到,則會向局域網組播查詢該域名的 IP 是多少,以及提供的服務和端口是多少。如果主機查詢一個域名,那么該怎么區分該域名是 DNS 域名還是 mDNS 域名呢? mDNS 域名與DNS 域名是通過后綴.local 區分的。