使用BLEMingleDroid开发蓝牙通信时,onLeScan接收数据出现附加垃圾字符
看起来你在使用BLEMingleDroid进行BLE广播通信时遇到了接收数据末尾附带垃圾字符的问题,我来帮你排查下可能的原因和解决办法:
1. 字符编码不一致问题
最常见的原因就是发送和接收端使用了不同的字符编码解析字节数组。默认的getBytes()方法会依赖系统默认编码,不同设备可能存在差异,导致解析出多余的乱码字符。
解决办法:
发送和接收时都明确指定统一的编码(比如UTF-8):
// 发送端 byte[] data = message.getBytes(StandardCharsets.UTF_8); // 接收端 String receivedMsg = new String(serviceData, StandardCharsets.UTF_8);
2. UUID构造时的转换错误
你代码中用自定义的asHex()方法转换消息前两个字符为十六进制,如果这个方法实现有问题(比如多生成了额外字符、转换逻辑错误),会导致后续ServiceData的解析异常,出现垃圾字符。
解决办法:
改用Android系统提供的Hex工具类来做十六进制转换,避免自定义方法的潜在问题:
import android.util.Hex; // 替换你的UUID构造代码 String hexPrefix = Hex.encodeHexString(message.substring(0,2).getBytes(StandardCharsets.UTF_8)); ParcelUuid pu = ParcelUuid.fromString("0000" + hexPrefix + "-0000-1000-8000-00805F9B34FB");
3. BLE广播包长度超限
BLE广播包的总长度有严格限制(通常最大31字节),如果你的消息长度加上Service UUID、长度标识等字段的总长度超过这个限制,广播数据会被截断或填充无效字节,导致接收端读到垃圾字符。
解决办法:
- 计算广播包总长度:1字节(ServiceData长度标识) + 2字节(16位UUID) + 你的消息字节长度 ≤ 31
- 如果消息过长,考虑改用GATT连接传输,而不是广播;或者对消息进行分段处理
4. 接收端未正确处理数据边界
接收端可能没有准确读取ServiceData的有效长度,误读了广播包中其他字段的内容,导致末尾出现垃圾字符。
解决办法:
在接收端打印接收到的字节数组,对比发送端的原始数据,确认垃圾字符的来源:
// 接收端打印字节数组详情 Log.d("BLE_DEBUG", "Received bytes: " + Arrays.toString(serviceData)); // 过滤掉非打印字符(如果垃圾字符是不可见的控制字符) String cleanedMsg = receivedMsg.replaceAll("[^\\p{Print}]", "");
5. 广播数据构建不完整
你的代码中builder.addServiceUu...没有写完,确保你完整添加了对应的Service UUID,否则广播数据结构不规范,也可能导致解析异常。
修正后的完整发送示例:
import android.util.Hex; import java.nio.charset.StandardCharsets; // ... String message = "你的目标消息"; byte[] data = message.getBytes(StandardCharsets.UTF_8); // 构造正确的ParcelUuid String hexPrefix = Hex.encodeHexString(message.substring(0,2).getBytes(StandardCharsets.UTF_8)); ParcelUuid pu = ParcelUuid.fromString("0000" + hexPrefix + "-0000-1000-8000-00805F9B34FB"); AdvertiseData.Builder builder = new AdvertiseData.Builder(); builder.addServiceData(pu, data); builder.addServiceUuid(pu); // 添加对应的Service UUID AdvertiseData advertiseData = builder.build();
按照上面的步骤逐一排查,应该能解决你遇到的垃圾字符问题。
内容的提问来源于stack exchange,提问作者Mohammed Azharuddin Shaikh
相关产品推荐
相关产品推荐

