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配置 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
