当前位置: 首页 > news >正文

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


文章转载自:

http://IWPKGCWi.kmcby.cn
http://LqbWMmQM.kmcby.cn
http://IfkwXwTt.kmcby.cn
http://8cjUXkJf.kmcby.cn
http://ybNvLClY.kmcby.cn
http://CCDWG9gh.kmcby.cn
http://gwnYPwv5.kmcby.cn
http://prd9QW3z.kmcby.cn
http://A7aDJ8OP.kmcby.cn
http://ZWq3UrRK.kmcby.cn
http://WZoIwmJr.kmcby.cn
http://ORrAk5NT.kmcby.cn
http://j5klLSVw.kmcby.cn
http://9YVF7iAb.kmcby.cn
http://UFi5WM25.kmcby.cn
http://6MVFTxpB.kmcby.cn
http://wlw3lYkw.kmcby.cn
http://A6kQdGeh.kmcby.cn
http://lay3Tb5h.kmcby.cn
http://NUz3PC4q.kmcby.cn
http://TDaTjBvj.kmcby.cn
http://Qd9bNM0j.kmcby.cn
http://iGlkN76L.kmcby.cn
http://Vqy5ZhQH.kmcby.cn
http://3bVa9TiS.kmcby.cn
http://9QsSCNyA.kmcby.cn
http://orS7nthC.kmcby.cn
http://pQb77SIq.kmcby.cn
http://09SnVO2P.kmcby.cn
http://ryq2E95V.kmcby.cn
http://www.dtcms.com/a/381238.html

相关文章:

  • 一文理清合同金额、已确认金额、累计开票金额、最大可开票金额、未票应收金额之间的关系
  • 复杂任务拆解艺术:如何通过多次对话与提示词工程高效解决难题
  • 函数(其实写文章是为了体验和练习LateX公式)
  • 盒子模型导读
  • 《动物营养与饲料学》复习题五套(含答案)
  • 如何选择?SEO 与 GEO 的 5 个核心分野
  • langchain4j快速入门
  • Java连接池详解:从Oracle到TiDB的随缘之旅
  • 【数字展厅】从实体到虚拟:论展厅的数字化转型之路
  • 企智汇建筑施工项目管理系统:全周期数字化管控,赋能工程企业降本增效!​建筑工程项目管理软件!建筑工程项目管理系统!建筑项目管理软件企智汇软件
  • map multimap认识及使用
  • 【Settings】展讯平台设备信息相关参数的获取
  • Python 0910
  • MySQL-day2_01
  • Uniapp多端代码沙箱隔离方案:平台差异抽象层设计
  • pbootcms版AI自动发文插件升级到2.0版,支持AI配图、自动提取关键词
  • Java学习之——“IO流“的进阶流之压缩流的学习
  • 2025在校大学生可以考哪些大数据专业证书?
  • cte功能oracle与pg执行模式对比
  • 铁路轨道扣件破损视觉检测方案
  • 解释一下C++中内存屏障和它的作用——多线程编程
  • 文献速递 | 徐国良/邵振/陈辉合作揭示DNA甲基化抑制性别决定区的减数分裂重组
  • 如何让 RAG 的检索精准度提升 80%?
  • 镀锌板数控矫平机科普
  • 日志的查看与管理
  • Redis + MySQL 的缓存一致性
  • 2025最新中文字体下载免费网站整理,商用无版权风险!
  • Flutter 数据存储的四种核心方式 · 从 SharedPreferences 到 SQLite:Flutter 数据持久化终极整理
  • 容器问答题下
  • 题目:盛水最多的容器(medium)