28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈

news2024/10/6 8:33:00

ESP32-S3 lwIP

介绍

ESP32-S3 是一款集成了Wi-Fi 和蓝牙功能的微控制器。它的设计初衷是为了方便嵌入式系统的开发。不过你可能会好奇,ESP32-S3 怎么实现与外部网络的通信呢?这里就要提到一个开源的 TCP/IP 协议栈,它叫做lwIP(轻量级 IP)。

通过使用 lwIP 库,ESP32-S3 可以轻松实现与外部网络的交互。它能发送和接收数据包,并处理网络连接等操作。因此,可以说ESP32-S3 是借助lwIP来实现网络功能的利器。

TCP/IP 协议栈是什么

TCP/IP协议栈是一种用于计算机网络通信的协议集合。它包括传输控制协议(TCP)和互联网协议(IP),这两种协议是最早也是最核心的协议。TCP/IP协议栈定义了数据如何在网络中传输,以及如何通过网络地址找到网络上的设备。网络协议体系本身很复杂庞大,内容很多,这里只做简单讲解

TCP/IP 协议栈概述

TCP/IP 协议栈(Transmission Control Protocol/Internet Protocol)是一组用于计算机网络通信的协议集合。它被设计为模块化结构,每一层都有特定的功能,彼此协同工作,共同实现可靠的数据传输。TCP/IP 协议栈分为四层:应用层、传输层、网络层和数据链路层。

各层次详解

1. 应用层

应用层是 TCP/IP 协议栈的顶层,负责处理特定的应用程序通信。它包含许多常用的协议,每个协议对应不同的应用服务。

应用层协议描述示例应用
HTTP(HyperText Transfer Protocol)用于万维网(WWW)上的数据通信,支持浏览器与服务器之间的交互网页浏览
FTP(File Transfer Protocol)用于在网络中传输文件文件传输
SMTP(Simple Mail Transfer Protocol)用于电子邮件的发送和接收电子邮件
DNS(Domain Name System)将域名解析为 IP 地址,方便用户访问网站域名解析
2. 传输层

传输层的主要功能是提供端到端的通信服务,确保数据可靠传输。它有两个主要协议:

传输层协议描述特点
TCP(Transmission Control Protocol)提供可靠的、面向连接的服务通过三次握手建立连接,确保数据包有序和完整传输,提供流量控制和拥塞控制
UDP(User Datagram Protocol)提供无连接的服务,适用于需要快速传输且不要求高可靠性的应用没有连接建立和断开过程,不保证数据包的顺序和完整性,但传输延迟较低
3. 网络层

网络层负责数据包在网络中的路由选择和转发,主要协议是 IP(Internet Protocol)。

网络层协议描述
IP(Internet Protocol)负责将数据包从源地址传送到目标地址,提供不可靠、无连接的数据传输服务
ICMP(Internet Control Message Protocol)用于网络设备之间发送控制消息,如 Ping 命令用于检测网络连接状态
ARP(Address Resolution Protocol)将 IP 地址解析为物理地址(MAC 地址),用于局域网内通信
RARP(Reverse Address Resolution Protocol)将物理地址解析为 IP 地址,常用于无盘工作站启动
4. 数据链路层

数据链路层负责在物理网络上的数据传输,具体实现取决于底层网络技术,如以太网、Wi-Fi 等。

数据链路层协议描述
以太网(Ethernet)规定了物理层和数据链路层的技术标准,使用 MAC 地址进行帧的标识和传输
Wi-Fi基于 IEEE 802.11 标准,实现无线局域网通信,包含多种协议和加密方式,确保数据安全传输

数据传输过程

以一个简单的 HTTP 请求为例,来说明 TCP/IP 协议栈的工作过程:

层次处理步骤
应用层用户在浏览器中输入网址,浏览器生成 HTTP 请求
传输层HTTP 请求被封装为 TCP 报文,TCP 协议添加源端口、目标端口、序列号等信息
网络层TCP 报文被封装为 IP 数据包,添加源 IP 地址、目标 IP 地址等信息
数据链路层IP 数据包被封装为帧,添加源 MAC 地址、目标 MAC 地址等信息,通过物理网络传输

