gpt4 book ai didi

ios - 在特征上设置通知会导致无效句柄错误

转载 作者:IT老高 更新时间:2023-10-28 11:30:41 24 4
gpt4 key购买 nike

我想使用 CoreBluetooth 将数据从 iPhone 发送到 Mac。为此,我编写了 iPhone 作为“外围设备”和 Mac 作为“中央”的代码。

它工作得很好,但有时它会直接断开连接,然后不断连接和断开连接。

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

我引用了 net.xml 中的所有链接。但我无法解决这个问题。我认为在 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,我写了一个外围委托(delegate)方法。

//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: 的 Powered Off 和 Powered back On 状态事件以确定重启是否完成。

关于ios - 在特征上设置通知会导致无效句柄错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139916/

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