【发布时间】:2014-06-11 19:54:47
【问题描述】:
当通过 BLE 通知接收多个数据包时,iOS 只允许我访问发送的最终数据包。我正在使用 YMSCoreBluetooth 连接到具有多个服务的 BLE 外围设备,每个服务都有多个特征。我连接到外围设备,发现服务并毫无问题地发现这些服务的特征。我的目标是订阅某个特征的通知,并通过通知接收一系列数据包。我的订阅成功,我可以通过在我的代码中使用 NSLogs 看到我正在接收包含数据的通知。问题是当我去访问每个通知中的数据时,每个通知只给我发送的最后一个数据包中包含的数据。
我的接收通知代码如下:
- (void)notifyCharacteristicHandler:(YMSCBCharacteristic *)characteristic error:(NSError *)error
{
if (error) {
NSLog(@"Error: Error in handling notification.\n%@", error);
}
else if ([characteristic.name isEqualToString:@"InterestingChar"]) {
if (self.firstNotify) {
self.mutableData = [[NSMutableData alloc] init];
self.firstNotify = NO;
}
NSData *data = [[NSData alloc] init];
data = characteristic.cbCharacteristic.value;
[self.mutableData appendData:data];
self.notifyCounter++;
NSLog(@"Notify received! Count: %ld \nData =%@",(long)self.notifyCounter,self.mutableData);
}
else NSLog(@"Other notification received");
}
例如,如果我收到 5 条包含以下数据的通知:
1 个 ababababa
2 bcbcbcbcbc
3 cdcdcdcdcd
4 dedededede
5 效果
我的 NSLog 将为第一个通知数据打印 efefefefef,第二个为 efefefefef efefefefef,依此类推,为每个后续通知附加最后一个数据值。
我正在尝试使用 BLE 从外围设备尽快发送通知。连接间隔在 20 毫秒到 40 毫秒之间(iOS 要求范围至少为 20 毫秒),每个连接间隔发送三个数据包。
编辑:
Paulw11 的建议效果很好。我通过修改 YMSCB 的“didUpdateValueForCharacteristic”方法来解决该问题,以获取特征的值并将其与指向特征本身的指针一起传递给“notifyCharacteristicHandler”方法。修改后的方法现在如下所示:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
__weak YMSCBPeripheral *this = self;
NSData *value = characteristic.value;
_YMS_PERFORM_ON_MAIN_THREAD(^{
YMSCBService *btService = [this findService:characteristic.service];
YMSCBCharacteristic *yc = [btService findCharacteristic:characteristic];
if (yc.cbCharacteristic.isNotifying) {
[btService notifyCharacteristicHandler:yc value:value error:error];
} else {
if ([yc.readCallbacks count] > 0) {
[yc executeReadCallback:characteristic.value error:error];
}
}
if ([this.delegate respondsToSelector:@selector(peripheral:didUpdateValueForCharacteristic:error:)]) {
[this.delegate peripheral:peripheral didUpdateValueForCharacteristic:characteristic error:error];
}
});
}
您显然还需要修改“notifyCharacteristicHandler”方法以接受新参数。
【问题讨论】:
-
NSData的 alloc/init 没用,因为你做了 data =characteristic.cbCharacteristic.value。另外,它不应该没有“characeteristic.value”吗?错字? -
它是一个YMSCBCharacteristic,它有一个CBCharacteristic作为一个属性,而它又是一个值
标签: ios notifications core-bluetooth