数据在各层之间传递时,每一层都添加自己的头部信息,通过封装和解封装过程,实现数据从源到目的的可靠传输。

🚨有一点需要注意的是,TCP/IP协议栈和传统的OSI模型并不完全一样。TCP/IP协议栈是一个更简化的模型,它更加强调实际的协议实现和因特网的实际运作方式。相比之下,OSI模型更加全面和理想化,它提供了一个框架来描述不同系统之间的交互方式。
在这里插入图片描述

lwIP 简介

lwIP(轻量级TCP/IP协议栈)是一个专为嵌入式系统设计的开源TCP/IP协议栈。它被创造得非常小巧,只需占用几十KB的RAM和约40KB的ROM。lwIP提供了一套完整的TCP/IP网络协议功能,包括TCP、UDP、IPv4、IPv6、ICMP、IGMP、SNMP、ARP、PPP等协议。同时,lwIP非常灵活,既可以在无操作系统环境下工作,也能与多种操作系统兼容。这给开发者提供了更大的自由度。它具备内存占用小、代码简单、易于移植等优点,非常适合在像ESP32-S3这样的微控制器上使用。

lwIP 特性参数

特性描述
内存占用lwIP 在内存占用方面进行了优化,使其适用于资源受限的嵌入式系统。具体内存占用取决于配置和版本,但通常来说,它可以仅使用十几 KB 的 RAM 和大约 40 KB 的 ROM 即可运行。
协议实现
应用层未实现,需要开发者自行集成或实现特定应用程序
传输层实现了 TCP/UDP 协议功能
网络层实现了 IP 协议、ARP 协议和 ICMP 协议功能
扩展性支持一些实验性的扩展,例如 IPv6 协议
硬件接口
WiFi 网络接口支持 WiFi 连接
以太网网络接口支持以太网连接
用户编程接口
RAW低级接口,适合高效的网络编程
NETCONN中级接口,提供线程安全的函数调用
SOCKET高级接口,类似 BSD 套接字,适合应用程序开发
硬件支持网络接口层的实现依赖于底层硬件和驱动程序。开发者需要根据具体的硬件平台和需求进行相应的配置和优化。
其他特性
PPP 协议支持点对点通信协议
DHCP 协议支持动态分配 IP 地址

lwIP 与TCP/IP 体系结构的对应关系

lwIP 是一个轻量级的开源 TCP/IP 协议栈,它实现了 TCP/IP 体系结构的核心协议。下面的表格展示了 lwIP 各个模块与 TCP/IP 体系结构各层的对应关系:

TCP/IP体系结构lwIP实现
应用层lwIP提供了TCP/IP协议栈的实现,包括IP、TCP、UDP、ICMP等协议
传输层lwIP实现了TCP和UDP协议
网络层lwIP实现了IP协议
网络接口层lwIP并没有实现,这一层由硬件来实现

嘿,看上面那张图,你就能一目了然地明白lwIP软件库主要是怎么一回事。😊 它实际上就是按照TCP/IP的架构分成三个层次:应用层、传输层和网络层。 这几层一起合作来处理和传送数据包,确保数据在网络中可靠地传输。💻可是,网络接口层作为TCP/IP协议栈的最底层,它的功能可不是通过软件能完完全全实现的。🔌 它的主要任务就是把数据包转换成光电模拟信号,这样才能在物理媒介上传输。这个过程涉及到与硬件直接打交道,比如数据的调制解调和信号的转化,这些可都是软件无法模拟或实现的。🔋 所以,虽然lwIP软件库不能负责网络接口层的功能,但是它能够与底层硬件紧密配合,从而提供完整而高效的TCP/IP通信功能。✨ 这也是为什么lwIP成为适用于资源有限的嵌入式系统的最佳选择。💪

WiFi MAC 内核简介

WiFi MAC(媒体访问控制)内核是WiFi通信的核心部分,负责处理WiFi的物理层和数据链路层的任务。ESP32-S3的WiFi MAC内核支持802.11b/g/n协议,可以在2.4GHz频段进行通信。它还支持多种安全协议,包括WEP、WPA/WPA2和WPA3。

