ESP32 应用实践:ethernet 转 WiFi 实现

2023-05-16

一:简介

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 。

image

image

三:配置说明

3.1 PHY 配置

用户可以在 make menuconfig 中对 PHY 进行配置。如果使用 ESP32_Ethernet_v3 开发板,只需要使用默认配置即可;对于外接 phy 的用户,可以参照 Ethernet Demo 中的要求对 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 )

esp

d) 编译并烧录程序

$ make flash

e) 运行

  1. 烧录成功后,打开串口工具,此时会打印 log,根据 SSID 连接 AP,然后 PC 会发起 DHCP 请求

  2. 查看是否拿到 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

设置成如下内容:

 auto lo
 iface lo inet loopback
 auto eth0
 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 模式。

d) 运行

  1. 将 ESP32 连接到 PC 设备上,确保 PC 设备已经开启了 DHCP Server,配置方法请参照前文 Ubuntu 配置 DHCP server
  2. 给 ESP32 上电,并打开 PC 上的串口工具,此时串口会打印 log
  3. 用手机连接 ESP32 的 SSID(默认为 DEMO_TEST),成功后会在步骤 2 中打印 STA 连接成功的 Log
  4. 尝试 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");
            break;

        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");
            break;

        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();
            break;

对于事件 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);
            break;

        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);
            break;

作为 AP 时事件处理和 STA 相同,区别是这里设置为 AP 模式,而不是 STA 模式。

        case SYSTEM_EVENT_ETH_CONNECTED:
            printf("SYSTEM_EVENT_ETH_CONNECTED\r\n");
            ethernet_is_connected = true;
            break;

        case SYSTEM_EVENT_ETH_DISCONNECTED:
            printf("SYSTEM_EVENT_ETH_DISCONNECTED\r\n");
            ethernet2wifi_mac_status_set(false);
            ethernet_is_connected = false;
            break;

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();
#else
   esp_wifi_set_mac(WIFI_IF_AP, eth_mac);
#endif
   ethernet2wifi_mac_status_set(true);
 }

在 SYSTEM_EVENT_ETH_CONNECTED 事件被触发之后,PC 开始发送包含 MAC 地址的网络数据,如下图所示:

image

我们截取之后将 STA 的 MAC 地址设置为 PC 的 MAC 地址,此时再连接 AP,并将状态置为 true,以避免下次 PC 发送数据时重复设置 MAC。
在连接到 AP 之后,PC 再进行 DHCP 请求时,sta 就会使用 PC的 MAC 地址和 AP 进行交互,以此保证正常通讯。

六:性能指标分析

