12 - TCPServer实验

在上一章节中,我们学习了TCPClient通信测试的相关知识。接下来,本章节将以此为基础,构建一个基础性的TCPServer连接机制,该机制将利用之前所建立的WIFI网络连接。为方便演示,我们将借助网络调试助手工具进行数据的发送,进而对网络通信中接收到的数据进行测试,确保这些数据能够准确无误地回传,以验证通信机制的有效性和稳定性。

本节课目标:

基于ESP32开发板的WiFi网络,实现一个简单的TCPServer连接,通过网络调试助手发送数据,并将接收到的数据原原本本地返回。

本节课内容:

  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.setsockopt(level, optname, value)

参数描述如下:

参数

描述

level

是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为SOL_SOCKET

optname

在套接字级别上(SOL_SOCKET),option_name可以有以下取值:

  • SO_DEBUG,打开或关闭调试信息
  • SO_REUSEADDR,打开或关闭地址复用功能
  • SO_DONTROUTE,打开或关闭路由查找功能
  • SO_BROADCAST,允许或禁止发送广播数据
  • SO_SNDBUF,设置发送缓冲区的大小
  • SO_RCVBUF,设置接收缓冲区的大小
  • SO_KEEPALIVE,套接字保活
  • SO_OOBINLINE,紧急数据放入普通数据流
  • SO_NO_CHECK,打开或关闭校验和
  • SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权
  • SO_LINGER,如果选择此选项, close或 shutdown将等到所有套接字里排队的消息成功发送或到达延迟时间后>才会返回. 否则, 调用将立即返回
  • SO_PASSCRED,允许或禁止SCM_CREDENTIALS 控制消息的接收
  • SO_TIMESTAMP,打开或关闭数据报中的时间戳接收
  • SO_RCVLOWAT,设置接收数据前的缓冲区内的最小字节数
  • SO_RCVTIMEO,设置接收超时时间
  • SO_SNDTIMEO,设置发送超时时间
  • SO_BINDTODEVICE,将套接字绑定到一个特定的设备上

value

True:开启;False:关闭

返回值:无

(3)socket绑定到地址

其方法原型如下:

socket.bind(address)

参数描述如下:

参数

描述

address

IP地址(字符串形式输入,如‘192.168.1.100’)

返回值:无

(4)监听连接

用作于 TCPServer 连接。

其方法原型如下:

socket.listen(backlog[])

参数描述如下:

参数

描述

backlog

监听连接数量

返回值:无

(5)接受连接

用作于 TCPServer 连接。注:在此之前,需监听连接

其方法原型如下:

socket.accept()

返回值:conn:新的套接字对象,用来收发消息;address:连接到服务器的客户端地址。

(6)连接远程IP地址

其方法原型如下:

socket.connect(address)

参数描述如下:

参数

描述

address

IP地址(字符串形式输入,如‘192.168.1.100’)

返回值:无

(7)发送数据,返回发送的字节数

其方法原型如下:

socket.send(bytes)

参数描述如下:

参数

描述

bytes

需发送的字节数据

返回值:发送的数据字节数。

(8)接收数据,返回值是一个字节对象

其方法原型如下:

socket.recv(bufsize)

参数描述如下:

参数

描述

bufsize

接收数据的存储区

返回值:接收数据字节对象。

(9)接收数据,返回值是一个字节对象

其方法原型如下:

socket.recvfrom(bufsize)

参数描述如下:

参数

描述

bufsize

接收数据的存储区

返回值:bytes:接收数据字节对象;addressa:套接字发送的地址数据。

(10)UDP发送数据,一般用于UDP连接

其方法原型如下:

socket.sendto(bytes, address)

参数描述如下:

参数

描述

bytes

发送的数据

address

发送至哪个远程IP地址

返回值:发送的数据字节数。

以上方法列出了本书中常用的套接字方法,对于剩余的套接字方法,请参考MicroPython最新的在线文档。

四、硬件设计

1. 例程功能