关于ESP32的WiFi MAC内核,大致来说,它就是在玩TCP/IP协议的那层网络接口的角色。咱们看看下面这张图来介绍WiFi通讯的情况,就像这张图上面画的那样。

在这里插入图片描述
从上图见,ESP32-S3芯片有内置的WiFi MAC内核。咱们发数据到网络时,数据先转成无线信号,然后发到连接的WiFi路由器中。然后,路由器通过网线把数据传到目标主机,完成数据传输。

lwIP Socket 编程接口

为了方便将其他平台上的网络应用程序移植到lwIP,并让更多开发者快速上手,作者设计了三种应用程序编程接口:2️⃣RAW 、2️⃣NETCONN 和2️⃣Socket 。RAW接口只适用于无操作系统环境,对于ESP32内嵌FreeRTOS操作系统来说无法使用。Socket接口更简易实现了网络连接(作者推荐使用),因此,为了网络连接,建议使用Socket API。

lwIP Socket API

在LwIP中,Socket API是基于NETCONN API之上来实现的。以下是lwIP中的一些主要Socket API:

  • socket():这个函数的功能是向内核申请一个套接字。
  • bind():该函数的功能与netconn_bind()函数是一样的,用于服务器端绑定套接字与网卡信息。
  • connect():用于建立与指定套接字的连接。
  • listen():用于监听指定套接字的连接请求。
  • accept():用于接受连接请求。
  • read(), recv(), recvfrom():用于从套接字接收数据。
  • sendto(), send(), write():用于向套接字发送数据。
  • close():用于关闭套接字。
  • ioctl(), ioctlsocket():用于控制套接字的行为。
  • setsockopt():用于设置套接字选项。
  • getsockopt():用于获取套接字选项。

更详细的信息,可以参考这篇文章。

总结

参考资料

正点原子DNESP32S3 开发板教程-IDF 版

乐鑫编程指南 lwIP

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

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

相关文章

前端AI 工具对开发效率提升的探索

1、AI会100% 取代前端工程师吗? AI技术在未来可能会改变程序员的工作方式,将显著减少开发者的数量,但不太可能完全替代程序员。 AI 对技术的影响:可以大幅度提效。 提问AI模型: AI能取代开发者吗? AI 目前…

第十二节:带你梳理Vue2: computed计算属性

1 计算属性的基本了解 1.1 认识Mustache语法的不足 在模板中写表达式非常便利&#xff0c;但设计的初衷是为了简单的运算&#xff0c;如果是复杂的逻辑运算&#xff0c;会难以维护&#xff0c;不容易理解其中的意思. 示例: <div id"app"><!-- 正常绑定数…

冬奥会|基于SprinBoot+vue的冬奥会科普平台(源码+数据库+文档)

目录 基于SprinBootvue的冬奥会科普平台 一、前言 二、系统设计 三、系统功能设计 1登录注册 2系统功能模块 3管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|…

①单细胞学习-数据读取、降维和分群

目录 ①数据读取 ②计算线粒体基因比例 ③分开进行质控 ④两组单细胞数据合并 ⑤细胞周期评分 ⑥降维标准流程 降维 UMAP可视化 选择分群 ⑦marker基因 分析marker基因 marker基因可视化 ⑧细胞定群命名 单细胞的数据格式学习&#xff1a;单细胞 10X 和seurat对象…

从0到100,渠道码如何成为SaaS企业增长的加速器

在当今数字化时代&#xff0c;企业的增长策略已不再是单一和线性的。渠道码的出现&#xff0c;为SaaS&#xff08;软件即服务&#xff09;企业提供了一种全新的、多维度的增长途径&#xff0c;真正实现了从0到100的快速增长。 一、渠道码的高可定制性和灵活性&#xff0c;为Sa…

人脸识别——Webface-OCC遮挡人脸识别算法解析

1. 概述 自2019年被誉为人脸识别技术的元年&#xff0c;各地纷纷引入这项技术。然而&#xff0c;自2020年起&#xff0c;为了抵御冠状病毒&#xff08;COVID-19&#xff09;的全球传播&#xff0c;人们普遍开始佩戴口罩。众所周知&#xff0c;现有人脸识别模型在面对遮挡物&am…

