11 - TCPClient实验

news/2024/9/19 8:11:24 标签: python, 嵌入式硬件, TCPClient, ESP32
在上一个章节的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. 程序

python">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.niftyadmin.cn/n/5665237.html

相关文章

使用Maven创建一个Java项目并在repository中使用

JDK环境:1.8.0_371 Maven环境 :Apache Maven 3.6.3 配置完成jdk和mvn后,进入到指定文件夹下执行如下语句: mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…

接口幂等性和并发安全的区别?

目录标题 幂等性并发安全总结 接口幂等性和并发安全是两个不同的概念,虽然它们在设计API时都很重要,但侧重点不同。 幂等性 定义:幂等性指的是无论对接口进行多少次相同的操作,结果都是一致的。例如,HTTP的PUT和DELE…

ts类型谓词和never

ts谓词 有时会写一些用于判断变量类型的工具函数,然后根据函数返回的布尔值来做逻辑处理。比如下面的代码例子: function isArrayBoolean(value: unknown): boolean {return Array.isArray(value); }if (isArrayBoolean(value)) {// TypeScript 仍然认…

暑假考研集训营游记

文章目录 摘要:1.对各大辅导机构考研封闭集训营的一些个人看法:2.对于考研原因一些感想:结语 摘要: Ashy在暑假的时候参加了所在辅导班的为期一个月的考研封闭集训营,有了一些全新的感悟,略作记录。 1.对…

Vue 3 是 Vue.js 的下一代版本,它在许多方面都带来了显著的改进和变化,旨在提高开发效率和用户体验

性能提升: Vue 3 引入了一个新的编译系统(Proxy-based)和响应式系统(Proxy),这极大地提高了性能。Proxy 相比 Vue 2 中的 Object.defineProperty,在处理嵌套对象和数组时更加高效和灵活。静态提…

python多线程程序设计 之一

python多线程程序设计 之一 全局解释器锁线程APIsthreading.active_count()threading.current_thread()threading.excepthook(args, /)threading.get_native_id()threading.main_thread()threading.stack_size([size]) 线程对象成员函数构造器start/runjoin 线程子类 实列代码 …

CentOS 中配置 OpenJDK以及多版本管理

以下是在 CentOS 中配置 OpenJDK 的步骤: 一、安装 OpenJDK 使用以下命令检查系统中是否已经安装了 Java: java -version如果已安装,会显示 Java 版本信息。如果未安装,则继续下一步。 使用 yum 安装 OpenJDK: yum ins…

基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统

基于【OpenHarmony的智慧医疗综合应用系统】 一.了解OpenHarmony(开源鸿蒙)进行应用开发1.了解OpenHarmony架构2. 获取开发环境和工具3. 创建项目4. 开发应用5. 调试和测试6. 发布应用7. 学习和社区支持 二.基于开源鸿蒙(OpenHarmony)的智慧医疗综合应用系统业务场景设计1. 智能…