11 - TCPClient实验
在上一个章节的UDP通信测试中,尽管通信的实现过程相对简洁,但出现了通信数据丢包的问题。因此,本章节将基于之前建立的WIFI网络连接,构建一个基础的TCPClient连接机制。我们利用网络调试助手工具来发送数据,测试网络通信中接收到的数据能够准确无误地回传。
本节课目标:
在本次实验中,我们将ESP32开发板与WiFi网络连接,并配置实现UDP连接。核心任务是构建稳固的UDP连接机制,确保通过网络调试助手发送数据,并能准确回传接收数据,验证UDP连接的可靠性和有效性。
本节课内容:
- network 与 socket 库的简介
- network库的构造与方法
- socket 库的构造与方法
- 硬件设计
- 软件设计
- 下载验证
一、network 与 socket 库的简介
MicroPython 的 network 库与 socket 库皆为实现网络连接的重要工具,它们各自拥有独特的功能性并共享某些共通特点。
作为 MicroPython 的一个关键第三方库,network 库专门负责处理 WiFi 和网络连接的各项任务。通过此库,用户能够成功接入无线网络,查询当前网络状态,以及实现数据的收发等功能。在 MicroPython 的架构下,network 库扮演着促进设备间网络连接与通信的核心角色。
至于 network 库与 socket 库之间的主要差异,则体现在它们的应用场景与功能侧重上。具体而言,network 库侧重于设备的 WiFi 和基础网络连接功能的实现,而 socket 库则聚焦于高级网络协议的连接建立与数据传输过程。因此,在实际进行网络连接功能的设计与实施时,需根据具体需求及所依赖的硬件平台,谨慎选择并合理运用相应的库资源。
下面是MicroPython库的network 与 socket 库的链接。
network — 网络配置 — MicroPython latest documentation
socket – 套接字模块 — MicroPython latest documentation
类 WLAN – 控制内置 WiFi 接口 — MicroPython 最新文档
二、network.WLAN类的构造与方法
1. network.WLAN类的构造
构造对象方法如下:
class network.WLAN(interface_id)
使用示例:wlan = network.WLAN(network.STA_IF)
参数描述如下:
| 参数 | 描述 |
| interface_id | 支持接口
|
返回值:WLAN网络接口对象
2. network.WLAN类的方法
(1)激活或停用网络接口
其方法原型如下:
WLAN.active(is_active[ ])
参数描述如下:
| 参数 | 描述 |
| is_active |
|
返回值:无
(2)连接网络
其方法原型如下:
WLAN.connect(ssid=None, password=None)
参数描述如下:
| 参数 | 描述 |
| ssid | WiFi账号 |
| password | WiFi密码 |
返回值:Ture:连接成功;Fail:连接失败。
(3)关闭网络
其方法原型如下:
WLAN.disconnet()
返回值:无
(4)获取或者设置网络参数
其方法原型如下:
WLAN.ifconfig((ip, subnet, gateway, dns)[])
参数描述如下:
| 参数 | 描述 |
| ip | IP地址 |
| subnet | 子网掩码 |
| gateway | 网关 |
| dns | DNS服务器 |
返回值:若此函数为无参数传入,则返回连接网络的信息,反次,为设置网络参数。
以上是 network.WLAN 类常用的方法,还有其他方法可参考 MicroPython 的在线文档。
三、socket 库的构造与方法
1. socket类的构造
构造对象方法如下:
class socket.socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /)
使用示例:socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
参数描述如下:
| 参数 | 描述 |
| af | 地址族
|
| type | socket类型
|
| proto | 网络协议
|
返回值:socket对象
2. socket类的方法
(1)关闭socket接口
其方法原型如下:
socket.close()
返回值:无
(2)socket绑定到地址
其方法原型如下:
socket.bind(address)
参数描述如下:
| 参数 | 描述 |
| address | IP地址(字符串形式输入,如‘192.168.1.100’) |
返回值:无
(3)监听连接
用作于 TCPServer 连接。
其方法原型如下:
socket.listen(backlog[])
参数描述如下:
| 参数 | 描述 |
| backlog | 监听连接数量 |
返回值:无
(4)接受连接
用作于 TCPServer 连接。注:在此之前,需监听连接
其方法原型如下:
socket.accept()
返回值:conn:新的套接字对象,用来收发消息;address:连接到服务器的客户端地址。
(5)连接远程IP地址
其方法原型如下:
socket.connect(address)
参数描述如下:
| 参数 | 描述 |
| address | IP地址(字符串形式输入,如‘192.168.1.100’) |
返回值:无
(6)发送数据,返回发送的字节数
其方法原型如下:
socket.send(bytes)
参数描述如下:
| 参数 | 描述 |
| bytes | 需发送的字节数据 |
返回值:发送的数据字节数。
(7)接收数据,返回值是一个字节对象
其方法原型如下:
socket.recv(bufsize)
参数描述如下:
| 参数 | 描述 |
| bufsize | 接收数据的存储区 |
返回值:接收数据字节对象。
(8)接收数据,返回值是一个字节对象
其方法原型如下:
socket.recvfrom(bufsize)
参数描述如下:
| 参数 | 描述 |
| bufsize | 接收数据的存储区 |
返回值:bytes:接收数据字节对象;addressa:套接字发送的地址数据。
(9)UDP发送数据,一般用于UDP连接
其方法原型如下:
socket.sendto(bytes, address)
参数描述如下:
| 参数 | 描述 |
| bytes | 发送的数据 |
| address | 发送至哪个远程IP地址 |
返回值:发送的数据字节数。
以上方法列出了本书中常用的套接字方法,对于剩余的套接字方法,请参考MicroPython最新的在线文档。
四、硬件设计
1. 例程功能
在本次实验中,我们将ESP32开发板与WiFi网络连接,并配置实现UDP连接。核心任务是构建稳固的UDP连接机制,确保通过网络调试助手发送数据,并能准确回传接收数据,验证UDP连接的可靠性和有效性。
2. 硬件资源
- WIFI :ESP32内部自带WIFI模块
四、软件设计
1. 程序流程图