生成式AI模型大PK——GPT-4、Claude 2.1和Claude 3.0 Opus

RAG(检索增强生成)系统的新评估似乎每天都在发布&#xff0c;其中许多都集中在有关框架的检索阶段。然而&#xff0c;生成方面——模型如何合成和表达这些检索到的信息&#xff0c;在实践中可能具有同等甚至更大的意义。许多实际应用中的案例证明&#xff0c;系统不仅仅要求从上…

Docker安装Redis的详细教程

以下是一个使用Docker安装Redis的详细教程 1. 拉取Redis镜像 运行以下命令来从Docker Hub上拉取最新的Redis镜像&#xff1a; docker pull redis:latest如果您需要特定版本的Redis&#xff0c;可以指定版本号&#xff1a; docker pull redis:6.2.72. 运行Redis容器 以下命…

基于AT89C52单片机的智能窗帘系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89276984?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤07 智能窗户控制系统学院&#xff08;部&#xff09;&#xff1a; 专 业&#xff1a; 班 级&…

前端响应式期末作品

网页设计成品_前端响应式 主题&#xff1a;租房网站&#xff0c;共6个html页面&#xff0c;包含首页&#xff0c;登录注册&#xff0c;租房新闻&#xff0c;租房精选&#xff0c;租房详情&#xff0c;数据可视化页面&#xff08;可以修改内容&#xff09; 采用技术&#xff1a;…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

刷代码随想录有感(81):贪心算法——分发饼干

题干&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index s.size() - 1;int res 0;for(int i g.size() - 1; i > 0; i--){if(index >…

设计模型-系统架构师(三)

1、按照《中华人民共和国著作权法》的权利保护期&#xff0c;署名权和修改权 是永久保护的。 发表权、使用权和获取报酬权 保护期限 作者终生和死后的50年。 2、&#xff08;重要&#xff09;面向对象的分析模型主要由 顶层架构图、用例与用例图和&#xff08;&#xff09;构成…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下&#xff0c;想要让监控或传感器等设备联网&#xff0c;仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用&#xff1a; 物联网应用场景 …

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

SERVER-----查询(1)

目录 Scott库下载&#xff1a; 一. 查询 1. 计算列 2. distinct 3. betwee... and... 4. in Scott库下载&#xff1a; 在大家学习数据库后期需要使用Scott库进行辅助学习&#xff0c;下面是我从一个叫做 yuhan_Li的博主那复制过来的&#xff0c;大家尽可能访问原文章吧&am…

南卡、韶音、Cleer开放式耳机如何选?全面对比测评拒绝智商税!

随着开放式耳机在生活中日益流行&#xff0c;市场上的多样化选择有时也伴随着质量参差不齐的问题&#xff0c;部分产品因成本控制而牺牲了材质和音质&#xff0c;给消费者在寻找高质量耳机时增添了困扰。 作为一名耳机评测领域的从业者&#xff0c;近期我投入大量精力对多款开…

基于STM32实现智能饮水机控制系统

目录 引言环境准备智能饮水机控制系统基础代码示例&#xff1a;实现智能饮水机控制系统 温度传感器数据读取水泵和加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;家庭和办公室的智能饮水管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在S…

1---Linux下进程的概念(逻辑推导,全干货无废话)

一、进程和程序&#xff1a; 1.1什么是程序&#xff1f; 程序由代码、数据、逻辑、接口和文档组成的一组按特定顺序执行的计算机指令&#xff0c;用于实现特定功能或解决问题。程序存储在磁盘上。 1.2什么是进程&#xff1f; 进程是一个正在执行的程序实例&#xff0c;包含程…

数据库查询——kettle开发20

一、数据库查询 数据库查询就是数据库里面的左连接&#xff0c;左连接就是两张表执行左关联查询&#xff0c;把左边的表数据全部查询出来。 如图所示我们在进行数据库查询操作时&#xff0c;我们首先需建立数据库连接&#xff0c;输入表名和查询需要的关键字&#xff0c;最后…