특성에 대한 알림을 설정하면 잘못된 핸들 오류가 발생 함
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:
다시 시작이 수행 된 경우 결정의 강화 된 오프 및 상태 이벤트에 전원이 다시보다.
'code' 카테고리의 다른 글
새로운 NSPrivateQueueConcurrencyType을 통한 핵심 데이터 백그라운드 가져 오기 (0) | 2020.12.26 |
---|---|
D3 및 Shiny를 사용하여 R에서`identify ()`구현 (0) | 2020.12.26 |
FFmpeg를 사용하여 iOS에서 작성하는 동안 fMP4를 HLS로 트랜스 코딩 (0) | 2020.12.26 |
최신 Blink 포함 브라우저 (예 : Chrome, Opera)에서 이상한 스크롤 동작 (0) | 2020.12.26 |
Motorola 장치 : ThreeTen에서 날짜 구문 분석시 org.threeten.bp.DateTimeException (0) | 2020.12.26 |