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 等。
代码展示
python
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和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
def 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()
代码解读
导入必要库
python
import socket # 库负责创建网络通信的套接字
import network # 库用于配置网络接口,比如启用 LAN 或 WLAN。
import time # 库提供延时操作,通常用于控制数据发送频率或超时处理。
配置网络接口
这个函数根据是否选择无线网络(WLAN)或有线网络(LAN)来配置网络接口,具体步骤如下:
LAN 模式:激活 LAN 接口,并使用 DHCP 模式获取 IP 地址。
python
# 执行以太网连接函数
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 套接字。
python
# 获取服务器的 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 函数发送到指定的服务器地址。消息在发送之前需要转换成字节串。发送成功后,打印已发送的字节数,并设置一个小的延时。
python
# 发送测试消息
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)
关闭套接字
python
# 关闭套接字
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