设置特征通知会导致无效句柄错误

2024-01-10

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

工作正常,但有时会直接断开,然后不断地连接和断开。

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

我引用了网络上的所有链接。但我无法解决这个问题。我以为 iPhone 中存储的是蓝牙缓存。

请建议如何解决“句柄无效”错误的解决方案?

下面是一些重要的方法。

对于外围设备,我编写了如下代码。

在应用程序委托中:

- (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:的断电和重新通电状态事件以确定是否重新启动已完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置特征通知会导致无效句柄错误 的相关文章

  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • Firebase 连接管理器应仅返回一个结果

    我正在关注位于以下位置的文档 https www firebase com docs ios guide offline capability html section connection state https www firebase
  • 使用 Objective-C 在 iPhone 应用程序中显示或隐藏 UIButton

    我在用UITextView编辑文本 我想用两个UIButtons编辑并保存 最初我想显示编辑UIButton 当用户单击编辑时我想显示保存UIButton 当内容成功保存后 我不想再显示保存按钮 我是一名 C 编码员 在 C 中我曾经这样做
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • 使用隐藏的 SFSafariViewController 获取 Safari cookie

    我正在阅读以下关于从移动网页到本机 iOS 9 应用程序对用户进行身份验证的文章 并且想知道如何最好地实现类似于下面讨论的隐藏控制器的隐藏 safari 视图控制器 https library launchkit io how ios 9
  • 如何在我的 iOS 项目中添加和执行 .sql 文件?

    我找到了很多关于在 iOS 中使用 SQLite 数据库的教程 但没有找到任何直接引用 sql 文件的内容 谁能告诉我如何将现有的 SQL 数据库链接到我的应用程序 编辑 这是一个 MySQL 转储 我们有一个基于浏览器的抽认卡程序 现在我
  • iOS 外部附件框架:如何获取特定 MFI 设备的协议字符串

    我正在编写一个 iOS 应用程序 用于与 mini mPlay Drumi MP18B 小型蓝牙扬声器 进行通信 据我所知 showBluetoothAccessoryPickerWithNameFilter仅显示协议字符串添加到 Info
  • 在 iOS 中录制音频并永久保存

    我制作了 2 个 iPhone 应用程序 可以录制音频并将其保存到文件中并再次播放 其中之一使用 AVAudiorecorder 和 AVAudioplayer 第二个是苹果的在这里说话 http developer apple com l
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • Swift:从自定义 UITableViewCell 中的 UITextField 检索文本并将其放入数组中

    我正在制作一个非常简单的应用程序 用户在第一个屏幕中输入人数 在第二个屏幕中 它会生成一些UITableViewCell基于用户在第一个屏幕中输入的数字 这UITableViewCell have a UITextField在其中 一旦用户
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • 如何使用 ZBar 读取器的 scanCrop 属性?

    我正在使用 iPhone 的 ZBar SDK 来扫描条形码 我希望阅读器仅扫描特定的矩形而不是整个视图 为此需要将阅读器的 scanCrop 属性设置为所需的矩形 我很难理解必须设置的矩形参数 有人可以告诉我如果在纵向视图上它的坐标是 我
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • 如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有功能的应用程序中

    我正在尝试创建一个共享扩展 用户可以从任何有能力的应用程序上传她的录音 该文档甚至有一个简单的示例 请参阅声明共享或操作扩展支持的数据类型 https developer apple com library content document
  • 维护 UISegmentedControl 中的选择

    我可以保持 UISegmentViewControl 段的选定状态吗 即 即使用户选择了另一个段 也可以保持一个段显示为选中状态 我似乎在任何地方都找不到任何可以做到这一点的东西 这是不可能开箱即用的 看如何才能选择 UISegmented
  • UIImage:如何获取网站选项卡图标

    我正在开发一个 RSS 阅读器 我需要获取每个提要的图标 例如 如果我的提要是 google com 我想获取 G 图标并将其放入 UIImage 或其他内容中 关于如何实现这一目标有什么想法吗 最简单的方法是使用 Google NSStr
  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 水银大号

    你知道如何让 Quicksilver 在屏幕上显示大量的大字体吗 通过点击 然后输入自由文本 选择 操作 下的 查看大字体 并按 Enter 键 好吧 有谁知道一种以编程方式做到这一点的方法吗 另外 quicksilver 是必需的还是内置

随机推荐

  • 只允许某些网站访问 PHP API

    我目前面临着保护客户在其网站上使用的 API 安全的问题 然而 因为这个 API 是由 JavaScript 调用的 所以我发现很难找到一种方法来只允许这些访问 API URL 那么我该怎么办呢 我如何只允许访问这些链接 显然 链接可能会受
  • 如何为 Rails 设置远程 json API 以进行身份​​验证和会话

    我是 Rails 新手 对 Devise Gem 有相当基本的了解 除了 CRUD 和视图之外 我不清楚它提供了什么可以帮助我让 AngularJs 应用程序与 Rails Json Api 进行对话 目前我正在用手滚动东西 为了安全起见
  • 列表框插入颜色项目

    I use ListBox用于插入文本 例如You add Michael in your database You delete Michael listBox1 Items Insert 0 You add name in your d
  • appcelerator titan:创建一个新文件

    如何在 appcelerator titan 中创建新文件 var Settings Titanium Filesystem getFile Titanium Filesystem tempDirectory Settings Ti API
  • 如何通过HardHat获取底层合约地址的私钥?

    我有 HardHat 教程中的智能合约https hardhat org tutorial writing and compiling contracts html https hardhat org tutorial writing an
  • Google Deployment Manager Cloud Scheduler 类型

    我发现 GCP 没有提供时间表类型 我想知道创建模板 复合类型或类似模板以提供 Cloud Scheduler 类型的步骤 我知道 Google 已经提供了一个例子 https github com GoogleCloudPlatform
  • 无法使用运行 MAMP / PHP 5.6.1 / Mac OS X El Capitan 的 putenv() 修改 PATH

    配置 MAMP专业版 PHP 5 6 1 Mac OS X 埃尔卡皮坦 我需要添加 user local binphp可以访问的系统路径 我尝试过使用 putenv 但似乎我无法使用 putenv 更改 php 中环境变量 PATH 的值
  • 从代理返回异常

    我正在使用大量未记录的 Castle 动态代理系统 我已经设法让它完成我想要的几乎所有事情 除了一件事 如何使代理方法抛出异常而不是返回值 public sealed class MyInterceptor IInterceptor pub
  • JavaScript 中 array.length 可以小于 0 吗?

    由于人们经常使用 array length lt 1 检查数组是否为空而不是 array length 0 我想知道是否存在 array length 可能低于 0 的情况 No the length数组的 是一个非负整数 从the spe
  • 无法将文件分配给文件输入、Firefox 和 IE

    用户可以通过两种可能的方式启动文件传输 拖放到小部件 或使用多文件输入按钮 我喜欢如何使用多文件输入 它将用智能的 选择 8 个文件 或其他内容替换文件名字符串 为此 必须填充输入 我不想从 drop 事件中实际创建 xhr2 对象 而是只
  • 如何将 AWS RDS Aurora MySQL 5.6 升级到 5.7

    我们使用 AWS RDS Aurora MySQL 5 6 作为我们的生产数据库 AWS 于 2018 年 2 月 6 日推出兼容 MySQL 5 7 的 Aurora 引擎 我在 修改实例 中没有看到任何将引擎更改为 MySQL 5 7
  • 使用 jquery 按值选择下拉列表

  • Bash 脚本正则表达式

    我正在尝试匹配格式为 4 6 或 2 8 的字符串中的版本号 我最终将在 bashrc 文件中的函数中使用以下内容来查找操作系统版本 function test string abc ABC12 123 3 4 def echo expr
  • 是否有像 Win32 中的“CreateEvent()”那样的 C++ 跨平台“命名事件”?

    我正在寻找类似于 Win32 世界中的 CreateEvent SetEvent 和 WaitForMultipleObjects 的东西 具体来说 这必须可以在同一台机器上跨进程访问 我们已经在使用 Poco 来做一些跨平台的事情 但我不
  • 从 pandas DataFrame 插入 Access 数据库

    请有人告诉我应该如何插入到数据库中 而不是Python中的所有数据帧 我发现了这个 但不知道如何插入所有名为 test data 的数据框 其中包含两个数字 ID Employee id 我也不知道如何插入 ID 的下一个值 类似于 nex
  • 如何编译C程序?

    好久没做C了 我想编译这个程序 http csrc nist gov groups ST toolkit rng documentation software html 但我不知道如何继续 看起来 makefile 经常引用 GCC 但我从
  • 使用 Python 注入原始 TCP 数据包

    使用 Python 注入原始 TCP 数据包的合适方法是什么 例如 我有由十六进制数字组成的有效负载 并且我想将该十六进制数字序列发送到网络守护程序 这样 如果我选择发送 abcdef 我也会在线路上看到 abcdef 但不是 616263
  • Makefile 循环依赖

    这是我的 Makefile PHONY all homework1 CFLAGS g O0 Wall Werror Wno unused function LDFLAGS lm all homework1 homework1 program
  • 无法在Windows 8.1中的vagrant中安装插件hostmanager

    无法安装插件 显示以下错误 C devbox gt vagrant 插件安装 vagrant hostmanager 插件安装目录 Vagrant 主目录 里面有一个空格 在 Windows 上 Ruby 编译时存在错误 插件到带有空格的目
  • 设置特征通知会导致无效句柄错误

    我想使用 CoreBluetooth 将数据从 iPhone 发送到 Mac 为此 我编写了代码 例如将 iPhone 作为 外围设备 将 Mac 作为 中央设备 工作正常 但有时会直接断开 然后不断地连接和断开 有时 当它尝试重新连接时