首页 > 其他分享 >11 - TCPClient实验

11 - TCPClient实验

时间:2024-09-19 11:20:49浏览次数:3  
标签:11 TCPClient socket 如下 实验 返回值 参数 连接 network

在上一个章节的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协议数据传输时丢包率更低。】

标签:11,TCPClient,socket,如下,实验,返回值,参数,连接,network
From: https://blog.csdn.net/johnny235241/article/details/142325553

相关文章

  • 迅为RK3588开发板支持Android13和12版本系统还有Debian11、Buildroot、Ubuntu20与22版
    我们已经在RK3588上开发了稳定又好用的Android13和12版本系统Debian11、Buildroot、Ubuntu20与22版本、银河麒麟、开放麒、统信系统、openEuler24.03系统,内核Linux5.10版本。......
  • 关于win10和win11系统卡死
    在使用过程中,系统卡死,鼠标能用,无法使用win+shift+s,win+r等按键,win10仅仅能使用ctrl+alt+del键,win11完全无法使用,仅仅可移动鼠标。该现象是win系统的更新bug,需要关掉任务栏资讯设置。如果我们打开任务管理器,查看进程管理,会发现任务栏占用高达100多M,这是不正常的。并且重启无效。......
  • 1191. K 次串联后最大子数组之和
    题目链接1191.K次串联后最大子数组之和思路前缀和/动态规划-最大子数组和-简单变体题解链接dp做法正确性的详细证明(图帮助理解)关键点分情况讨论(\(k\ge2\)):1.序列和小于02.序列和大于等于0时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:MOD=1......
  • 【2024潇湘夜雨】WIN11_Pro_21H2.22000.3197软件选装纯净特别版9.19
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_21H2.22000.3197.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为22000.3197。......
  • 基于spring boot的校园计算机实验室管理系统的设计与实现(源码+LW+调试文档+讲解等)
    博主介绍: ......
  • D11【python接口自动化学习】-python基础之内置数据类型
    day11列表的常见操作学习日期:20240918学习目标:内置数据类型--20列表的常见操作学习笔记:添加元素#创建列表list_demo=['a','b','c','d']print(type(list_demo))#<class'list'>print(list_demo)#['a','b','c�......
  • 【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
    【洛谷】P11062【MX-X4-T2】「Jason-1」加法的题解题目传送门离CSP初赛只剩两天了,祝各位OIersrp++!!!题解挺有意思的一道思维题,不过比赛的时候没想出来。需要分类讨论两种情况:当a......
  • 互连产品,10151114-001RLF PCIe MXM 3.0 连接器,10157096-01221LF 针座连接器(参数)
    10151114-001RLF——PCIeMXM3.0连接器,存储和服务器连接器,直角,表面贴装,P=0.5mm,堆叠高度=5.0mm,30μin镀金概述:MXM连接器是一种高密度PCIe®解决方案,支持新一代服务器系统架构。这是一个非专有的行业标准插座产品系列。可用于升级设备中的图形处理器,而无需更改整个系统或依赖专......
  • C++11的一些特性
    记录一下使用过的C++11的一些特性,大致分为三部分:并发相关,智能指针相关,chrono。 并发相关:std::thread相关:#include<iostream>#include<thread>usingnamespacestd;intmain(){autofunc=[](){for(inti=0;i<10;++i){cout<<i<......
  • P11071 「QMSOI R1」 Distorted Fate
    介绍一种好想、在线、空间小、跑的还挺快的做法(?)先暂时不考虑修改,只考虑怎么快速求解询问。询问相当于区间内前缀按位或的和。根据按位或的性质,当区间内某个值在某一位下是\(1\),那么所有包含这个值的前缀的按位或结果在该位下都为\(1\)。考虑拆位,单独考虑每一位对答案的贡献,......