我们使用了 iperf 对吞吐率进行了简单的测试,在开放工作环境下,其 TCP 吞吐量稳定在 45Mbps 左右。但周围环境会对 WiFi 吞吐量造成较大影响,在环境较差时,WiFi 吞吐量可能会下降。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 应用实践:ethernet 转 WiFi 实现 的相关文章

  • nginx环境wordpress 固定链接实现…

    开始几次设置wordpress的固定链接都没成功 xff0c 今天做松子价格网时不甘心 xff0c 试了几次OK了 其实nginx环境下设置wordpress固定链接 xff08 也叫伪静态 xff09 非常简单 xff08 我是用的是wo
  • 如何使用vb.net多线程

    可能一些小程序用不上 xff0c 单线程就可以完成 xff0c 但是很多程序往往需要多个线程同时操作 xff0c 或者用辅助线程来完成主线程的工作 xff0c 多线程对于一个程序员来说是一个必须逾越的槛 最近在写一个程序 xff0c 设备要
  • 准备自己做块飞控,先看看方案

    主要参考是CC3D和crazyflie 2 0 xff0c 双CPU xff1a STM32F405RG xff0c 和STM32F103相比 xff0c 支持浮点运算 xff0c 168MHz xff0c 片上存储空间大 xff0c 考虑
  • 转:如何获取某人的所在物理位置

    如何获取某人的所在物理位置 xff1f xff08 andorid手机GPS 基站定位 JSON获取基站定位信息 xff09 原文地址 xff1a http cyad blog 163 com blog static 54368792011
  • Excel“工程不可查看”及VBA工程密码…

    一 Excel 工程不可查看 两种实现方法及破解 关于Excel宏编程中 xff0c 要用到一些技巧 xff0c 如破解Excel宏加密 今天我对一个Excel宏编程中进行日期限制进行了破解 方法一 xff08 共用级锁定 xff09 1
  • vba给数组赋值

    39 向VBA数组中写入数据 39 1 按编号 标 写入和读取 Sub t1 39 写入一维数组 Dim x As Integer Dim arr 1 To 10 arr 2 61 190 arr 10 61 5 End Sub
  • 中兴光猫配置文件获取方法

    中兴光猫配置文件获取方法 http 192 168 1 1 manager dev config t gch 有些配置文件加密了 xff0c 还不好破解 网上有超级牛帖子 xff0c 不过想在好像web shell也关闭了 http www
  • wget下载百度网盘文件

    分享一下wget下载百度网盘文件 有些时候需要从网盘下比较大文件 xff0c 但是linux无法登陆百度网盘 xff08 当然如果使用了API xff09 可以获取下载链接 这里介绍简单的方法 xff0c 直接在百度网盘分享建立公共链接 然
  • sudo aptitude install…

    sudo aptitude install 这个方法可以解决破损包问题 Aptitude will give up less easily and will attempt to find solutions which may invol
  • centos 万兆网卡使用要点

    随着宽带技术的快速发展 xff0c 服务器使用万兆网卡的概率越来越高 最近装了几台服务器都用的万兆网卡 xff0c 为了图便宜 xff0c 网卡和模块都是淘宝上买的 xff0c 这部还真遇到不少问题 我的服务器都是centos6 4 64位
  • 实在受不了360流氓浏览器用了10年终于不用了

    360浏览器 xff0c 恶心广告 xff0c 垃圾软文越来越泛滥了 xff0c 实在让人受不了 用了近10年终于下决心抛弃了 大家看下恶心不 xff0c 天天都是这个
  • ESP-AT 系列: AT+MQTT 使用

    AT 工程 xff1a https github com espressif esp at AT 文档 xff1a https docs espressif com projects esp at zh CN latest MQTT AT
  • ESP8266 常见固件烧写失败原因和解决方法

    简介 在使用 ESP8266 进行开发时 读者或多或少都能遇到固件烧写失败情况 无论是官方提供的 windows 上 Flash 下载工具 还是 SDK 中提供的 esptool py 下面笔者提供几种常见的烧写失败的原因和对应解决方法 原
  • 基于ros的kcf目标跟随

    本文参考的是基于 大神的博客 https blog csdn net yiranhaiziqi article details 53303747 locationNum 61 10 amp fps 61 1 关于kcf追踪的ros库在git
  • ESP-AT 系列: HTTP 客户端功能

    AT 工程 xff1a https github com espressif esp at AT 文档 xff1a https docs espressif com projects esp at zh CN latest 简介 esp a
  • esptool.py 介绍和使用

    一 esptool py 简介 esptool py 是乐鑫提供的开源库工具 xff0c 用于乐鑫 ESP8285 ESP8266 ESP32 ESP32 S等系列芯片和 ROM Bootloader xff08 即 xff1a 一级 bo
  • 如何使用 Gitee 快速搭建 ESP-IDF 开发环境(Windows 版本)

    前言 为更好地服务国内用户 xff0c 构建中文需求沟通平台 xff0c 帮助用户快速下载乐鑫开源代码 xff0c 乐鑫将 GitHub 中的主要仓库 xff08 包含 ESP IDF ESP ADF ESP MDF 以及阿里 腾讯 京东等
  • ESP32-S3-USB-OTG 开发板首发限量预售

    ESP32 S3 USB OTG 开发板新品首发 xff0c 官方淘宝店 现已上新 预售限量 200 个 xff0c 欢迎选购 xff01 开发板搭载 ESP32 S3 MINI 1 N8 模组 xff0c 集成 ESP32 S3 的 EC
  • 乐鑫多系列芯片支持 NuttX 和 Zephyr 操作系统

    乐鑫芯片凭借丰富的功能和广阔的应用 xff0c 在物联网市场广受欢迎 乐鑫还为用户提供了一个物联网开发框架 ESP IDF xff0c 集成大量软件组件 xff0c 包括 RTOS 外设驱动程序 网络栈和多种协议实现技术等 开发者能够在乐鑫
  • 使用 ESP-DL 深度学习库基于 ESP32-S3 实现手势识别

    人工智能改变了计算机与现实世界交互的方式 过去 xff0c 人们通过微小的低功率设备和传感器获取数据 xff0c 并传输至云端进行决策 这样的方式在设备连接性 成本和数据隐私方面带来了一定挑战 相对地 xff0c 边缘人工智能是在物理设备上

