基于flutter_blue_plus实现Flutter与ESP32的BLE数据发送问题
Flutter连接ESP32后发送BLE数据的实现方法
BLE通信的核心是通过服务UUID和可写特征UUID定位到ESP32的接收端点,以下是具体实现步骤:
1. 确认ESP32端的关键UUID
从ESP32的BLE代码中找到你定义的服务UUID和可写特征UUID,或者用BLE扫描器获取这两个值(你已验证接收功能正常,这两个值肯定存在)。
2. 扩展连接逻辑,获取可写特征
修改你原有的连接函数,在连接成功后发现设备服务并筛选出目标可写特征:
import 'dart:convert'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; BluetoothCharacteristic? _writeCharacteristic; // 保存可写特征 Future<bool> connectToDevice(String bleAddress, String targetServiceUuid, String targetCharUuid) async { try { final device = BluetoothDevice(remoteId: DeviceIdentifier(bleAddress)); await device.connect(); print('Connected to $bleAddress'); // 发现设备所有BLE服务 List<BluetoothService> services = await device.discoverServices(); // 筛选目标服务 BluetoothService targetService = services.firstWhere( (service) => service.serviceUuid.toString() == targetServiceUuid, orElse: () => throw Exception('目标服务未找到'), ); // 筛选具备写入权限的目标特征 _writeCharacteristic = targetService.characteristics.firstWhere( (char) => char.characteristicUuid.toString() == targetCharUuid && char.properties.write, orElse: () => throw Exception('可写特征未找到'), ); return true; } catch (e) { print('连接或服务发现失败: $e'); return false; } }
3. 实现数据发送函数
基于获取到的可写特征,编写发送数据的函数:
Future<void> sendDataToESP32(String data) async { if (_writeCharacteristic == null) { print('请先连接设备并获取可写特征'); return; } try { // 将字符串转为Uint8List(编码格式需与ESP32端一致,这里用UTF-8) Uint8List bytes = utf8.encode(data); await _writeCharacteristic!.write(bytes); print('数据发送成功: $data'); } catch (e) { print('数据发送失败: $e'); } }
注意事项
- 替换代码中的
targetServiceUuid和targetCharUuid为ESP32端实际使用的UUID。 - 数据编码需与ESP32的接收逻辑匹配,比如ESP端用ASCII接收的话,就用
ascii.encode(data)。 - 确保ESP32端的特征配置了可写权限(ESP代码中需设置
BLECharacteristic::PROPERTY_WRITE)。
内容的提问来源于stack exchange,提问作者Yolo-cell-hash
相关产品推荐
相关产品推荐

