如何从ESP获取回调并通过flutter_blue_plus识别LED开启状态
解决flutter_blue_plus读取ESP32 LED状态的问题
我正在使用flutter_blue_plus库,调用read.characteristic()方法时,要么得到ESP32返回的列表数据(转换为字符串存在问题),要么得到[0,0]。目前已成功向ESP写入数据,需要了解如何识别特定LED的开启状态。相关参考:ESP32开发板、Serial Bluetooth Terminal应用(配图显示终端通过指令交互获取LED状态,例如输入查询指令后返回明确的开关状态标识)
一、修复列表转字符串的问题
read.characteristic()返回的是List<int>类型的字节数据,转换字符串时要匹配ESP32的编码逻辑:
- 如果ESP32以UTF-8编码发送文本,用
String.fromCharCodes(characteristicValue)完成转换,避免乱码; - 如果返回的是二进制状态值(单字节对应单个LED状态),直接按字节解析,无需转字符串。
二、约定通信协议,明确LED状态识别规则
要准确获取LED状态,必须和ESP32端约定统一的数据格式,推荐两种方案:
方案1:字符串指令式(参考Serial Bluetooth Terminal交互逻辑)
- Flutter端发送查询指令,例如
"LED1_STATUS"; - ESP32端收到指令后,返回固定格式字符串,比如
"LED1:ON"或"LED1:OFF"; - Flutter端解析返回内容判断状态:
List<int> readResult = await characteristic.read(); String response = String.fromCharCodes(readResult); if (response.contains("LED1:")) { bool isLed1On = response.split(":")[1].trim() == "ON"; // 根据状态更新UI或执行逻辑 }
方案2:二进制字节格式(高效低延迟)
- 约定字节索引对应LED:比如第0位字节对应LED1,第1位对应LED2,
1代表开启,0代表关闭; - ESP32端返回
[1,0]即表示LED1开、LED2关; - Flutter端直接读取对应索引值:
List<int> statusBytes = await characteristic.read(); bool isLed1On = statusBytes[0] == 1; bool isLed2On = statusBytes[1] == 1;
三、排查返回[0,0]的异常情况
- 检查ESP32端的蓝牙特征读取回调函数,确保收到读取请求时,返回的是当前LED的真实状态值,而非默认的
[0,0]; - 确认Flutter端读取的特征UUID与ESP32端定义的状态返回特征UUID完全一致;
- 用Serial Bluetooth Terminal测试读取操作,验证ESP32端返回内容是否符合预期,排除硬件端逻辑问题。
内容的提问来源于stack exchange,提问作者pranshul
相关产品推荐
相关产品推荐

