创建ESP32开源WiFi MAC(介质访问控制)层
内置WiFi
内置的 WiFi.h 库将使我们能够轻松使用 ESP32 板的 WiFi 功能。
连接到 Wi-Fi 接入点:
#include <WiFi.h>const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";void setup(){Serial.begin(115200);delay(1000);WiFi.mode(WIFI_STA); //OptionalWiFi.begin(ssid, password);Serial.println("\nConnecting");while(WiFi.status() != WL_CONNECTED){Serial.print(".");delay(100);}Serial.println("\nConnected to the WiFi network");Serial.print("Local ESP32 IP: ");Serial.println(WiFi.localIP());
}void loop(){}
Connecting
................
Connected to the WiFi network
Local ESP32 IP: 192.168.43.129
获取WiFi网络信息
创建开源WiFi MAC
在我们开始对 802.11 PHY 硬件的工作原理以及我们如何与其交互进行逆向工程之前,我们首先需要找到或构建有帮助的工具。我们将使用 3 种主要方法:
- 静态逆向工程
- 模拟器中的动态代码分析
- 真实硬件上的动态代码分析
静态逆向工程
对于静态分析,我们使用 NSA 开发的开源逆向工程工具 Ghidra。 开箱即用时,Ghidra 尚不支持 Xtensa(ESP32 的 CPU 架构),但有一个插件可以增加支持。 ESP32 SDK 中使用的构建工具会生成 ELF 文件(一种可以包含元数据的二进制文件)和平面二进制文件:使用 ELF 文件的优点是可以自动设置大多数函数名称。
模拟器中的动态分析
下面是 QEMU 记录的单个内存访问的示例:这是对地址 3ff46094 的写入(W),值为 00010005,由函数 ram_pbus_force_test 完成。调用堆栈的其余部分也会被记录,并转换为符号名称(如果可用)。
W 3ff46094 00010005 ram_pbus_force_test 400044f4 set_rx_gain_cal_dc set_rx_gain_testchip_70 set_rx_gain_table bb_init register_chipv7_phy esp_phy_load_cal_and_init esp_phy_enable wifi_hw_start wifi_start_process ieee80211_ioctl_process ppTask vPortTaskWrapper
最后,我们还更正了 MAC 地址的处理,以便数据包捕获在数据包中包含正确的 MAC 地址,而不是硬编码地址。
真实硬件进行动态分析
为了动态分析真实硬件上的固件,我们使用 JTAG 硬件调试接口。 通过在ESP32和JTAG调试器之间连接一些跳线,我们可以调试ESP32。 我们按照此文中描述的步骤操作,使 JTAG 调试器 (CJMCU-232H) 正常工作。
软件MAC和硬件MAC
SoftMAC(软件 MAC)和 HardMAC(硬件 MAC)是指实现 Wi-Fi MAC 层的两种不同方法。 SoftMAC 依靠软件来管理 MAC 层功能,这提供了灵活性且易于修改,但会消耗更多的功率/CPU 周期。 另一方面,HardMAC 将 MAC 层处理卸载到专用硬件,从而减少了 CPU 使用率和功耗,但限制了在不更改硬件的情况下适应新功能的能力。
通过编写一些仅循环发送数据包的最小固件,并使用前面描述的三种逆向工程策略,确定了发送数据包的 Wi-Fi 硬件生命周期的高级概述:
调用 esp_wifi_start(),这间接调用了 esp_phy_enable()。esp_phy_enable() 负责初始化 wifi 硬件。现在,我们准备发送数据包:
传输数据包
作为(非常有限的)概念验证,我们希望通过直接使用内存映射外设来发送任意 802.11 帧,因此无需使用 SDK 函数。 从上面的生命周期图中可以看到,在传输之前,我们首先需要初始化wifi硬件。 不幸的是,这种初始化比发送数据包复杂得多:为了初始化硬件,需要大约 50000 次外围存储器访问,而传输数据包(包括处理中断)则需要大约 50 次。 这些根本不是精确的数字,但它们给出了所涉及的复杂性的一个概念。
接收数据包
参阅一:亚图跨际
参阅二:亚图跨际
相关文章:
创建ESP32开源WiFi MAC(介质访问控制)层
内置WiFi 内置的 WiFi.h 库将使我们能够轻松使用 ESP32 板的 WiFi 功能。 连接到 Wi-Fi 接入点: #include <WiFi.h>const char* ssid "yourNetworkName"; const char* password "yourNetworkPassword";void setup(){Serial.begin(11…...
LeetCode 2723. 两个 Promise 对象相加
给定两个 promise 对象 promise1 和 promise2,返回一个新的 promise。promise1 和 promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。 示例 1: 输入: promise1 new Promise(resolve > setTimeout(() > res…...
Flutter--常用技术文档
配置 清华大学flutter镜像 export PUB_HOSTED_URLhttps://mirrors.tuna.tsinghua.edu.cn/dart-pub export FLUTTER_STORAGE_BASE_URLhttps://mirrors.tuna.tsinghua.edu.cn/flutter 社区镜象 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_UR…...
行分类问题
行分类问题可以应用于多个领域和问题,其中一些示例包括: 文本分类: 在自然语言处理中,可以将文本分为不同的类别,例如情感分析、主题分类等。每个文本可以被视为一个“行”,而分类任务就是对每个行进行分类…...
java常见面试题:如何使用Java进行XML解析和生成?
在Java中,有几种不同的方式可以进行XML的解析和生成。以下是使用Java进行XML解析和生成的基本步骤: 解析XML: DOM (Document Object Model): 这是最常用的解析方法。它将整个XML文档加载到内存中,并允许你通过编程方式遍历和操作它…...
【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器
该示例演示了如何使用 LabVIEW FPGA 解码 IS 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标(例如R 系列、CompactRIO)。IS 用于对系统和组件内的数字音频数据进行编码。例如,MP3 播放器或 DVD 播放器内部的数字音频通常使用 …...
linux 安装sipp
sudo apt-get install libnet1-dev libpcap0.8-dev openssl libssl-dev 从 sipp - Browse /sipp/3.2 at SourceForge.net 下载最新版的sipp.svn.tar.gz,解压之后就得到一个rpm文件 tar -zxvf sipp.svn.tar.gz cd sipp make pcapplay_ossl...
c++最值查找
目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n),n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…...
xtu-c语言考试复习-2
1223 确实写不出,数据远超过64位,难道用数组存吗,但是不好计算,想到的思路是取模,一边计算,一边取模,就不会超过数据范围,但是数学原理没懂,所以做不出来 看了下自己以…...
MySQL决战:MySQL数据导入导出
目录 前言 一.navact数据导入导出(第三方工具) 1.导入数据 2.数据导出 二. mysqldump命令导入导出数据 1.mysqldump介绍 2.数据导出 3.数据导入 三.load data file进行数据导入导出(只限于单表) 1.数据导出 增加导出权…...
Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】
目录 1.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,列出系统自带的几个重要的方法。2.Unity3D中的碰撞器和触发器的区别?3.物体发生碰撞的必要条件?4.简述Unity3D支持的作为脚本的语言的名称?5. .Net与Mono的关系&#x…...
TIDB的忘了root用户密码和数据库密码解决办法
方法一: 1、修改配置文件重启tidb,无密码登录修改root密码 找到配置文件 tidb.toml ,在[security] 作用域下增加如下配置: [security] skip-grant-tabletrue 重启tidb: sh run_tidb.sh 2、重启后,就可以无密…...
QT基础篇(4)QT5基本对话框
1.标准文件对话框类 在QT5中,可以使用QFileDialog类来创建标准文件对话框。QFileDialog类提供了一些方法和属性,用于选择文件和目录。 常用的方法和属性如下: getOpenFileName():打开文件对话框,选择一个文件。 get…...
Springboot项目Nacos做配置中心
Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…...
SpringSecurity入门demo(三)多用户身份认证
WebSecurityConfigurerAdapter配置文件在 configure(AuthenticationManagerBuilder auth) 方法中完成身份认证。前面的demo都只有一个用户,security中使用UserDetailsService做为用户数据源 ,所以可以实现UserDetailsService 接口来自定义用户。实现方…...
【设计模式-02】Strategy策略模式及应用场景
一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…...
ssh远程登陆
一、ssh远程登陆的概念 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层…...
go如何终止多个for select循环嵌套
空山新雨后,天气晚来秋。 目录 分类说明 总结 分类说明 for select循环嵌套,如何终止?上代码: stop : make(chan struct{})go func() {for i : 1; i < 3; i {fmt.Println("writed ", i)time.Sleep(time.Second * …...
nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施
目录 前言: 一.龙蜥(Anolis)操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make: *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…...
2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景
目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意: 从 Redis 6.2 版本开始,Zset 命…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
