esp32如何java实现抓包包

我热爱自然,其次是科学和艺术
ESP32 应用实践:ethernet 转 WiFi 实现
Ethernet 转 WiFi 用于实现以太网口的设备通过 WiFi 进行无线互联。将从设备 发出的 802.3 帧数据转化为 802.11 帧数据发送出去,接收到的 802.11 帧数据转换为 802.3 帧数据发送给设备,其跳过了 ESP32 的 lwip,直接在物理层进行了数据的转发,提高了数据转发的效率。
在本 Demo 中,Ethernet 转 WiFi 主要有两种使用方式:STATION 模式和 SOFTAP 模式,
二:硬件准备
实现 Ethernet 转 WiFi 需使用带有 phy 功能的 ESP32 开发板,本 Demo 使用的是 ESP32_Ethernet_v3。对于普通的 ESP32 开发板,想要实现本 Demo 需外接 PHY,目前 ESP32 Ethernt driver 支持的 phy 有 TLK110 和 LAN8720,而在 ESP32_Ethernet_v3 中集成的是 TLK110 。
三:配置说明
3.1 PHY 配置
用户可以在 make menuconfig 中对 PHY 进行配置。如果使用 ESP32_Ethernet_v3 开发板,只需要使用默认配置即可;对于外接 phy 的用户,可以参照
中的要求对 phy 进行修改。
3.2 WiFi 配置
WiFi 的配置主要是为了提高数据的吞吐率,在本 Demo 中,增加了 WiFi RX 和 TX 的 buffer 数量,并调整了 ESP32 的 CPU 时钟,具体优化信息请参照默认配置项 sdkconfig.defaults。
Note: 用户可以根据自己需要通过make menuconfig调整相关参数,但是 STATIC_RX_BUFFER_NUM和 TX/RX BA Window(the size of WiFi Block Ack TX window) 均不要超过 16 ,否则可能会因为内存问题引起 crash,其中这些参数位于 Component config -& Wi-Fi 下。
四:Demo 使用步骤
通过如下方式获取此 Demo
$ git clone
https://github.com/espressif/esp-iot-solution
$ cd esp-iot-solution
$ git submodule update --init --recursive
本 Demo 位于 esp-iot-solution/examples/eth2wifi 下,Demo 提供了 ethernet 转 WiFi 的两种模式:ESP32 作为 STATION 模式和 ESP32 作为 SOFTAP 模式。
4.1 STATION 模式
STATION 模式是设备将 Ethernet 帧数据转化为 WiFi station 帧数据,然后将 WiFi station 数据无线发送给 AP ,从而实现类似于无线网卡的功能。
a) 使用 USB 转串口线将开发板连接到 PC 上
b) 进入 esp-iot-solution/examples/eth2wifi 所在目录
c) 选择配置
$ make menuconfig
在 Serial flasher config - Default serial port 中,配置需要下载的串口
在 Component config - IoT Example - Ethernet to WiFi Demo Configuration - The SSID for demo 中设置 SSID
在 Component config - IoT Example - Ethernet to WiFi Demo Configuration - The PASSWORD for demo 中设置 WiFi 密码
在 Component config - IoT Example - Ethernet to WiFi Demo Configuration - WiFi station mode 中,输入 y,选择 STA 模式(默认即为 Y )
d) 编译并烧录程序
$ make flash
烧录成功后,打开串口工具,此时会打印 log,根据 SSID 连接 AP,然后 PC 会发起 DHCP 请求
查看是否拿到 IP,并尝试 ping 网关来测试是否正常
4.2 SOFTAP 模式
SOFTAP 模式是利用 ESP32 所属的设备作为一个 AP,从而可以组建一个小型的局域网,因为交互需要 IP 信息,所以需要设备具备 DHCP Server 的能力,在本 Demo 中,使用 PC 来作为 DHCP Server。
4.2.1 Ubuntu DHCP server 配置
Ubuntu 配置 dhcp 服务器需要:计算机设置静态 ip ,(充当 dhcp 服务器的计算机的 ip 需要是静态 ip,不可以是通过动态获得,设置静态 ip 需要设置在对应的网卡:如 eth0 )设置子网掩码,默认网关,以及配置 dhcp。
a) PC 设置静态 ip/子网掩码/网关
静态 ip 的配置:
设置–&系统设置–&网络–&选项–& ipv4 –&方法:手动;添加–& address, subnet, netmask.
我设置的静态ip地址:192.168.5.0,子网掩码:255.255.255.0,网关:192.168.5.1。
$ sudo vim /etc/network/interfaces
设置成如下内容:
iface lo inet loopback
iface eth0 inet static
address 192.168.5.0
gateway 192.168.5.1
netmask 255.255.255.0
Note: eth0 是测试 PC 上的网卡名称,不同的电脑网卡名称不同,可通过 ipconfig 查看,替换成自己的网卡名称即可
配置完成后重启网络服务:
sudo /etc/init.d/networking restart
b) 配置 DHCP 服务器
首先安装 DHCP 服务器
$ sudo apt-get install isc-dhcpd-server
配置 DHCP 的网卡
$ sudo vim /etc/default/isc-dhcp-server
设置使用网卡(我的是 eth0 )作为 DHCP Server
$ INTERFACES = "eth0"
编辑当前配置
$ sudo vim /etc/dhcp/dhcpd.conf
在文件末尾添加如下几项
subnet 192.168.5.0
netmask 255.255.255.0 {
range 192.168.5.0 192.168.5.100;
option domain-name-servers 210.30.100.2;
option domain-name "internal.example.org";
option routers 172.6.1.1;
option broadcast-address 192.168.5.255;
default-lease-time 600;
max-lease-time 7200;
配置完成后,重启 dhcp 服务:
$ sudo /etc/init.d/isc-dhcpd-server restart
Note: /etc/dhcp/dhcpd.conf中的 subnet 一定要包含 server 本机的 ip 在内,否则启动不了
最后可以通过 ifconfig eth0 查看是否静态 IP 设置成功
c) 烧写步骤
烧写 softap 的步骤与 STA 基本相同,只需要在第 4 步时将 Ethernet to wifi station forwarding data 设置为 n 即为 softap 模式。
将 ESP32 连接到 PC 设备上,确保 PC 设备已经开启了 DHCP Server,配置方法请参照前文 Ubuntu 配置 DHCP server
给 ESP32 上电,并打开 PC 上的串口工具,此时串口会打印 log
用手机连接 ESP32 的 SSID(默认为 DEMO_TEST),成功后会在步骤 2 中打印 STA 连接成功的 Log
尝试 ping 手机拿到的 IP 地址测试是否正常
五:核心代码分析
5.1 事件处理
ESP32 代码中将网络中的各种状态全部封装成了事件,所以 Ethernet 转 WiFi 的核心是网络事件( Event )的处理;在本次 Demo 中,主要做了如下事件的处理:
static esp_err_t event_handler(void* ctx, system_event_t* event)
switch (event-&event_id) {
case SYSTEM_EVENT_STA_START:
printf("SYSTEM_EVENT_STA_START\r\n");
case SYSTEM_EVENT_STA_CONNECTED:
printf("SYSTEM_EVENT_STA_CONNECTED\r\n");
wifi_is_connected = true;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, (wifi_rxcb_t)tcpip_adapter_sta_input_eth_output);
对于 SYSTEM_EVENT_STA_START 事件,我们并没有进行常见的 esp_wifi_connect() 操作,而是放在 Ethernet task 中进行,这么做主要是为了获取 PC 的 MAC 地址,然后将 sta 的 MAC 替换为 PC 的 MAC。
对于 SYSTEM_EVENT_STA_CONNECTED 事件,ESP32 连接上 AP 后,会进入此事件,在一般的网络交互中,此时开始进行 DHCP 请求操作,但因为此时 ESP32 只是作为一个管道,所以在这里我们并不是将数据抛给 lwip 而是将数据“窃取”并转发 给 Ethernet。
case SYSTEM_EVENT_STA_GOT_IP:
printf("SYSTEM_EVENT_STA_GOT_IP\r\n");
case SYSTEM_EVENT_STA_DISCONNECTED:
printf("SlYSTEM_EVENT_STA_DISCONNECTED\r\n");
wifi_is_connected = false;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, NULL);
esp_wifi_connect();
对于事件 SYSTEM_EVENT_STA_GOT_IP ,好吧,这个事件在这个 Demo 是不会被触发了,因为我们没使用 lwip 中的 DHCP client 功能。
当事件 SYSTEM_EVENT_STA_DISCONNECTED 被触发,我们要做的是让 Ethernet 收到的数据将不会通过 WiFi 进行转发,同时重连网络。
case SYSTEM_EVENT_AP_STACONNECTED:
printf("SYSTEM_EVENT_AP_STACONNECTED\r\n");
wifi_is_connected = true;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, (wifi_rxcb_t)tcpip_adapter_ap_input_eth_output);
case SYSTEM_EVENT_AP_STADISCONNECTED:
printf("SYSTEM_EVENT_AP_STADISCONNECTED\r\n");
wifi_is_connected = false;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, NULL);
作为 AP 时事件处理和 STA 相同,区别是这里设置为 AP 模式,而不是 STA 模式。
case SYSTEM_EVENT_ETH_CONNECTED:
printf("SYSTEM_EVENT_ETH_CONNECTED\r\n");
ethernet_is_connected = true;
case SYSTEM_EVENT_ETH_DISCONNECTED:
printf("SYSTEM_EVENT_ETH_DISCONNECTED\r\n");
ethernet2wifi_mac_status_set(false);
ethernet_is_connected = false;
Ethernet 事件的处理主要是探测以太网是否连接或者断开,同时在断开时,ethernet2wifi_mac_status_set 还要置为 false,以保证下次重新连接时重新替换 sta 的 mac 地址。
5.2 MAC地址设置
因为 Ethernet 转 WiFi 牵涉到 3 个 MAC(PC、Etherner 和 STA/AP ),而网络很多操作需要校验 MAC,为了确保在网络交互时 MAC 还能保持 PC 的 MAC,在本 Demo 中将 STA 的 MAC 设置为 PC 的 MAC。
if (!ethernet2wifi_mac_status_get()) {
memcpy(eth_mac, (uint8_t*)msg.buffer + 6, sizeof(eth_mac));
ESP_ERROR_CHECK(esp_wifi_start());
#ifdef CONFIG_ETH_TO_STATION_MODE
esp_wifi_set_mac(WIFI_IF_STA, eth_mac);
esp_wifi_connect();
esp_wifi_set_mac(WIFI_IF_AP, eth_mac);
ethernet2wifi_mac_status_set(true);
在 SYSTEM_EVENT_ETH_CONNECTED 事件被触发之后,PC 开始发送包含 MAC 地址的网络数据,如下图所示:
我们截取之后将 STA 的 MAC 地址设置为 PC 的 MAC 地址,此时再连接 AP,并将状态置为 true,以避免下次 PC 发送数据时重复设置 MAC。
在连接到 AP 之后,PC 再进行 DHCP 请求时,sta 就会使用 PC的 MAC 地址和 AP 进行交互,以此保证正常通讯。
六:性能指标分析
我们使用了 iperf 对吞吐率进行了简单的测试,在开放工作环境下,其 TCP 吞吐量稳定在 45Mbps 左右。但周围环境会对 WiFi 吞吐量造成较大影响,在环境较差时,WiFi 吞吐量可能会下降。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!ESP32 模块入门
拿到32模块,焊上转接板,忙一晚上,已经可以工作。过程整理一下发给大家参考。
请看附件“接线”,按照说用说明书来就可,注意是芯片rt接串口的xt,xt接rt,说明给弄错了。注意独立供电;电源、usb转串口、模块共地;检查按钮与针脚是否虚焊,特别是GND;en与3.3V之间要有5k~20k的电阻,我用的是10k。
进入安信可wiki,, 下载固件
进入乐鑫官网
下载烧写工具
打开烧写工具,选择esp32。选择要烧写的固件并进行设置,如附件“设置”所示,注意串口选自己usb转串口的com口。
长按Io0 按钮,点击软件的start,显示等待同步,再按一下reset按钮,就会开始下载。这个过程中我一直按Io0,也有人说可以松开。大约一分钟后烧写完毕。
打开串口调试工具,选择串口,比特率115200,连接。按一下reset 键,有信息显示,见附件图片“串口信息”,固件应该是正常工作了。
自己编译固件,使用安信可和乐鑫的编译环境,可以参考“ESP32 编译参考”
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!我热爱自然,其次是科学和艺术
ESP32 编译和调试
简单介绍利用 OpenOCD+JTAG 来调试一个demo程序的步骤和说明。
前提条件:
已经理解并完成。
1. 串口线连接好 ESP-WROVER-KIT 和 PC,并将开关调至 ON.
2. 将本目录下的 hello_world_main.c 覆盖 esp-idf/examples/01_hello_world/main/hello_world_main.c 文件
3. 进入example目录(设当前shell 为 shell A):
$ cd ~/esp/esp-idf/examples/01_hello_world
4. 编译程序并烧入ESP32
$ make flash
5. 新建一个shell,并进入 openOCD 目录(设当前shell 为 shell B):
$ cd ~/esp/openocd-esp32
6. OpenOCD和程序通讯:这步 操作之间必须连贯,不能停顿太多。(否则程序会执行到末尾,无法调试)
6.1 将ESP-WROVER-KIT开关从 ON -& OFF -& ON
6.2 shell B 启动openocd:
$ sudo ./src/openocd -s ./tcl -f ./esp32.cfg
or [esp32.cfg 如果更新,则使用下面]
$ cp ../esp-idf/docs/esp32.cfg ./ ; sudo ./src/openocd -s ./tcl -f ./esp32.cfg
7. shell A 启动gdb:
$ xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/hello-world.elf
shell A端gdb调试一些说明
大概可以仿照如下调试:
b hello_task
display /i $pc
常用调试命令小结:
断点相关:
b hello_task
b *hello_task+9
info breakpoints
b 28 if i == 2
执行相关:
源码相关:
list app_main
list 20,40
显示相关:
display /i $pc
x /3uh buf
布局相关:
layout asm
layout regs
layout src
layout prev
layout next
线程和进程:
info threads
info inferiors
inferior i
查看其他调试命令:
静态调试-反汇编
我们更加方便的调试,我们可以反汇编二进制文件,这样更加清楚的显示所有汇编代码并查找分析编辑。
生成汇编代码步骤:(前提已经编译完成)
1. 进入hello-world目录:
$ cd ~/esp/esp-idf/examples/01_hello_world
2. 拷贝 elf 文件:
$ cp ./build/hello-world.elf ./
3. 生成汇编文件:
$ xtensa-esp32-elf-objdump -S hello-world.elf & compile_info.txt
[4] 我们在gdb调试时候,可以看到执行位置的地址。在汇编文件compile_info.txt中查找该地址,就可以分析。
1. 运行 sudo ./src/openocd -s ./tcl -f ./esp32.cfg 中如果不能启动,出现如下错误
Error: couldn’t bind tcl to socket: Address already in use
则证明 刚刚启动的 进程未被终止。
解决办法:
a).查看当前活动进程
netstat为显示网络相关信息
a(all:默认显示所有,如果加了其他选项此项不生效) n(number:以数字形式显示) t(仅仅显示tcp连接),p(process:显示该项是由哪个程序建立起来的)
$ sudo netstat -antp
b). 强制杀死它(假设进程号为3560,-9为强制杀死)
$ sudo kill -9 3560
2. make flash失败
确保串口连接正常, ll /dev/ttyUSB*
应该可以看到两个设备 ttyUSB0 ttyUSB1.如果不是,则 重置ESP-WROVER-KIT开关:从 ON-& OFF -& ON 或者 重新插拔串口线。
3. gdb启动后出现如下错误:
0x in ?? ()
或者 openOCD收到如下错误:
Error: Error allocating memory for
解决办法:
重新擦写flash (flash由于上次没有擦除干净)
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!快捷开发 任性连接 :ESP32 Thing开发板评测
作者:zhanzr21
ESP32 Thing是SparkFun推出的一款针对物联网无线应用的开发板,它的体积较小,具备WiFi与蓝牙的双重连接方式,并且可以通过Arduino IDE来开发。
1.简介, 外观与资源
是Sparkfun最新推出的一款WiFi+BLE的开发板,专门面向IoT类的应用.由于拥有WiFi与蓝牙(双模)的双重连接方式,所以给开发者的创意余地非常丰富.最令人兴奋的是这个开发板可以使用Arduino
IDE来开发.这里跟大家分享一下此开发的使用体验,以及如何设置开发环境并使用它来开发你的下一个IoT应用.
因为开发板本身非常小巧,并无专门的箱子,这里就没有开箱图了.直接上板子的图:
图 和Uno板子放在一起
和Arduino Uno放在一起的感觉有点奇怪的感觉,功能多了N多,尺寸却小了这么多.
图 Mouser发货单
这是Mouser的发货单,发货单只是提到是个WiFi开发板没有提到蓝牙.
板子的资源如下:
& 双核的Tensilica LX6 处理器
& 最高运行频率240MHz
& 520kB内部SRAM
& 集成802.11 BGN WiFi 收发器
& 集成双模蓝牙 (经典和 BLE)
& 2.2 -3.6V 工作电压
& 2.5 &A 深睡眠电流
& 28个GPIO
& 10电极电容式触摸控制
& 硬件加速加密 (AES, SHA2, ECC, RSA-4096)
& 4MB外部Flash
& 集成锂电池充电电路
这里将资源与板子简单对应一下子:
图 资源对应
下面是主要部分的特写:
USB转串口:供电+下载
这是Sparkfun提供的引脚扩展分配图:
图 引脚扩展图
2.硬件与原理图简析
硬件方面,首先ESP32 SOC比较令人感兴趣.这里做个简单介绍.
2.1 ESP32简介
这是上海乐鑫出的一款ESP8266的升级版本.从数据手册来看此SOC的核心为:
& Xtensa& 双核 32位 LX6 处理器, 频率最高 240 MHz, 性能最高600 DMIPS(ESP8266的内核是单核的Tensilica
LX106,最高80MHz)
每个核都支持:
& 7级流水线
& 16/24位两种指令集
& DSP指令,比如32位乘法器,32位除法器,40位MAC
& 70个中断源,32个向量
外设与无线接口这里就不详列了,读者可以参考数据手册.
Xtensa LX6及其系列产品使用的是Xtensa公司的一款专门为无线与多媒体应用优化设计的内核. 这个公司2013年被Cadence收购.
简而言之,这个处理器优化原理就是类似于ASIC与通用处理器之间的一个中间路线:
有一个通用的架构,也有一些可配置单元,在综合成最终处理器时去除不需要的部分,从而实现了成本尺寸性能几个方面很好的优化.
图 Xtensa LX vs通用处理器
关于这个内核的详情这里就不多展开了, 感兴趣的可以看文章后面的参考连接.
这是ESP32的Block图:
图 ESP32 SOC功能Block图
除了无线方面很强大之外,其他外设几乎也是应有尽有.摄像头接口与外部动态存储器接口是作者第一眼望过去能举出的没有的外设.
原理图的整个文件将在后面附上连接. 这里就分析其中两点:
2.2 USB与充电部分
图 USB+LDO部分
&&&1&&&&&&
本文系21ic原创,未经许可禁止转载!
联系人:巧克力娃娃
欢迎入驻,开放投稿ESP32 AT 指令集与使用示例 | 乐鑫}

我要回帖

更多关于 抓包工具的设计与实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信