在本次实验中,我们将ESP32开发板与WiFi网络进行了连接,并完成了TCPServer的连接配置。当TCPServer成功建立连接后,我们采用了网络调试助手作为客户端设备,而开发板则作为服务器端设备。在此环境下,当客户端设备(即网络调试助手)向服务器端设备(即开发板)发送数据时,服务器端设备将接收到的数据完整地回传至客户端设备,从而实现了数据的双向交互。

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 套接字TCPServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)       # 创建 TCPServer 对象,IPV4 \ TCP 类型# 4、绑定 本地IP 和 端口号# 设置端口复用,是用来设置套接字选项的函数调用。这个选项用于指定套接字的行为,打开地址复用功能,以便在绑定到一个端口时,能够重新使用这个端口。否则会出错TCPServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)TCPServer.bind(('', 8080))# 5、监听,参数是同时连接的客户端数量TCPServer.listen(10)# 6、阻塞等待客户端连接# 返回一个元组 (新 socket, (客户端 IP,端口) )try:new_socket, client_ip_port = TCPServer.accept()       # 连接服务器except BaseException:# 故障处理程序new_socket.close()                          # 关闭新套接字TCPServer.close()                           # 关闭套接字print(' 关闭套接字.... ')goto(0)                                     # 重新返回状态 0breakelse:print('连接建立成功......')new_socket.send('************** ESP32 服务器: '.encode() + str(ip).encode() + ' 欢迎你!!! ****************\r\n'.encode())goto(1)                                     # 进入状态 1:网络连接成功,处理通信while pos == 1:# 状态 1 : 用于连接服务器后,发送接收到的服务器数据try:# 接收到客户端的数据data = new_socket.recv(1024)print(data.decode())except BaseException:# 故障时,关闭连接,重新建立连接new_socket.close()TCPServer.close()                       # 关闭套接字goto(0)breakelse:# 空数据时,不回显if (len(data) == 0):print('接收到空的数据')new_socket.close()TCPServer.close()  # 关闭套接字goto(0)breakelse:# 非空数据回显new_socket.send(data)

五、下载验证

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

与ESP32通过TCP协议相互通信。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

五、filter

文章目录 1. Filter 什么是过滤器2. Filter 的初体验3. Filter的生命周期4. FilterConfig 类5. FilterChain 过滤器链6. FIlter 的拦截路径 1. Filter 什么是过滤器 2. Filter 的初体验 3. Filter的生命周期 4. FilterConfig 类 5. FilterChain 过滤器链 6. FIlter 的拦截路径

openssl-AES-128-CTR加解密char型数组分析

本文章通过对一个unsigned char*类型的数据做简单的加解密操作来学习如何使用openssl库函数。 openssl为3.0.0&#xff0c;对此前版本的很多函数都不兼容。 加解密源码 #include <openssl/evp.h> #include <openssl/err.h> #include <string.h> #include …

手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)

手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨) 前言 前面的篇章和方案中&#xff0c;我们说到可以使用蓝牙、USB等方式把声音从手机中提取出来&#xff0c;但对于SIM通话&#xff0c;因为手机进行了层层封锁的原因&#xff0c;实时的通话语音数据和打通/…

2017年国赛高教杯数学建模A题CT系统参数标定及成像解题全过程文档及程序

2017年国赛高教杯数学建模 A题 CT系统参数标定及成像 CT(Computed Tomography)可以在不破坏样品的情况下&#xff0c;利用样品对射线能量的吸收特性对生物组织和工程材料的样品进行断层成像&#xff0c;由此获取样品内部的结构信息。一种典型的二维CT系统如图1所示&#xff0c…

【Elasticsearch系列十四】Elasticsearch

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 中的 Screen 命令详解

目录 前言1. 什么是 Screen 命令2. Screen 命令的主要功能3. Screen 命令的安装4. Screen 的基础使用4.1 启动一个新的 Screen 会话4.2 恢复一个断开的 Screen 会话4.3 退出一个 Screen 会话 5. Screen 命令的常用参数5.1 -S&#xff1a;指定会话名称5.2 -r&#xff1a;恢复会话…

同一个单元格内包含标签和文本框