随机推荐

  • 乐鑫特权隔离机制

    乐鑫特权隔离机制 本视频演示了如何在乐鑫特权隔离框架中轻松更新用户应用程序 xff1b 使用 ESP RainMaker 移动端 APP xff0c 演示了用户应用程序设备配置的具体过程 xff0c 以及如何进行 OTA 升级 基于乐鑫 S
  • Matter 研讨会回顾(第三期)|乐鑫 Matter 免开发方案与证书服务介绍

    1 月 17 日 xff0c 乐鑫举办了以 乐鑫 Matter 免开发方案与证书服务介绍 为主题的第三期 Matter 线上研讨会 xff0c 介绍乐鑫开箱即用的 ESP ZeroCode 模组及其免开发 Matter 方案 xff0c 以
  • 乐鑫特权隔离机制 #3 | OTA 固件升级

    乐鑫特权隔离机制 系列文章 3 固件空中升级 OTA Over The Air 是任何联网设备的重要功能之一 xff0c 支持开发人员通过远程更新固件 xff0c 以发布新功能或修复错误 乐鑫特权隔离框架中包含两类应用程序 xff1a 受保
  • 基于乐鑫 ESP32 的智能手表

    拥有一块自己制作的智能手表是不是听起来就很酷 xff1f 工程师 Pcadic 基于乐鑫 ESP32 PICO D4 实现了这个想法 xff01 他开发了一款能够与我们的手机或任何其他设备互联的智能手表 ESP32 Pico Watch E
  • Kvaser在linux系统使用小结

    首先需要在Kvaser官网安装linux系统的底层kvaser驱动 xff1b 安装成功之后需要重启电脑 驱动对应网址 xff1a https www kvaser cn downloads Kvaser Linux Drivers and
  • Matter 系列 #9|乐鑫 Matter 预配置服务加速设备生产

    乐鑫 Matter 系列文章 9 目录 Matter 预配置服务 1 设备认证 Device Attestation 2 独特性 Uniqueness 3 安全性 Security 联系我们 如今 xff0c 物联网行业蓬勃发展 xff0c
  • 乐鑫特权隔离机制 #4 | 用户应用程序的安全启动

    乐鑫特权隔离机制 系列文章 4 目录 安全启动 Secure boot 受保护应用程序的安全启动 Secure boot for protected app 用户应用程序的安全启动 Secure boot for user app 基于证书
  • 乐鑫特权隔离机制系列文章

    乐鑫特权隔离机制 1 介绍 通常 xff0c MCU 上运行的应用程序均采用单体式系统 Monolithic System xff0c 即其 用户 内核 是不隔离的 乐鑫的 ESP 特权隔离机制为 MCU 增加了权限管理特性 xff0c 实
  • Espressif-IDE v2.8.0 新增功能及开发方向

    在乐鑫最近发布的 Espressif IDE 2 8 0 版本中 xff0c 我们推出了分区表编辑器和 NVS 分区编辑器功能 xff0c 优化现有调试器的配置功能并修复多项 Bug xff0c 进一步为用户提升了插件质量以及稳定性 用户可
  • ESP Insights 系列文章

    ESP Insights 系列 1 远程查看设备信息 xff0c 快速解决固件问题 ESP Insights 是一个可远程查看设备固件运行状态和日志的平台 xff0c 能够帮助开发人员快速定位并解决固件问题 ESP Insights 系列
  • 乐鑫科技亮相德国嵌入式展 Embedded World 2023!

    3 月 14 日 xff0c 德国纽伦堡嵌入式展 Embedded World 2023 火热启幕 本届 Embedded World 主题为 embedded responsible sustainable xff0c 乐鑫科技 6880
  • 乐鑫 ESP-IoT-Bridge 方案支持设备灵活入网

    观看视频了解 ESP IoT Bridge 联网方案 乐鑫科技推出 ESP IoT Bridge 联网方案 xff0c 能够为物联网应用场景下的 Wi Fi 蓝牙 Thread 以太网 MCU 等设备 xff0c 提供便捷的网络服务 ESP
  • 乐鑫 SoC 支持使用外部 HSM 进行安全签名

    乐鑫 ESP32 系列芯片均采用安全启动机制 xff0c 确保只有可信任固件能够在 flash 中运行 然而 xff0c 这种机制要求小心管理签名密钥 xff0c 即签名密钥必须由签名实体以安全的方式生成和存储 外部 xff08 硬件安全模
  • 乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用

    2023 年全国大学生物联网设计竞赛 xff08 下简称 竞赛 xff09 现已官宣启幕 xff01 乐鑫科技 688018 SH 作为竞赛金牌合作伙伴 xff0c 将为同学们带来基于 AI SoC ESP32 S3 的独立竞赛任务 xff
  • Arduino 即将发布集成乐鑫 ESP32-S3 的 UNO R4

    3 月 25 日 xff0c Arduino 宣布将于 5 月底发布 Arduino UNO 的最新版本 Arduino UNO R4 UNO R4 不仅保持了 UNO 家族的显著特征 xff0c 如标准的外形尺寸 屏蔽兼容性和 5 V 工
  • ROS编译程序缺少串口包

    1 问题 此种情况是缺少ros的串口包 2 解决办法 通过sudo apt get install ros lt distro gt serial下载ROS对应版本的工具包 lt distro gt 为对应ros版本 xff0c 如下 xf
  • 如何在 Espressif-IDE 中使用 Wokwi 模拟器

    乐鑫近期已发布 Espressif IDE v2 9 0 xff0c 您可直接在此版本的 IDE 中使用 Wokwi 模拟器 什么是 Wokwi 模拟器 xff1f Wokwi 是一款在线电子模拟器 xff0c 支持模拟各种开发板 元器件和
  • 使用乐鑫 Web IDE 助力物联网开发

    乐鑫 Web IDE 是基于 Eclipse Theia 的框架 xff0c 支持 ESP IDF VS Code 插件同时具备多项辅助工具 您可以观看我们在 Espressif DevCon22 上的演示视频 xff0c 了解它的实际应用
  • Rust + 嵌入式:强力开发组合

    Rust 的由来 Rust 编程语言的灵感诞生于一次意外 2006年 xff0c 当 Graydon Hoare 回到位于温哥华的公寓时 xff0c 发现电梯又因为软件崩溃出了故障 住在 21 楼的他无奈爬楼时 xff0c 不禁心想 xff
  • ESP32 应用实践:ethernet 转 WiFi 实现

    一 xff1a 简介 Ethernet 转 WiFi 用于实现以太网口的设备通过 WiFi 进行无线互联 将从设备 发出的 802 3 帧数据转化为 802 11 帧数据发送出去 xff0c 接收到的 802 11 帧数据转换为 802 3