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

11 - TCPClient实验

在上一个章节的UDP通信测试中,尽管通信的实现过程相对简洁,但出现了通信数据丢包的问题。因此,本章节将基于之前建立的WIFI网络连接,构建一个基础的TCPClient连接机制。我们利用网络调试助手工具来发送数据,测试网络通信中接收到的数据能够准确无误地回传。

本节课目标:

在本次实验中,我们将ESP32开发板与WiFi网络连接,并配置实现UDP连接。核心任务是构建稳固的UDP连接机制,确保通过网络调试助手发送数据,并能准确回传接收数据,验证UDP连接的可靠性和有效性。

本节课内容:

  1. network 与 socket 库的简介
  2. network库的构造与方法
  3. socket 库的构造与方法
  4. 硬件设计
  5. 软件设计
  6. 下载验证

一、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

支持接口

  • network.STA_IF:作为客户端,连接其他的服务器
  • network.AP_IF:作为服务器,其他WiFi客户端连接

返回值:WLAN网络接口对象

2. network.WLAN类的方法

(1)激活或停用网络接口

其方法原型如下:

WLAN.active(is_active[ ])

参数描述如下:

参数

描述

is_active

  • True:激活
  • False:作为服务器,其他WiFi客户端连接

返回值:无

(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

地址族

  • socket_AF_INET:IPV4
  • socket_AF_INET6:IPV6

type

socket类型

  • socket.SOCK_STREAM:TCP类型
  • socket.SOCK_DGRAM:UDP类型

proto

网络协议

  • socket.IPPROTO_TCP:TCP协议
  • socket.IPPROTO_UDP:UDP协议

返回值: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协议数据传输时丢包率更低。】

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中断合并参数coalesce_params解释
  • StringReader 使用 JAXB自动将 XML 数据映射到 Java 对象
  • 3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity
  • WebGL阴影与后期处理
  • 前端vue-作用域插槽的传值,子传父,父用obj对象接收
  • 【SpringBoot详细教程】-03-整合Junit【持续更新】
  • Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型
  • 毕业设计选题:基于ssm+vue+uniapp的校园失物招领小程序
  • 《MATLAB项目实战》,专栏目录和介绍
  • 华为驱动未卸载导致内存完整性无法开启,导致lol卡顿,后台十几个重复进程
  • Pytorch实现Transformer
  • React Native 在 build 的时候如果出现 `babel.config.js` 配置文件的错误
  • 量子计算如何引发第四次工业革命——解读加来道雄的量子物理观
  • http代理池子大小要如何判断?
  • 后端开发刷题 | 最小的K个数(优先队列)
  • 自己简单写的 事件订阅机制
  • [case10]使用RSQL实现端到端的动态查询
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • java 多线程基础, 我觉得还是有必要看看的
  • javascript数组去重/查找/插入/删除
  • js中的正则表达式入门
  • Making An Indicator With Pure CSS
  • QQ浏览器x5内核的兼容性问题
  • rabbitmq延迟消息示例
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • webpack入门学习手记(二)
  • windows下mongoDB的环境配置
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 当SetTimeout遇到了字符串
  • 京东美团研发面经
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 判断客户端类型,Android,iOS,PC
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法-插入排序
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Java并发新构件之Exchanger
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 透过事物看本质的能力怎么培养?
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (4)(4.6) Triducer
  • (55)MOS管专题--->(10)MOS管的封装
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二十四)Flask之flask-session组件
  • (六)Hibernate的二级缓存
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十五)使用Nexus创建Maven私服
  • (转) 深度模型优化性能 调参
  • (转)【Hibernate总结系列】使用举例
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .jks文件(JAVA KeyStore)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net Remoting(分离服务程序实现) - Part.3