B站視頻
UDP 簡介
??UDP 是 User Datagram Protocol 的簡稱,中文名是用戶數據報協議,是 OSI(Open SystemInterconnection,開放式系統互聯)參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768 是 UDP 的正式規范。UDP 在 IP 報文的協議號是17。
??UDP 協議與 TCP 協議一樣用于處理數據包,在 OSI 模型中,兩者都位于傳輸層,處于IP 協議的上一層。UDP 有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。UDP 用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用 UDP 協議。UDP 協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但即使在今天 UDP 仍然不失為一項非常實用和可行的網絡傳輸層協議。
??許多應用只支持 UDP,如:多媒體數據流,不產生任何額外的數據,即使知道有破壞的包也不進行重發。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以至于此前的連接過程成為整個流量主體的情況下,UDP 也是一個好的選擇。
??UDP 是 OSI 參考模型中一種無連接的傳輸層協議,它主要用于不要求分組順序到達的傳輸中,分組傳輸順序的檢查與排序由應用層完成,提供面向事務的簡單不可靠信息傳送服務。UDP 協議基本上是 IP 協議與上層協議的接口。UDP 協議適用端口分別運行在同一臺設備上的多個應用程序。
??UDP 提供了無連接通信,且不對傳送數據包進行可靠性保證,適合于一次傳輸少量數據,UDP 傳輸的可靠性由應用層負責。常用的 UDP 端口號有:53(DNS)、69(TFTP)、161(SNMP),使用 UDP 協議包括:TFTP、SNMP、NFS、DNS、BOOTP。
??UDP 報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為 UDP協議的控制選項較少,在數據傳輸過程中延遲小、數據傳輸效率高,適合對可靠性要求不高的應用程序,或者可以保障可靠性的應用程序,如 DNS、TFTP、SNMP 等。
代碼展示
from machine import Pin #導入Pin模塊
import time, os, socket, network #導入time, os, socket, network模塊def network_connect(connect=True):LAN_LED=Pin(53, Pin.OUT) #初始化聯網指示燈if connect:LAN_LED.value(1) #LED燈點亮else:for i in range(3):LAN_LED.value(1)time.sleep_ms(300)LAN_LED.value(0)time.sleep_ms(300)
# 執行以太網連接函數
def network_use_lan(is_lan=True):if is_lan:lan = network.LAN()if lan.active():print('network information:', lan.ifconfig())# 串口打印信息lan.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))# 設定IP和DNSlan.ifconfig("dhcp") #設置DHCP模式print(lan.config("mac"))#查看網口mac地址print(lan.ifconfig()) #查看網口 ip,掩碼,網關,dns配置network_connect(True) #連接成功,點亮LEDip = lan.ifconfig()[0]else:network_connect(False) #連接失敗,LED閃爍三次ip = '0.0.0.0'raise RuntimeError("LAN 未激活")else:print("WIFI 請等待更新")ip = '0.0.0.0'network_connect(False) #連接失敗,LED閃爍三次return ipdef main():ip=network_use_lan(True) # 獲取 IP 地址if not ip=='0.0.0.0':network_use_lan(True) # 配置網絡接口ai = socket.getaddrinfo('192.168.0.1', 8080) # 獲取服務器地址和端口號print("Address infos:", ai)addr = ai[0][-1]print("Connect address:", addr)s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 創建 UDP 套接字for i in range(10):message = "GINGKO K230 UDP client send test {0} \r\n".format(i+1)print("Sending:", message)bytes_sent = s.sendto(message.encode(), addr) # 發送字符串print("Bytes sent:", bytes_sent)time.sleep(0.2)s.close()# 關閉套接字print("Client ended.")main()
代碼解讀
導入必要庫
import socket # 庫負責創建網絡通信的套接字 import network # 庫用于配置網絡接口,比如啟用 LAN 或 WLAN。 import time # 庫提供延時操作,通常用于控制數據發送頻率或超時處理。
配置網絡接口
??這個函數根據是否選擇無線網絡(WLAN)或有線網絡(LAN)來配置網絡接口,具體步驟如下:
????LAN 模式:激活 LAN 接口,并使用 DHCP 模式獲取 IP 地址。
# 執行以太網連接函數
def network_use_lan(is_lan=True): if is_lan: lan = network.LAN() if lan.active(): # 串口打印信息 print('network information:', lan.ifconfig()) lan.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))# 設定IP和DNS lan.ifconfig("dhcp")# 設置DHCP模式 print(lan.config("mac"))# 查看網口mac地址 print(lan.ifconfig())# 查看網口 ip,掩碼,網關,dns配置 network_connect(True)# 連接成功,點亮LED ip = lan.ifconfig()[0] else: network_connect(False)# 連接失敗,LED閃爍三次 ip = '0.0.0.0' raise RuntimeError("LAN 未激活") else: print("WIFI 請等待更新") ip = '0.0.0.0' network_connect(False)# 連接失敗,LED閃爍三次 return ip
創建 UDP 套接字
??這里通過 socket.getaddrinfo 獲取服務器的 IP 和端口信息,并提取出地址和端口號,然后創建 UDP 套接字。
# 獲取服務器的 IP 和端口號 ai = socket.getaddrinfo('192.168.0.1', 8080) print("Address infos:", ai) addr = ai[0][-1] # 提取 IP 和端口號 print("Connecting to address:", addr) # 創建 UDP 套接字 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
發送數據
??在循環中,程序生成測試消息,并將其通過 sendto 函數發送到指定的服務器地址。消息在發送之前需要轉換成字節串。發送成功后,打印已發送的字節數,并設置一個小的延時。
# 發送測試消息 for i in range(10): message = "GINGKO K230 UDP client send test {0} \r\n".format(i+1) print("Sending:", message) # 發送字符串 bytes_sent = s.sendto(message.encode(), addr) print("Bytes sent:", bytes_sent) time.sleep(0.2)
關閉套接字
# 關閉套接字 s.close() print("Client ended.")# 在數據發送完成后,關閉套接字以釋放資源。
效果展示
配置好后,我們通過Win+R輸入cmd。在命令符里輸入ipconfig,查看我們PC與K230連接的網線IP。
這個IP就是我們PC的IP。如果PC的IP或者端口號如果更改,請在代碼中也對應更改。
我們將K230的IP配置到與PC同一子網下。
最后我們將PC端的防火墻關閉,開啟防火墻可能會傳輸信息失敗。
準備好上述工作后,我們就可以打開我們的網絡助手,選擇UDP,選擇本地主機IP和端口號,點擊打開。隨后我們運行K230代碼,連接成功后,將會通過網絡發送十條數據。
【學習k230 - 例程21】網絡例程UDP