ESP32-S3如何用socket通信

news2024/12/23 14:43:22

实验目的:

        通过 Socket 编程实现 pyWiFi-ESP32-S3 与电脑服务器助手建立连接,相互收
发数据。

首先先来简单了解一下Socket

我们先来看看网络层级模型图,这是构成网络通信的基础:

        我们看看 TCP/IP 模型的传输层和应用层,传输层比较熟悉的概念是 TCP 和 UDP, UPD 协议基本就没有对 IP 层的数据进行任何的处理了。而 TCP 协议还加入 了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window ),以及接收确 认和重发机制,以达到数据的可靠传送。应用层中网页常用的则是 HTTP 。那么我们先来解析一下这 TCP HTTP 两者的关系。

        我们知道网络通信是最基础是依赖于 IP 端口的, HTTP 一般情况下默认使用端口 80。举个简单的例子:我们逛淘宝,浏览器会向淘宝网的网址(本质是IP)和端口发起请求,而淘宝网收到请求后响应,向我们手机返回相关网页数据信息,实现了网页交互的过程。而这里就会引出一个多人连接的问题,很多人访问淘宝网,实际上接收到网页信息后就断开连接,否则淘宝网的服务器是无法支撑这么多人长时间的连接的,哪怕能支持,也非常占资源。

        也就是应用层的 HTTP 通过传输层进行数据通信时, TCP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP IP 协议交互提供了套接字 (Socket)接口。应用层可以和传输层通过 Socket 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

        简单来说,Socket 抽象层介于传输层和应用层之间, TCP/IP 并没有必然的联系。Socket 编程接口在设计的时候,就希望也能适应其他的网络协议。

        套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:
        连接使用的协议(通常是 TCP UDP ),本地主机的 IP 地址,本地进程的协议端
口,远地主机的 IP 地址,远地进程的协议端口。

        所以,socket 的出现只是可以更方便的使用 TCP/IP 协议栈而已,简单理解就是其对 TCP/IP 进行了抽象,形成了几个最基本的函数接口。比如 create listen, accept, connect read write 等等。以下是通讯流程:

重点

从上图可以看到,建了 Socket 通信需要一个服务器端和一个客户端,以本实验为例,pyWiFi-ESP32-S3 作为客户端,电脑使用网络调试助手作为服务器端,双方使用 TCP 协议传输。

对于客户端,则需要知道电脑端的 IP 和端口即可建立连接。(端口可以自定义,范0~65535 ,注意不占用常用的 80 等端口即可。)

以上的内容,简单来说就是如果用户面向应用来说,那么 ESP32-S3 只需要知道通讯协议是 TCP UDP 服务器的 IP 端口号 3 个信息,即可向服务器发起连接和发送信息。就这么简单。

代码如下

'''
实验名称:Socket通讯
版本:v1.0
日期:2024.4
作者:冰美式
说明:通过Socket编程实现pyWiFi-ESP32-S3与电脑服务器助手建立TCP连接,相互收发数据
可以控制舵机。
'''

#导入相关模块
import network,usocket,time
from machine import SoftI2C,Pin,Timer, PWM
from ssd1306 import SSD1306_I2C

#初始化相关模块
i2c = SoftI2C(sda=Pin(42), scl=Pin(40))

S1 = PWM(Pin(4), freq=50, duty=0) # Servo1的引脚是0


def Servo(servo,angle):
    S1.duty(int(((angle+90)*2/180+0.5)/20*1023))
    
#WIFI连接函数
def WIFI_Connect():

    WIFI_LED=Pin(46, Pin.OUT) #初始化WIFI指示灯

    wlan = network.WLAN(network.STA_IF) #STA模式
    wlan.active(True)                   #激活接口
    start_time=time.time()              #记录时间做超时判断

    if not wlan.isconnected():
        print('Connecting to network...')
        wlan.connect('FM-674614', '12345678') #输入WIFI账号密码

        while not wlan.isconnected():

            #LED闪烁提示
            WIFI_LED.value(1)
            time.sleep_ms(300)
            WIFI_LED.value(0)
            time.sleep_ms(300)

            #超时判断,15秒没连接成功判定为超时
            if time.time()-start_time > 15 :
                print('WIFI Connected Timeout!')
                break

    if wlan.isconnected():
        #LED点亮
        WIFI_LED.value(1)

        #串口打印信息
        print('network information:', wlan.ifconfig())


        return True

    else:
        return False


#判断WIFI是否连接成功
if WIFI_Connect():

    #创建socket连接TCP类似,连接成功后发送“Hello 01Studio!”给服务器。
    s=usocket.socket()
    addr=('192.168.0.101',10000) #服务器IP和端口
    s.connect(addr)
    s.send('Hello 01Studio!')

while True:
    data = s.recv(128)  # 单次最多接收 128 字节
    if data == b'':
        pass
    else:  # 打印接收到的信息为字节,可以通过 decode('utf-8')转成字符串
        print(data)
        number = int(data.decode('utf-8'))  # 将接收到的字节数据转换为整数
        s.send(b'I got: ' + data)  # 发送确认收到的信息给服务器
        Servo(S1, number)  # 调用 Servo() 函数并传递整数值

    time.sleep_ms(300)

注意,要改成相同的路由WIFI密码,服务器的IP是本机电脑的IP(用ipconfig可以查到)。然后端口写 100000-65535 都可以)。

WIFI 连接成功后返回 True ,否则返回 False 。程序在返回连接成功后建了 Socket 连接,连接成功发送‘ Hello 01Studio!’信息到服务器。另外 RTOS 定时器设定了了每 300ms 处理从服务器接
收到的数据。将接收到数据通过串口打印和发送给服务器。

