【学习K230-例程20】GT6700-TCP-Server
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) #连接成功,点亮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':counter = 1s = 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_sockclient_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()breakexcept Exception as e:print("Error:", e)time.sleep(0.1) #遇到错误后稍作等待client_stream.close()breakcounter += 1if counter > 10:print("server exit!")s.close() #关闭服务器breakmain()
代码解读
导入必要的库
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