code

특성에 대한 알림을 설정하면 잘못된 핸들 오류가 발생 함

codestyles 2020. 12. 26. 10:05
반응형

특성에 대한 알림을 설정하면 잘못된 핸들 오류가 발생 함


CoreBluetooth를 사용하여 iPhone에서 Mac으로 데이터를 보내고 싶습니다. 이를 위해 iPhone과 같은 코드를 'Peripheral'로, Mac은 'Central'로 작성했습니다.

완벽하게 작동하지만 때로는 직접 연결이 끊어진 다음 계속 연결되고 연결이 끊어집니다.

재 연결을 시도 할 때 Central에서 직접 'didDisconnectPeripheral'델리게이트 메소드를 호출합니다. 그러나 때때로 'didUpdateNotificationStateForCharacteristic'에 "핸들이 유효하지 않습니다"라는 오류가 발생합니다.

나는 인터넷의 모든 링크를 참조했습니다. 그러나 나는이 문제를 해결할 수 없다. iPhone에서 블루투스 캐시를 저장하고 있다고 생각했습니다.

"손잡이가 잘못되었습니다"오류를 해결하는 방법을 제안하십시오.

다음은 몇 가지 중요한 방법입니다.

주변기기의 경우 아래와 같은 코드를 작성했습니다.

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".
    }
}

나는 최근에 같은 문제에 봉착했습니다. 내가 찾은 유일한 해결책은 블루투스를 다시 시작하는 것입니다 (블루투스를 끄고 다시 켜십시오).

제 경우에는 항상이 문제를 일으킨 블루투스 장치의 변경 (DFU 모드에서 다시 시작) 이었기 때문에 사용자에게 블루투스를 다시 시작하라는 경고를 표시했습니다. 에 대한 감상 centralManagerDidUpdateState:다시 시작이 수행 된 경우 결정의 강화 된 오프 및 상태 이벤트에 전원이 다시보다.

참조 URL : https://stackoverflow.com/questions/25139916/setting-notifications-on-characteristic-results-in-invalid-handle-error

반응형