如何使用BLEManager从iPhone向BLE设备写入数据?
如何用BLEManager从iPhone向BLE设备写入数据?
看起来你在尝试用BLE相关API从iPhone给BLE设备写数据,不过你贴的代码片段不完整,而且还有几个容易踩的坑,我来帮你理清楚正确的做法:
先明确几个前提
在写入数据之前,你需要确保:
- 已经成功连接到目标BLE外设(
CBPeripheral) - 已经发现了外设的目标服务(
CBService) - 已经找到支持写入的目标特征(
CBCharacteristic,它的properties需要包含CBCharacteristicPropertyWrite或CBCharacteristicPropertyWriteWithoutResponse)
你原来代码的问题
你贴的代码是在bleManagerPeripheral:didUpdateValueForCharacteristic:error:回调里——这个回调是用来接收BLE设备发来的数据(也就是读取特征值的回调),不是用来执行写入操作的地方。另外,你把十六进制字符串直接转成UTF8格式的NSData是错误的,这样得到的是字符串本身的ASCII字节,而不是你想要的十六进制对应的字节(比如@"0A0B"转UTF8会得到0x30 0x41 0x30 0x42,而不是你需要的0x0A 0x0B)。
正确的实现步骤
1. 实现十六进制字符串转NSData的方法
首先需要一个工具方法,把十六进制字符串转换成真正的二进制NSData:
+ (NSData *)dataFromHexString:(NSString *)hexString { // 先去掉字符串里的空格(如果有的话) hexString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""]; NSMutableData *mutableData = [NSMutableData data]; for (NSInteger i = 0; i < hexString.length; i += 2) { NSString *byteString = [hexString substringWithRange:NSMakeRange(i, 2)]; unsigned char byte = strtol([byteString UTF8String], NULL, 16); [mutableData appendBytes:&byte length:1]; } return mutableData; }
2. 执行写入操作
当你拿到目标特征targetCharacteristic和连接好的外设peripheral后,就可以执行写入了:
// 你要发送的十六进制指令 NSString *commandHex = @"0A0B"; NSData *writeData = [YourClassName dataFromHexString:commandHex]; // 选择写入类型: // - CBCharacteristicWriteWithResponse:需要设备返回写入确认,适合重要数据 // - CBCharacteristicWriteWithoutResponse:不需要响应,适合高频小数据 [peripheral writeValue:writeData forCharacteristic:targetCharacteristic type:CBCharacteristicWriteWithResponse];
3. 监听写入结果
实现CBPeripheralDelegate的写入回调,来确认数据是否写入成功:
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { NSLog(@"数据写入失败:%@", error.localizedDescription); // 这里可以处理失败逻辑,比如重试 return; } NSLog(@"数据写入成功!"); // 写入成功后的后续操作 }
额外注意事项
- 写入的数据长度不能超过BLE外设特征的最大传输单元(MTU),如果数据过长,需要做分包处理。
- 确保你已经设置了
CBPeripheral的delegate,这样才能收到回调。
内容的提问来源于stack exchange,提问作者Vikram Thakor
相关产品推荐
相关产品推荐

