You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

内容的提问来源于stack exchange,提问作者MikiS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:45:05