gpt4 book ai didi

ios - 通过 BLE 通知接收数据包

转载 作者:行者123 更新时间:2023-11-29 02:53:40 30 4
gpt4 key购买 nike

当通过 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 ababababab

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”方法以接受新参数。

最佳答案

查看 YMSCoreBluetooth 库的内部 didUpdateValueForCharacteristic 委托(delegate)方法,它使用“在主线程上执行”将数据发送到您的方法并且它不捕获数据 - 它只是发送一个引用特性。此外,它通过在主线程上对数组执行线性搜索来对特征执行“findCharacteristic”,即使这可以在当前线程上进入委托(delegate)方法时立即完成。当然,这不会是一个非常大的数组,但看起来这个库在创建时并没有考虑到性能。

我怀疑你有时间问题——当你的方法执行时,特性中的数据已经被覆盖。如果您可以控制外围设备,请立即将其减速以进行测试,看看问题是否消失。

如果它与时间相关,那么您可以尝试直接的 Core-Bluetooth 实现,或者尝试修改 YMSCoreBluetooth 以便它更早地捕获数据 - 也许如果它在 didUpdateValueForCharacteristic 开始时创建了外围设备的副本 并将其发送到您的方法,它会起作用。

关于ios - 通过 BLE 通知接收数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171461/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com