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 wlan
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)

    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, PASSWORD)

        while not wlan.isconnected():
            pass

    print('network config:', wlan.ifconfig())       # 打印网络参数


def goto(label):
    """
    切换状态
    :param label: 状态号
    """
    global pos
    pos = 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,连接服务器
            break

        else:
            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)
            break

        else:
            # 空数据时,关闭连接,重新建立连接
            if (len(data) == 0):
                print('接收到空的数据')
                TCPClient.close()
                goto(0)
                break
            else:
                # 非空数据回显
                TCPClient.send(data)

五、下载验证

将ESP32开发板与电脑通过WIFI路由器,连接在同一WiFi网络中,配置电脑上的网络调试助手TCP Server参数,如下图所示,并打开网络。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/882555.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图虫创意-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

力扣 困难 154.寻找旋转排序数组中的最小值 II

文章目录 题目介绍题解 题目介绍 题解 题源: 153.寻找旋转排序数组中的最小值 在此基础上,进行二分之前,单独处理一下左指针和最后一个数相同的情况就好了。 class Solution {public int findMin(int[] nums) {int left 0, right nums.le…

conda 虚拟环境安装GDAL

一. 背景 换了新电脑,要重新安装GDAL。从前是下了GDAL的.wheel文件用pip安装,但平时下轮子的网站现在都打不开,比如https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal,不晓得为什么。 后面看了这篇教程解决了问题(h…

Codeforces Round 973 (Div. 2) - D题

传送门&#xff1a;Problem - D - Codeforces 题目大意&#xff1a; 思路&#xff1a; 尽量要 最大值变小&#xff0c;最小值变大 即求 最大值的最小 和 最小值的最大 -> 二分答案 AC代码&#xff1a; 代码有注释 #include<bits/stdc.h> using namespace std; #…

C++模拟实现list:list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍

文章目录 前言一、list二、list类的初始化和尾插三、list的迭代器的基本实现四、list的完整实现五、测试六、整个list类总结 前言 C模拟实现list&#xff1a;list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍 一、list list本…

计算机网络34——Windows内存管理

1、计算机体系结构 2、内存管理 分为连续分配管理和非连续分配管理 在块内存在的未使用空间叫内部碎片&#xff0c;在块外存在的未使用空间叫外部碎片 固定分区分配可能出现内部碎片&#xff0c;动态分区分配可能出现外部碎片 3、逻辑地址和实际地址的互相转换 4、缺页中断 …

k8s中,pod生命周期,初始化容器,容器探针,事件处理函数,理解其设计思路及作用

k8s中&#xff0c;为什么要设计pod 平台直接管理容器不是挺好的吗 为什么要以pod为单位进行管理&#xff0c; 然后把容器放在pod里面 那么有pod和没pod的区别是什么 也就是pod提供了什么作用 这个可以考虑从pod生命周期管理的角度去思考 如图&#xff0c;pod主容器在运行…

JAVA并发编程系列(10)Condition条件队列-并发协作者

一线大厂面试真题&#xff0c;模拟消费者-生产者场景。 同样今天的分享&#xff0c;我们不纸上谈兵&#xff0c;也不空谈八股文。以实际面经、工作实战经验进行开题&#xff0c;然后再剖析核心源码原理。 按常见面经要求&#xff0c;生产者生产完指定数量产品后&#xff0c;才能…

文档矫正算法:DocTr++

文档弯曲矫正&#xff08;Document Image Rectification&#xff09;的主要作用是在图像处理领域中&#xff0c;对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正&#xff0c;使其恢复为平整、易读的形态。 一. 论文和代码 论文地址&#xff1a;https://arxiv.org/…

LDRA Testbed(TBrun)软件单元测试_常见问题及处理

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成&#xff08;自动静态分析并用邮件自动发送分析结果&#xff09; LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件…

POI操作EXCEL增加下拉框

文章目录 POI操作EXCEL增加下拉框 POI操作EXCEL增加下拉框 有时候通过excel将数据批量导入到系统&#xff0c;而业务操作人员对于一些列不想手动输入&#xff0c;而是采用下拉框的方式来进行选择 采用隐藏sheet页的方式来进行操作 String sheetName "supplier_hidden_s…

Python记录

1.冒泡排序 时间复杂度O&#xff08;n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…

基于深度学习的文本情感原因提取研究综述——论文阅读

前言 既然要学习情感分析&#xff0c;那么肯定还要了解情感原因对抽取的发展历程&#xff0c;所以我又搜了一篇研究综述&#xff0c;虽然是2023年发表的&#xff0c;但是里面提及到的历程仅停留到2022年。这篇综述发布在TASLP期刊&#xff0c;是音频、声学、语言信号处理的顶级…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL21

根据状态转移表实现时序电路 描述 某同步时序电路转换表如下&#xff0c;请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 电路的接口如下图所示。 输入描述&#xff1a; input A , input clk , …

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件&#xff08;Component&#xff09;角色2.2 具体构件&#xff08;Concrete Component&#xff09;角色2.3 装饰&#xff08;Decorator&#xff09;角色2.4 具体装饰&#xff08;Concrete Decorator&#xff09;角色2.5 测试 结…

【HTML5】html5开篇基础(1)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

【优选算法之前缀和】No.6--- 经典前缀和算法

文章目录 前言一、前缀和例题模板&#xff1a;1.1 【模板】前缀和1.2 【模板】⼆维前缀和1.3 寻找数组的中⼼下标1.4 除⾃⾝以外数组的乘积1.5 和为 K 的⼦数组1.6 和可被 K 整除的⼦数组1.7 连续数组1.8 矩阵区域和 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f6…

Python酷玩之旅_mysql-connector

前言 Python作为数据科学、机器学习等领域的必选武器&#xff0c;备受各界人士的喜爱。当你面对不同类型、存储于各类介质的数据时&#xff0c;第一时间是不是要让它亮个相&#xff1f;做个统计&#xff0c;画个图表&#xff0c;搞个报表… 等等。 正如Java中的JdbcDriver一样…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~

本以为遥遥领先的GPT早就普及了&#xff0c;但小伙伴寻找使用的热度一直高居不下&#xff0c;其实现在很简单了&#xff01; 国产大模型快200家了&#xff0c;还有很多成熟的国内AI产品&#xff0c;跟官网一样使用&#xff0c;还更加好用~ ① 3.5 大多数场景是够用的&#xff…

OpenCV特征检测(12)检测图像中的潜在角点函数preCornerDetect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算用于角点检测的特征图。 该函数计算源图像的基于复杂空间导数的函数 dst ( D x src ) 2 ⋅ D y y src ( D y src ) 2 ⋅ D x x src − 2 …