中间的IP地址是电脑本机的IP地址,端口号注意与thonny里面绑定给ESP32的端口号要一致。

成功如下:

选中后我们在发送框输入信息“ Hi ”,点击发送,可以看到开发板的 REPL 235
印出来信息 Hi 。为字节数据。另外由于程序将收到的信息发回给服务器,所以在
网络调试助手中也接收到开发板返回的信息: I got:Hi

你发送数字,舵机可以转动。

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

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

相关文章

内网安全【1】——域信息收集/应用网络凭证/CS插件/Android/BloodHound

内容大纲: 概念名词: 局域网 (自己家) 工作组 (网吧) 内网域 (公司) 比如一家公司有1000台机器 运维人员去管理1000 不可能每台上去都进行软件的安装 环境的部署 密码的设置…

Vue+Echarts 实现中国地图和飞线效果

目录 实现效果准备 实现效果 在线预览:https://mouday.github.io/vue-demo/packages/china-map/dist/index.html 准备 高版本的echarts,不包含地图数据,需要自己下载到项目中 1、地图数据下载 https://datav.aliyun.com/portal/school/at…

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要: 自主导航是野外机器人执行精确农业…

vue-quill-editor富文本插件控制字数显示

最终效果 富文本编辑框&#xff0c;只统计内容&#xff0c;不包含标签以及样式&#xff0c;超出最大字数限制提示。 具体代码 html <div class"relative"><quillEditorv-model"form.nutriSuggestion"ref"myQuillEditor7":options&quo…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

【网络原理】数据链路层 及 DNS域名系统

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 【网络…

为什么使用ZigBee技术开发智能家居产品?

随着智能家居市场的蓬勃发展&#xff0c;各种智能设备层出不穷&#xff0c;其中Zigbee技术因其独特的优势在这些智能设备中得到了广泛应用。那么&#xff0c;zigbee技术究竟具备哪些令人瞩目的优势&#xff0c;为什么能够得到如此广泛的应用呢&#xff1f; 什么是Zigbee协议&am…

Docker 容器操作

容器创建 就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 格式&#xff1a;docker create [选项] 镜像 常用选项&#xff1a; -i&#xff1a;让容器开启标准输入 -t&#xff1a;让…

电商架构:系统设计+表设计

如有不对&#xff0c;请指正 欢迎评论区交流 需要哪些系统 商品系统、订单系统、权限系统、审核系统等。 商品系统 订单系统 审核系统 权限系统 参考 基于电商中台架构-商品系统设计(一) 附件

APQC是美国生产力与质量中心

APQC简介 APQC是美国生产力与质量中心( American Productivity and Quality Center)的简称。该中心自1991年开始研究开发流程分类框架&#xff08;简称PCF&#xff09;&#xff0c;1992年发布PCF1.0。PCF将运营与管理等流程汇总成12项企业级流程类别&#xff0c;每个流程类别包…

win10安装pytorch + cuda

1&#xff1a;下载cuda工具cuda-toolkit 地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 2&#xff1a;一路向下&#xff1a;安装 3&#xff1a;配置环境变量 path 环境变量中添加&#xff1a; 4&#xff1a;验证cuda是否安装成功&#xff1a; nvcc -…

计算机网络——初识网络

一、局域网与广域网 1.局域网&#xff08;LAN&#xff09; 局域网&#xff1a;即Local Area Network&#xff0c;简称LAN。Local即标识了局域⽹是本地&#xff0c;局部组建的⼀种私有⽹络。局域⽹内的主机之间能⽅便的进⾏⽹络通信&#xff0c;⼜称为内⽹&#xff1b;局域⽹和…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址&#xff1a;https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

RCE复习(ctfhub上)

一、rce漏洞概述 在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理&#xff0c;若应用对用户的输入过滤不严&#xff0c;容易产生远程代码执行漏洞或系统命令执行漏洞。 二、常见RCE漏洞函数 1.系统命令执行函数 system()&#xff1a;能将…

LeetCode 94.二叉树的中序遍历

题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] …

【c++】----STL简介string

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string类 1. 为什么学习string类&#xff1f; 6.string类的常用接口说明&#xff08;下面我们只讲解最常用的接口&#xff09; 1.string 常见构造 2.string类的遍历 iterator 迭代器遍历 &#xff08;…

uniapp制作安卓原生插件踩坑

top. fireEvent失效的问题 本来我项目跑的好好的&#xff0c;结果放到公司项目半天收不到回调 结果是因为vue3 方法 onTel会变成on-tel 全部改小写才行了 1.uniapp和Android工程互相引用讲解 uniapp原生Android插件开发入门教程 &#xff08;最新版&#xff09;_uniapp and…

Java设计模式 _创建型模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式 属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。 二、代码示例 场景&#xff1a;花店有不同的花&#xff0c;通过工厂模式来获取花。 1、普通工厂模式 逻辑步骤&#…

AnaTraf网络流量分析仪:实时监控、故障排除和性能优化的必备工具

AnaTraf网络流量分析仪是一款高性能的实时网络流量分析工具&#xff0c;用于全流量回溯分析、网络流量监控、网络性能分析、快速排除网络故障。本文将为您详细介绍AnaTraf的功能和优势&#xff0c;帮助您了解如何通过该设备进行网络流量监控、故障排除和性能优化。 一、AnaTraf…

修改CentOS ifcfg_ens33文件,提示 file read only/只读

没有用root用户去修改&#xff0c;需要切换到root用户&#xff1a; su root 输入root密码&#xff0c;切换到root用户修改。 另一个原因&#xff1a;打开文件的时候有临时文件存在&#xff0c;这个时候需要按E才能确认编辑&#xff0c;否则是默认以只读方式打开。 参考《vim编…