<!DOCTYPE html> <html> <head> <title>单元格内包含标签和文本框</title> <style> /* 可选的CSS样式&#xff0c;用于美化表格 */ table { width: 50%; /* 设置表格宽度为页面宽度的50% */ border-collapse: collapse; /* 合并…

LabVIEW软件维护的内容是什么呢?

LabVIEW软件维护涉及多个方面&#xff0c;确保程序的正常运行和长期稳定性。维护内容包括以下几个方面&#xff1a; 1. Bug修复 在开发和运行过程中&#xff0c;可能会出现各种软件问题或缺陷&#xff08;bugs&#xff09;。维护工作之一就是识别这些问题并通过修复程序中的代…

网络高级day01(Modbus 通信协议)

目录 1》modbus分类 1> Modbus RTU 2> Modbus ASCLL 3> Modbus TCP 2》Modbus TCP的特点 3》Modbus TCP协议 1> 报文头&#xff08;一共7个字节&#xff09; 2> 寄存器 3> 功能码 4> 数据 01H 功能码分析 05H 功能码分析 0FH 功能码分析 1》modbus…

【5】AT32F437 OpenHarmony轻量系统移植教程(2)

开源地址&#xff1a;https://gitee.com/AT32437_OpenHarmony 学习本文档的意义 1.学习移植OpenHarmony轻量系统到AT32全系列mcu上&#xff0c;本文档移植的具体型号为AT32F437ZMT7 2.学习OpenHarmony轻量系统开发 3.适配vprintf, vfprintf, printf, snprintf 和sprintf 1…

【新手上路】衡石分析平台系统管理手册-安全管理

安全策略​ 安全策略是针对系统中所有用户进行的安全控制&#xff0c;只有系统管理员可以设置。 打开设置->安全策略页面。 登录安全策略​ 启用复杂密码​ 启用之后&#xff0c;用户修改密码时&#xff0c;必须输入符合要求的复杂密码。 密码90天失效​ 密码的有效期…

UnLua扩展C++函数和蓝图自定义事件

一、通过BlueprintImplementableEvent标记扩展C函数 1、 这个标记表示C不需要实现&#xff0c;让蓝图/Lua重写。 2、首先在C中将LuaImp函数标记为BlueprintImplementableEvent&#xff0c;不需要实现&#xff0c;然后再GetIndex中调用该函数。 MyBaseActor.h UFUNCTION(Bluepr…

任务书与开题报告的区别与联系:如何让二者相辅相成

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 大家好&#xff01;今天咱们聊聊论文写作过程中两个让人又爱又恨的关键步骤&#xff1a;任务书和开题报告。 这两兄弟可是你毕业路上的第一关卡&#xff0c;搞不定它们&#xff0c;你后面别说论文了&#…

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…

letterSpacing导致TextView文本被截断

一.背景介绍 &#xff08;Android10 11目前有这个问题 Android15似乎有新的属性 但是没有可用的环境 没有验证&#xff09; 简介 android:maxLines"1" android:textAlignment"viewStart" android:letterSpacing"0.04" 多个属性同时作用情况下 …

基于C语言+SQL Server2008实现(控制台)图书管理系统

第1章 概述 1.1项目背景 随着科技的发展&#xff0c;尤其是计算机技术的迅猛发展&#xff0c;图书馆管理的问题从以往的人工管理&#xff0c;到现在的电脑化&#xff0c;系统化&#xff0c;是对图书馆管理方法的质的飞跃&#xff0c;这些技术不仅让图书馆管理变得更加方便、快…

用代码生成代码之Roslyn-C#代码分析和生成工具

Roslyn 是什么&#xff1f; Roslyn是微软公司开源的.NET编译器&#xff0c;它提供了丰富的代码分析API&#xff0c;并支持C#和Visual Basic代码的编译。 Roslyn 的主要功能 编译器扩展&#xff1a; 使用Roslyn可以创建自定义的编译器扩展&#xff0c;如语法分析器、重构器、…

Redis主从架构原理

我们使用redis的时候为了预防单点故障&#xff0c;通常要做高可用设计&#xff0c;redis主从架构就是一种防止redis主节点宕机启用从节点的高可用设计方案。下面我们看一下redis主从架构的设计原理。 Redis 主从架构 单机的 Redis&#xff0c;能够承载的 QPS 大概就在上万到几…

力扣 16.最接近的三数之和

文章目录 题目介绍解法 题目介绍 解法 设 snums[i]nums[j]nums[k]&#xff0c;为了判断 s 是不是与 target 最近的数&#xff0c;我们还需要用一个变量 minDiff 维护 ∣s−target∣ 的最小值。分类讨论&#xff1a; 如果 starget&#xff0c;那么答案就是 s&#xff0c;直接返…

网络-内核是如何与用户进程交互

1、socket的直接创建 net/socket.cSYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) {...retval sock_create(family, type, protocol, &sock);... }int sock_create(int family, int type, int protocol, struct socket **res) {return __sock_create(cu…