在特征结果中设置无效句柄错误的通知

使用CoreBluetooth我想从iPhone发送数据到Mac。 为此,我将iPhone的代码编写为“Peripheral”,将Mac编写为“Central”。

它完美的工作,但有时它直接断开,然后不断连接和断开连接。

有时当它试图重新连接时,在中央它直接调用“didDisconnectPeripheral”委托方法。 但有时在“didUpdateNotificationStateForCharacteristic”中出现错误“句柄无效”。

我提到了networking中的所有链接。 但是我无法解决这个问题。 我认为在iPhone它是存储蓝牙caching。

请提出解决scheme如何解决“句柄无效”的错误?

以下是一些重要的方法。

对于外设我写如下代码。

在Appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.peripheral = [[PeripheralServerObject alloc] init]; self.peripheral.serviceUUID = [CBUUID UUIDWithString:@"4w24"]; return YES; } 

在外围目标文件中:

 //To Check Bluetooth State - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { switch (peripheral.state) { case CBPeripheralManagerStatePoweredOn: [self enableService]; break; case CBPeripheralManagerStatePoweredOff: { [self disableService]; break; } } // To Add characteristics to Service - (void)enableService { [self.peripheral removeAllServices]; self.service = [[CBMutableService alloc] initWithType:self.serviceUUID primary:YES]; self.authChar = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"a86e"] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; self.respChar = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"a86f"] properties:CBCharacteristicPropertyWriteWithoutResponse value:nil permissions:CBAttributePermissionsWriteable]; self.service.characteristics = @[ self.authChar, self.respChar ]; // Add the service to the peripheral manager. [self.peripheral addService:self.service]; } //Peripheral Manager delegate method will be called after adding service. - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error { [self startAdvertising]; } //To disable service - (void)disableService { [self.peripheral stopAdvertising]; [self.peripheral removeAllServices]; } //To enable a service again. -(void)refreshService { [self disableService]; [self enableService]; } If central subscribes the characteristic, then the below peripheral delegate method will be called. In this I implemented code to send data - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic { self.dataTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(sendData) userInfo:nil repeats:YES]; } - (void)sendData { Here I am sending data like [Apple's BTLE Example Code][1] } //If unsubscribed then I am invalidating timer and refreshing service - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic { if (self.dataTimer) [self.dataTimer invalidate]; [self refreshService]; } 

对于Mac我写了一个外围委托方法。

 //I enables the notification for "a860" Characteristic. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { CBUUID * authUUID = [CBUUID UUIDWithString:@"a86e"]; for (CBCharacteristic *characteristic in service.characteristics) { if ([characteristic.UUID isEqual:authUUID]) { } [self.connectedPeripheral setNotifyValue:YES forCharacteristic:characteristic]; } } -(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { Here I am getting error sometimes "The handle is invalid". } } 

我最近遇到了同样的问题。 我发现唯一的解决办法是重新启动蓝牙(closures蓝牙,然后重新打开)。

在我的情况下,这是蓝牙设备(重新启动它在DFU模式),总是造成这个问题的变化,所以我最终显示提醒用户重新启动蓝牙。 收听centralManagerDidUpdateState:的电源closures状态并重新接通状态事件,以确定重新启动是否完成。