写入BLE特征值前如何确认通信正常?(基于flutter_blue_plus)
Flutter Blue Plus:BLE特征值写入前的可行性确认方案
在执行BLE特征值写入操作前,最佳实践是从连接状态、特征权限、对象有效性三个维度做前置校验,提前拦截无效操作,避免不必要的重试和异常。以下是具体方案和优化后的代码:
关键校验步骤
- 确认设备已稳定连接:检查BLE设备的
connectionState,只有处于BluetoothDeviceState.connected状态时,才执行写入操作。这能避免在断开/连接中状态下发起无效请求。 - 验证特征的写入权限:每个BLE特征都有属性标识,必须确认该特征支持写入(包含
CharacteristicProperty.write或CharacteristicProperty.writeWithoutResponse),否则写入操作从根本上不可行。 - 确保特征对象已初始化:避免使用未完成服务发现的特征对象,建议在设备服务发现完成后缓存特征实例,防止空指针或无效特征导致的异常。
优化后的实现代码
void sendCommand(String command) async { print("SDLTP: writing command [$command] thru BLE"); // 前置校验:提前确认操作可行性 if (bleDevice.connectionState != BluetoothDeviceState.connected) { print("BLE设备未连接,无法执行写入"); return; } if (bleSdltpCommandCharacteristic == null) { print("特征对象未初始化,请先完成服务发现"); return; } final hasWritePermission = bleSdltpCommandCharacteristic!.properties.contains(CharacteristicProperty.write) || bleSdltpCommandCharacteristic!.properties.contains(CharacteristicProperty.writeWithoutResponse); if (!hasWritePermission) { print("该BLE特征不支持写入操作"); return; } const maxRetries = 3; var retry = 0; var writeSuccess = false; do { try { retry++; await bleSdltpCommandCharacteristic!.write(utf8.encode(command)); writeSuccess = true; break; } on PlatformException catch (e) { print("写入平台异常(第$retry次重试):$e"); await Future.delayed(const Duration(milliseconds: 100)); } catch (e) { print("写入失败:$e"); break; // 非平台异常(如逻辑错误)直接终止重试 } } while (retry < maxRetries && !writeSuccess); if (!writeSuccess) { print("已达最大重试次数,写入最终失败"); } }
补充说明
- 前置校验能大幅减少无效的重试逻辑,提升代码效率和用户体验
- 区分
PlatformException和其他异常:平台异常(如临时连接波动)适合重试,而逻辑类异常直接终止即可 - 可根据实际场景调整重试间隔和次数,比如写入较大数据时适当延长间隔,避免丢包
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

