使用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
相关产品推荐
相关产品推荐

