如何通过蓝牙实现ESP32的Web服务器访问?
ESP32通过蓝牙PAN实现Web应用访问
你提到的蓝牙tether本质是利用**蓝牙PAN(个人区域网络)**技术,ESP32完全支持该功能,可以模拟成蓝牙网络网关,让电脑/手机通过蓝牙建立TCP/IP链路,进而访问ESP32上的Web应用。以下是具体实现方案:
核心原理
蓝牙PAN通过BNEP(蓝牙网络封装协议)将TCP/IP数据包封装在蓝牙链路中,ESP32启用蓝牙PAN的AP模式并配置NAT(网络地址转换)后,会为连接的设备分配IP地址,形成一个小型蓝牙内网——和WiFi热点的工作逻辑类似,因此可以直接复用原有的Web服务器代码。
实现步骤
1. 确认环境支持
确保使用的ESP-IDF版本在v4.0及以上(基于ESP-IDF的Arduino ESP32核心,只要是v1.0.6及以上版本即可),该版本原生支持蓝牙PAN功能。
2. 编写蓝牙PAN+Web服务器代码
以下是基于Arduino框架的示例代码,实现蓝牙PAN网关和基础Web服务:
#include <Arduino.h> #include <WebServer.h> #include <esp_bt.h> #include <esp_bt_main.h> #include <esp_gap_bt_api.h> #include <esp_pan.h> #include <esp_netif.h> WebServer server(80); // 根路由响应逻辑 void handleRoot() { server.send(200, "text/html", "<h1>ESP32 Bluetooth Web Server</h1><p>Connected via Bluetooth PAN!</p>"); } void setup() { Serial.begin(115200); // 初始化蓝牙控制器 esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); if (esp_bt_controller_init(&bt_cfg) != ESP_OK) { Serial.println("Bluetooth controller init failed"); return; } if (esp_bt_controller_enable(ESP_BT_MODE_BTDM) != ESP_OK) { Serial.println("Bluetooth controller enable failed"); return; } if (esp_bluedroid_init() != ESP_OK) { Serial.println("Bluedroid init failed"); return; } if (esp_bluedroid_enable() != ESP_OK) { Serial.println("Bluedroid enable failed"); return; } // 创建并配置蓝牙PAN网络接口 esp_netif_t *pan_netif = esp_netif_create_default_wifi_ap(); esp_netif_netstack_config_t netstack_cfg = ESP_NETIF_NETSTACK_DEFAULT_BT_PAN(); esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_BT_PAN_AP(); esp_netif_new(&netif_cfg, &netstack_cfg, pan_netif); // 设置蓝牙设备名称(可自定义) esp_bt_gap_set_device_name("ESP32-BT-Gateway"); // 设置蓝牙为可发现、可连接模式 esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE); // 启动蓝牙PAN服务 if (esp_pan_start() != ESP_OK) { Serial.println("PAN service start failed"); return; } // 配置Web服务器路由 server.on("/", handleRoot); server.begin(); Serial.println("Bluetooth Web Server is running"); } void loop() { server.handleClient(); }
3. 客户端连接与访问
- 安卓设备:打开蓝牙,搜索到
ESP32-BT-Gateway设备并配对,配对成功后进入蓝牙设置,启用该设备的"互联网访问"选项;此时安卓会获取ESP32分配的IP,ESP32的网关IP默认是192.168.4.1,直接在浏览器访问该IP即可。 - Windows电脑:配对蓝牙设备后,进入"网络和共享中心",找到蓝牙网络连接,确认网络连接状态;获取分配的IP后,访问ESP32的网关IP即可。
- Mac电脑:配对蓝牙设备后,系统会自动建立蓝牙网络连接,在网络设置中查看ESP32的网关IP,直接访问即可。
注意事项
- 蓝牙PAN的带宽远低于WiFi,仅适合低流量的Web应用(如控制界面、数据查询),不适合传输大文件或高清视频。
- 部分旧设备可能不支持蓝牙PAN功能,需确保客户端设备支持BNEP协议。
- 若需要密码配对,可以通过
esp_bt_gap_set_pin函数设置蓝牙配对密码。
内容的提问来源于stack exchange,提问作者dronus




