- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想使用 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/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!