【学习K230-例程21】GT6700-UDP-Client
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