Arduino Nano 33 BLE无法接收Flutter应用发送的BLE数据问题排查
Flutter BLE写入无数据问题排查方案
问题代码(修改后参考示例)
import 'package:control_pad/control_pad.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:flutter/material.dart'; final flutterReactiveBle = FlutterReactiveBle(); late QualifiedCharacteristic c; // 新增连接状态标记 bool isConnected = false; Future<void> main() async { runApp(const MaterialApp( title: 'Control Pad Example', home: FirstRoute(), )); } class FirstRoute extends StatelessWidget { const FirstRoute({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('car'), actions: [ IconButton( constraints: const BoxConstraints.expand(width: 80), onPressed: () async { print("pressed"); // 注意:确认此处UUID与Arduino端定义的自定义服务/特征UUID完全一致,不要误用公共服务UUID var serviceUuid = Uuid.parse("0000180a-0000-1000-8000-00805f9b34fb"); var characteristicUuid = Uuid.parse("00002a57-0000-1000-8000-00805f9b34fb"); var foundDeviceId = 'FB:DF:BF:CD:83:26'; flutterReactiveBle.connectToDevice( id: foundDeviceId, connectionTimeout: const Duration(seconds: 5), ).listen((state) async { if (state.connectionState == DeviceConnectionState.connected) { print("connected"); isConnected = true; await flutterReactiveBle.requestConnectionPriority( deviceId: foundDeviceId, priority: ConnectionPriority.highPerformance); c = QualifiedCharacteristic( serviceId: serviceUuid, characteristicId: characteristicUuid, deviceId: foundDeviceId); } else if (state.connectionState == DeviceConnectionState.disconnected) { isConnected = false; } }, onError: (e) { print("连接错误:$e"); }); }, icon: const Text("BLE", textAlign: TextAlign.center), ), ], ), body: JoystickView( onDirectionChanged: (double x, double y) async { print('$x, $y'); // 新增状态判断,避免未初始化就调用写入方法 if (!isConnected) { print("设备未连接,跳过写入"); return; } try { // 先尝试用带响应的写入方法测试 await flutterReactiveBle.writeCharacteristicWithResponse(c, value: [0x01]); print("写入成功"); } catch (e) { print("写入错误:$e"); } }, ), ); } }
排查清单
- 特征写入类型匹配问题:确认Arduino端配置该特征时开启了
Write Without Response权限,若开启的是普通Write权限,需将写入方法替换为writeCharacteristicWithResponse。LightBlue工具会自动匹配特征支持的写入类型,不会出现类型不匹配问题。 - 变量初始化时序问题:原代码未判断连接状态和特征是否初始化,若连接未完成就触发摇杆写入,会直接出现空引用异常导致写入失败,新增连接状态标记和写入前判断逻辑可解决该问题。
- 异常捕获遗漏问题:原代码未捕获写入过程的异常,权限不足、特征不存在、连接中断等问题都会导致写入静默失败,添加try catch后可通过日志快速定位错误原因。
- UUID误用问题:你当前使用的
0000180a是BLE标准的设备信息服务UUID,该服务下的特征一般为只读属性,不支持写入操作。确认你Arduino端自定义的服务和特征UUID,替换为自己定义的UUID值,不要使用标准公共服务的UUID。 - 平台权限配置问题:
- Android端需在
android/app/src/main/AndroidManifest.xml中添加蓝牙相关权限:BLUETOOTH_SCAN、BLUETOOTH_CONNECT、ACCESS_FINE_LOCATION - iOS端需在
ios/Runner/Info.plist中添加蓝牙使用说明:NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription
- Android端需在
内容的提问来源于stack exchange,提问作者MikiS
相关产品推荐
相关产品推荐

