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

使用Flutter通过蓝牙接收OBD-II扫描仪数据时扫描无结果求助

问题解决方案

1. 权限适配修复

  • 安卓12及以上版本新增了蓝牙相关权限,你当前的manifest配置仅适配安卓11以下版本,需要补充以下权限:
<!-- 安卓12+ 蓝牙扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<!-- 安卓12+ 蓝牙连接权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 安卓10及以上需要精确定位权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  • 不能仅静态声明权限,必须在应用启动后、扫描前动态申请所有相关权限,可以使用permission_handler包完成动态申请逻辑。

2. 依赖包替换

你使用的Flutter Blue包已经停止维护多年,对新系统版本的兼容性极差,建议替换为社区维护的分叉版本flutter_blue_plus,其API和原Flutter Blue基本一致,无需大量修改代码即可适配新系统。

3. 扫描逻辑优化

当前扫描逻辑存在监听时机问题,可能导致扫描结果丢失,修改后的扫描逻辑参考:

scan() async {
  if (!_isScanning) {
    scanResultList.clear();
    // 先注册扫描结果监听,再启动扫描
    final scanSubscription = flutterBlue.scanResults.listen((results) {
      scanResultList = results;
      setState(() {});
    });
    // 扫描时长从4秒改为8秒,适配低广播频率的OBD设备
    await flutterBlue.startScan(timeout: Duration(seconds: 8));
    // 扫描结束后取消监听
    scanSubscription.cancel();
  } else {
    await flutterBlue.stopScan();
  }
}

4. 蓝牙类型适配确认

绝大多数入门级OBD-II扫描仪采用的是经典蓝牙(SPP协议),而非BLE蓝牙,Flutter Blue系列包仅支持BLE设备,若你的设备是经典蓝牙,需替换为flutter_bluetooth_serial包进行连接开发。

5. 数据流读取方案

  • 若为BLE设备:连接成功后遍历服务找到对应收发数据的特征值(一般名为TX/RX,常用固定UUID为0000ffe1-0000-1000-8000-00805f9b34fb),向TX特征值写入OBD指令(如010D\r读取车速),监听RX特征值的返回数据后按OBD协议解析即可。
  • 若为经典蓝牙:连接成功后获取输入输出流,直接通过流写入指令、读取返回结果解析即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:04