2. 程序
import network
import socket# 网络信息
SSID = 'OrayBox-zsf' # WIFI名称
PASSWORD = '123456789' # WIFI密码
Server_IP = '10.168.1.164' # 服务器IP地址wlan = None # 定义一个无线网络
pos = 0 # 状态机,用于状态切换def connect():"""连接 WIFI 路由器"""global wlanwlan = network.WLAN(network.STA_IF)wlan.active(True)if not wlan.isconnected():print('connecting to network...')wlan.connect(SSID, PASSWORD)while not wlan.isconnected():passprint('network config:', wlan.ifconfig()) # 打印网络参数def goto(label):"""切换状态:param label: 状态号"""global pospos = label"""
------------------------------------------------------------------------------------下面为主函数
------------------------------------------------------------------------------------
"""
# 1、连接 WIFI 路由器
connect()while True:# 循环while pos == 0:# 状态 0 : 建立socket,连接服务器# 2、获取本地 IP 地址,并打印ip = wlan.ifconfig()[0]print('network config:', ip)# 3、创建 TCP 套接字TCPClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 TCPClient 对象,IPV4 \ TCP 类型# 4、连接服务器,如果成功就发送实验信息,否则关闭连接套接字try:TCPClient.connect((Server_IP, 8080)) # 连接服务器,即网络调试助手except BaseException:# 故障处理程序TCPClient.close() # 关闭套接字print(' 关闭套接字 ')goto(0) # 状态还是为 0,连接服务器breakelse:TCPClient.send('************** ESP32 客户端 '.encode() + str(ip).encode() + ' ****************\r\n'.encode())goto(1) # 进入状态 1:服务器连接成功,与服务器通信while pos == 1:# 状态 1 : 发送接收到的服务器数据try:# 接收到服务器的数据data = TCPClient.recv(1024)print(data.decode())except BaseException:# 故障时,关闭连接,重新建立连接TCPClient.close()goto(0)breakelse:# 空数据时,关闭连接,重新建立连接if (len(data) == 0):print('接收到空的数据')TCPClient.close()goto(0)breakelse:# 非空数据回显TCPClient.send(data)
五、下载验证
将ESP32开发板与电脑通过WIFI路由器,连接在同一WiFi网络中,配置电脑上的网络调试助手TCP Server参数,如下图所示,并打开网络。

注意:ESP32程序中TCP发送目标IP和端口信息,按网络调试助手输入,如下图所示。

运行ESP32程序,网络调试助手会接收到ESP32的TCP信息,如下图所示。

与ESP32通过TCP协议相互通信。【在TCP协议下的通信网络不佳时,会出现传输延迟。与UDP协议相比,TCP协议数据传输时丢包率更低。】

相关文章:
11 - TCPClient实验
在上一个章节的UDP通信测试中,尽管通信的实现过程相对简洁,但出现了通信数据丢包的问题。因此,本章节将基于之前建立的WIFI网络连接,构建一个基础的TCPClient连接机制。我们利用网络调试助手工具来发送数据,测试网络通…...
React框架搭建,看这一篇就够了,看完你会感谢我
传统搭建框架的方式 在2024年以前,我们构建框架基本上采用官方脚手架,但是官方脚手架其实大概率都不符合我们的项目要求,搭建完了以后往往需要再继续集成一些第三方的包。这时候又会碰到一些版本冲突,配置教程等,往往…...
【rust】rust条件编译
在c语言中,条件编译是一个非常好用的功能,那么rust中如何实现条件编译呢? rust的条件编译需要两个部分,一个是fratures,另一个是cfg。Cargo feature是一个非常强大的功能,可以提供条件编译和可选依赖项的高级特性&…...
一键文本提示实现图像对象高质量剪切与透明背景生成
按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…...
游戏客服精华回复快捷语大全
以黑神话悟空为代表的国内的游戏行业,最近发展非常迅猛,大量游戏玩家需要足够的游戏客服支持,这里整理了游戏客服精华回复快捷语,涵盖了接待客户,游戏级数,游戏外挂,游戏要求,游戏特…...
国内版Microsoft Teams 基础版部署方案
目录 前言Microsoft Teams简介部署前的准备 环境需求账户和许可网络要求部署步骤 初步配置和设置安装Microsoft Teams客户端Teams管理中心配置用户管理 用户添加与分配角色与权限管理通讯与协作 团队和频道管理即时消息和会议功能文件共享与协作安全性与合规性 数据保护措施合规…...
计算机网络 ---- OSI参考模型TCP/IP模型
目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…...
在Windows环境下部署Java的Web项目集成工具的整体流程和详细步骤
好的,以下是一份关于“Windows环境下部署Java的Web项目集成工具”的手把手操作流程,由浅入深,先整体后分部: 一、引言 在现代软件开发中,Java作为一种广泛应用的编程语言,其Web项目开发尤为常见。为了提高…...
9.18作业
提示并输入一个字符串,统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…...
【算法】滑动窗口—最小覆盖子串
题目 ”最小覆盖子串“问题,难度为Hard,题目如下: 给你两个字符串 S 和 T,请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可…...
“Fast-forward“ in git-pull result
当你执行 git pull 并且结果显示 Fast-forward 时,这意味着你的本地分支可以直接快进到远程分支的最新提交,没有任何冲突或者需要合并的内容。具体来说,Fast-forward 是一种合并方式,它的特点是将当前分支的指针直接移动到远程分支…...
Oracle(133)如何创建表空间(Tablespace)?
在Oracle数据库中,表空间(Tablespace)是存储数据的逻辑单位,它由一个或多个数据文件组成。表空间是数据库数据管理的基本结构,了解如何创建表空间对于数据库管理员至关重要。 创建表空间的基本语法 创建表空间的基本…...
Linux中权限和指令
💥1、Linux基本指令 1.1 mv 指令 mv指令是move的缩写,用来移动或重命名文件、目录,经常用来备份文件或目录。 mv old_name new_name: 重命名文件或目录mv file /path/to/directory: 移动文件到指定目录 roothcss-ecs…...
本地镜像发布到阿里云
本地镜像发布到阿里云 登录阿里云容器镜像服务配置 Docker 登录阿里云容器镜像服务标记你的 Docker 镜像推送镜像到阿里云验证使用阿里云镜像注意事项 将 Docker 本地镜像发布到阿里云(Alibaba Cloud)容器镜像服务(Container Registry&#x…...
【Linux】【Vim】Vim 基础
Vim/Gvim 基础 文本编辑基础编辑操作符命令和位移改变文本重复改动Visual 模式移动文本(复制、粘贴)文本对象替换模式 光标移动以 word 为单位移动行首和行尾行内指定单字符移动到匹配的括号光标移动到指定行滚屏简单查找 /string标记 分屏vimdiff 文本编辑 基础编辑 Normal 模…...
计算机人工智能前沿进展-大语言模型方向-2024-09-18
计算机人工智能前沿进展-大语言模型方向-2024-09-18 1. The Application of Large Language Models in Primary Healthcare Services and the Challenges W YAN, J HU, H ZENG, M LIU, W LIANG - Chinese General Practice, 2024 人工智能大语言模型在基层医疗卫生服务中的应…...
ubuntu24安装vivado24(安装并解决若干错误)
目录 安装方法:问题1:解决办法: 问题2:解决方法: 安装完成: 安装方法: 注意:内存最好预留80G空闲的。 安装好大小: 安装依赖库: sudo apt-get update sud…...
CSS实现文本溢出省略号或完整显示
目录 前言1. 省略号2. 完整展示3. Demo 前言 文本内容超出容器宽度的问题,为了保持页面布局的整洁,通常会使用省略号来隐藏多余的内容 一共有两种方式: 设定省略号完整展示 1. 省略号 文本溢出时显示省略号 .item-value {flex-basis: 7…...
three.js PropertyBinding和PropertyMixer
PropertyBinding 对场景图中某一真实属性的引用,内部使用。 构造器 PropertyBinding( rootNode : Object3D, path, parsedPath ) -- rootNode: -- path -- parsedPath (可选) 属性 # .path : Number # .parsedPath : Number # .node : Number # .rootNode …...
ssh远程连接try1账号切换tips
1,创建拥有sudo权限的用户: 在root下 sudo adduser bio sudo vim /etc/sudoers //修改添加如下: bio ALL(ALL) ALL //bio用户就拥有了root权限参考:https://github.com/isLishude/blog/issues/70 2,修改ssh配置 …...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
