保姆级教程:用APP Inventor的BluetoothLE插件搞定ESP32 BLE通信(附完整代码)

张开发
2026/4/18 6:40:17 15 分钟阅读

分享文章

保姆级教程:用APP Inventor的BluetoothLE插件搞定ESP32 BLE通信(附完整代码)
零基础实战用APP Inventor蓝牙插件玩转ESP32 BLE控制当你手里拿着一块ESP32开发板想用手机APP控制它点亮LED或者读取传感器数据时BLE低功耗蓝牙通信无疑是最便捷的选择。但对于初学者来说从零开始搭建整个通信链路可能会遇到各种坑UUID配置错误、数据格式不匹配、事件注册遗漏...本文将带你一步步绕过这些雷区用最直观的方式实现手机与ESP32的对话。1. 环境准备与工具链搭建在开始之前我们需要准备好两个核心工具APP Inventor开发环境和ESP32开发环境。这两者的组合就像搭建一座连接手机和硬件的桥梁。APP Inventor准备访问MIT APP Inventor官网并登录推荐使用Google账号新建项目命名为ESP32_BLE_Controller在项目面板中点击Extensions搜索并添加BluetoothLE插件ESP32开发环境安装Arduino IDE1.8.x或更高版本在首选项中添加ESP32开发板管理URLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json通过开发板管理器安装esp32平台提示BluetoothLE插件是APP Inventor社区开发的第三方扩展它专门为BLE设备通信设计与传统蓝牙插件不兼容。这也是为什么直接使用内置蓝牙组件无法连接ESP32的原因。2. BLE通信基础与UUID配置理解BLE通信的基本架构是避免后续配置错误的关键。一个典型的BLE连接包含三个核心要素要素作用示例值Service UUID定义设备提供的服务类型4fafc201-1fb5-459e-8fcc-c5c9c331914bCharacteristic UUID定义服务下的具体数据特征beb5483e-36e1-4688-b7f5-ea07361b26a8Descriptor UUID描述特征的附加信息可选00002902-0000-1000-8000-00805f9b34fb在APP Inventor中配置这些参数时需要确保与ESP32端的代码完全一致。一个常见的错误是使用了不同的UUID格式如有的带连字符有的不带这会导致设备无法被发现或连接失败。// ESP32端的UUID设置示例 #define SERVICE_UUID 4fafc201-1fb5-459e-8fcc-c5c9c331914b #define CHARACTERISTIC_UUID beb5483e-36e1-4688-b7f5-ea07361b26a83. APP Inventor界面设计与事件处理现在我们来构建手机APP的用户界面和逻辑。这个界面将包含设备扫描、连接控制和数据发送三个主要功能区域。界面组件布局1个ListPicker用于显示和选择BLE设备1个Button扫描设备1个Label显示连接状态1个TextBox输入要发送的数据1个Button发送数据关键事件处理逻辑当用户点击扫描按钮时调用BluetoothLE1.StartScanning方法设备发现后更新ListPicker的选项连接成功后自动触发Connected事件必须在此注册数据接收处理// APP Inventor块编程示例 当 BluetoothLE1.Connected 设置 BluetoothLE1.SubscribeToCharacteristic 服务UUID 4fafc201... 特征UUID beb5483e... 设置 Label1.Text 为 已连接 结束注意Connected事件是BLE连接建立后的第一个关键点很多初学者会忘记在这里注册数据接收处理SubscribeToCharacteristic导致后续无法接收ESP32发送的数据。4. ESP32端BLE服务实现ESP32作为BLE服务器需要广播服务并处理来自手机的读写请求。以下是实现基本功能的完整代码框架#include BLEDevice.h #include BLEUtils.h #include BLEServer.h BLECharacteristic *pCharacteristic; bool deviceConnected false; class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected true; } void onDisconnect(BLEServer* pServer) { deviceConnected false; } }; class MyCallbacks: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string value pCharacteristic-getValue(); if (value.length() 0) { Serial.println(Received: ); for (int i 0; i value.length(); i) Serial.print(value[i]); Serial.println(); } } }; void setup() { Serial.begin(115200); BLEDevice::init(ESP32_BLE_Device); BLEServer *pServer BLEDevice::createServer(); pServer-setCallbacks(new MyServerCallbacks()); BLEService *pService pServer-createService(SERVICE_UUID); pCharacteristic pService-createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY ); pCharacteristic-setCallbacks(new MyCallbacks()); pService-start(); BLEAdvertising *pAdvertising BLEDevice::getAdvertising(); pAdvertising-addServiceUUID(SERVICE_UUID); pAdvertising-setScanResponse(true); pAdvertising-setMinPreferred(0x06); pAdvertising-setMinPreferred(0x12); BLEDevice::startAdvertising(); Serial.println(Waiting for a client connection...); } void loop() { if (deviceConnected) { // 可以在此处添加定期发送数据的逻辑 delay(1000); } }5. 数据格式处理与常见问题排查在BLE通信中数据格式的一致性至关重要。APP Inventor和ESP32必须就数据类型达成一致否则会出现乱码或解析失败。以下是几种常见的数据格式处理方式字符串传输APP Inventor端直接发送文本ESP32端使用getValue()获取std::string字节数组传输APP Inventor端使用BluetoothLE1.WriteBytes方法ESP32端通过pCharacteristic-getData()获取uint8_t数组常见问题排查清单设备无法发现检查ESP32是否在广播状态查看串口输出确认手机蓝牙已开启确保没有其他设备占用了相同的UUID连接后立即断开检查Service和Characteristic UUID是否匹配确认ESP32端的服务已正确启动pService-start()数据接收不全或乱码两端使用相同的数据格式同为字符串或字节数组检查发送和接收的编码格式推荐使用UTF-86. 实战案例手机控制ESP32 LED让我们通过一个具体案例来整合前面学到的知识——用手机APP控制ESP32板载LED的开关。ESP32端新增代码// 在setup()中添加 pinMode(LED_BUILTIN, OUTPUT); // 在MyCallbacks类的onWrite方法中添加 if (value ON) { digitalWrite(LED_BUILTIN, HIGH); } else if (value OFF) { digitalWrite(LED_BUILTIN, LOW); }APP Inventor界面调整添加两个按钮分别设置其文本为开灯和关灯按钮点击事件分别发送ON和OFF字符串当 按钮开灯.点击 调用 BluetoothLE1.WriteString 服务UUID 4fafc201... 特征UUID beb5483e... 值 ON 结束 当 按钮关灯.点击 调用 BluetoothLE1.WriteString 服务UUID 4fafc201... 特征UUID beb5483e... 值 OFF 结束在实际测试中我发现当通信距离超过10米时BLE连接会变得不稳定。这时可以通过增加ESP32的发射功率来改善// 在setup()中startAdvertising之前添加 esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV, ESP_PWR_LVL_P9); esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_SCAN, ESP_PWR_LVL_P9);

更多文章