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

相关推荐
FriendshipT2 小时前
Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件
开发语言·python
她说人狗殊途2 小时前
动态代理1
开发语言·python
楼田莉子2 小时前
C++动态规划算法:斐波那契数列模型
c++·学习·算法·动态规划
Yvonne爱编码2 小时前
后端编程开发路径:从入门到精通的系统性探索
java·前端·后端·python·sql·go
江流月照2 小时前
IP验证学习之agent编写
学习·硬件架构·硬件工程
不知名的前端专家3 小时前
uniapp原生插件 TCP Socket 使用文档
网络·tcp/ip·uni-app·netty
Q_Q19632884753 小时前
python+springboot大学生心理测评与分析系统 心理问卷测试 自动评分分析 可视化反馈系统
开发语言·spring boot·python·django·flask·node.js·php
BYSJMG3 小时前
计算机毕设推荐:基于Hadoop+Spark物联网网络安全数据分析系统 物联网威胁分析系统【源码+文档+调试】
大数据·hadoop·python·物联网·spark·django·课程设计
波波烤鸭3 小时前
Netty 实战应用:从 RPC 到即时通讯,再到 WebSocket
websocket·网络协议·rpc