【学习K230-例程20】GT6700-TCP-Server

发布于:2025-09-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

B站视频


TCP

  TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇,只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协
议。
  TCP/IP 传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP 传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP 传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP 传输协议是严格来说是一个四层的体系结构,应用层、传输层、
网络层和数据链路层都包含其中。
  TCP/IP 协议是 Internet 最基本的协议,其中应用层的主要协议有 Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有 UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有 ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网路接口层或数据链路层,主要协议有 ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。
  GT6700开发板配备了以太网接口,通过网线连接电脑。K230做从机去连接主机。

代码展示

import os, time, socket, network
from machine import Pin
CONTENT = b"""
Hello #%d from k230 canmv MicroPython!\nWelcome to GINGKO
"""
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',    # 设定IP和DNS
                          '255.255.255.0', 
                          '192.168.0.1', 
                          '8.8.8.8'))
            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':
        counter = 1
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        ai = socket.getaddrinfo(ip, 8080)
        addr = ai[0][-1]
        s.bind(addr)
        s.listen(5)
        print("tcp server %s port:%d\n" % (ip, 8080))
        while True:
            res = s.accept()                #接受客户端连接
            client_sock = res[0]
            client_addr = res[1]
            print("Client address:", client_addr)
            client_sock.setblocking(False)  #设置非阻塞模式
            client_stream = client_sock
            client_stream.write(CONTENT % counter)
            while True:
                try:
                    h = client_stream.read()#尝试读取客户端数据
                    if h:
                        print(h)
                        client_stream.write(b"recv: " + h)
                    if b"end" in h:         #如果收到 "end",则关闭连接
                        client_stream.close()
                        break
                except Exception as e:
                    print("Error:", e)
                    time.sleep(0.1)         #遇到错误后稍作等待
                    client_stream.close()
                    break
            counter += 1
            if counter > 10:
                print("server exit!")
                s.close()                   #关闭服务器
                break

main()

代码解读

导入必要的库

 import socket  # 提供创建套接字的功能,是网络通信的基础。  
 import network  # 用于配置网络接口(如 LAN 和 WLAN)  
 import time # 可用于处理延时操作或网络超时控制。 

定义服务内容
  定义了服务端将发送给客户端的内容。%d 用于插入当前的连接计数。

 CONTENT = b""" 
 Hello #%d from k230 canmv MicroPython!\nWelcome to GINGKO 
 """  

创建并配置服务器
  该部分代码创建了一个 TCP 服务器,并将其绑定到开发板的 IP 地址和端口 8080。listen(5) 表示最多允许 5 个客户端等待连接。

def main():      
    ip=network_use_lan(True)  # 获取 IP 地址
    if not ip=='0.0.0.0':  
        counter = 1  
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
        ai = socket.getaddrinfo(ip, 8080)  
        addr = ai[0][-1]  
        s.bind(addr)  
        s.listen(5)  
        print("tcp server %s port:%d\n" % (ip, 8080))  
        while True:  
            res = s.accept()# 接受客户端连接  
            client_sock = res[0]  
            client_addr = res[1]  
            print("Client address:", client_addr)  
            client_sock.setblocking(False) # 设置非阻塞模式  
            client_stream = client_sock  
            client_stream.write(CONTENT % counter)  
            while True:  
                try:  
                    h = client_stream.read()# 尝试读取客户端数据  
                    if h:  
                        print(h)  
                        client_stream.write(b"recv: " + h)  
                    if b"end" in h:# 如果收到 "end",则关闭连接  
                        client_stream.close()  
                        break  
                except Exception as e:  
                    print("Error:", e)  
                    time.sleep(0.1)  # 遇到错误后稍作等待  
                    client_stream.close()  
                    break  
            counter += 1  
            if counter > 10:  
                print("server exit!")  
                s.close()# 关闭服务器  
                break  

处理客户端连接
  该代码段处理每个客户端的连接,并在与客户端通信时循环监听数据。当接收到 “end” 字符时,服务器关闭与该客户端的连接。
  为了应对非阻塞模式下的异常,try-except 用于处理读取数据时可能出现的错误。

 counter = 1   
 while True:        
     res = s.accept()                  # 接受客户端连接   
     client_sock, client_addr = res  # 获取客户端套接字和地址  
     print("Client address:", client_addr)  
     client_sock.setblocking(False)  # 设置非阻塞模式  
     # 向客户端发送消息    
     client_sock.write(CONTENT % counter)    
     while True:    
         try:    
             h = client_sock.read()  # 尝试读取客户端数据  
             if h:    
                 print(h)    
                 client_sock.write(b"recv: " + h)  # 回复客户端  
             if b"end" in h:  # 如果收到 "end",则关闭连接    
                 client_sock.close()    
                 break    
         except Exception as e:    
             print("Error:", e)    
             time.sleep(0.1)  # 遇到错误后稍作等待  
     counter += 1    
     if counter > 10:    
         print("server exit!")    
         s.close()  # 关闭服务器  
         break  

效果展示

  配置好后,我们通过Win+R输入cmd。在命令符里输入ipconfig,查看我们PC与K230连接的网线IP。
在这里插入图片描述
我们将K230的IP配置到与PC同一子网下。
在这里插入图片描述
最后我们将PC端的防火墙关闭,开启防火墙可能会传输信息失败。
在这里插入图片描述
准备好上述工作后,我们运行K230代码,就可以看到K230的IP和端口号。
在这里插入图片描述
我们打开网络助手,输入K230的IP和端口号,点击连接,连接成功即可收到K230发送的一帧数据。
在这里插入图片描述
同时我们在CanMV的串口终端也能看到连接的设备IP和端口号,这个IP就是我们PC的IP。
在这里插入图片描述
我们使用PC端网络助手向K230发送消息,K230接收到后将信息回复,网络通信完成。
在这里插入图片描述
在这里插入图片描述

【学习k230 - 例程20】网络例程TCP-Server