【学习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 等。

代码展示

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

相关推荐
CHANG_THE_WORLD9 分钟前
Windows程序字符串处理与逆向分析
windows·stm32·单片机
励志不掉头发的内向程序员15 分钟前
【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 进程概念
linux·运维·服务器·开发语言·学习
合作小小程序员小小店18 分钟前
web网页开发,在线%推荐算法学院培养计划,图书推荐,基于Python,FlaskWeb,用户和物品推荐MySql
python·mysql·算法·flask·推荐算法
A9better43 分钟前
嵌入式开发学习日志30——stm32之定时器中断简单项目练习
stm32·单片机·嵌入式硬件·学习
那我掉的头发算什么1 小时前
【数据结构】二叉树的高频热门面试题大全
java·开发语言·数据结构·python·算法·链表·intellij idea
安卓开发者1 小时前
在鸿蒙NEXT中发起HTTP网络请求:从入门到精通
网络·http·harmonyos
飞翔的佩奇1 小时前
【完整源码+数据集+部署教程】 小麦病害分割系统: yolov8-seg-dyhead
python·yolo·计算机视觉·数据集·yolov8·小麦病害分割系统
渡我白衣1 小时前
从传输层协议到 UDP:轻量高效的传输选择
网络·网络协议·udp
充哥单片机设计1 小时前
【STM32项目开源】基于STM32的智能电子秤
stm32·单片机·嵌入式硬件
小蕾Java2 小时前
PyCharm2025.2 大更新,AI是亮点!
人工智能·python