有没有办法更快地发现BLE外设服务?

2023-11-27

我发现我在 iOS7 中实现 BLE 协议在启动阶段非常慢。在我的应用程序中,启动序列约占整个执行时间的 68%。

我该怎么做才能让它更快?

我已经计时了,这就是我得到的。

     t     dt   
37.598          [BLE] Discovered peripheral at RSSI -27 with UUID:XYZ
37.599  0.001   [BLE] Connecting to peripheral                                                                            
37.602  0.003   [BLE] Scanning stopped                                                                                           
37.685  0.083   [BLE] Peripheral connected                                                                                
38.48   0.795   [BLE] Discovered service  
38.599  0.119   [BLE] Discovered characteristic    

如您所见,在发现这项服务之前存在巨大的瓶颈。

我的启动代码简化了:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
            [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUuid]]
                                            options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
            break;
        case CBCentralManagerStatePoweredOff:
            [central stopScan];
            break;
        default:
            break;
    }
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    if (self.discoveredPeripheral != peripheral) {
        self.discoveredPeripheral = peripheral; // Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
        [central connectPeripheral:peripheral options:nil];
        [central stopScan];
    }
}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    [peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUuid]]];
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:@[array of characteristics]
                                 forService:service];
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
    ...
}

EDIT

我了解到 Android 上的类似应用程序执行此操作的速度要快十倍(使 Android 应用程序感觉更快 -> 更好的用户体验),因此我很好奇我的实现、BLE 层或硬件是否是瓶颈。它已在 iPhone 4S 上进行测试。


当您加密连接时,iOS 应缓存 GATT 数据库。因此,第一个发现调用之后的后续发现调用应该立即发生。

从 iOS 7 开始,甚至特征值也会被缓存,这意味着您可以通过特征的 value 属性读取静态值,例如“设备名称”。如果您想更新它们,您仍然必须发出读取特征值请求。

有关缓存行为的详细信息,请检查WWDC 2013 第 703 场来自幻灯片 48(可能应该观看视频中的相应部分)。

对于连接和发现时间,主要是广告间隔。 Apple 推荐了几种广告间隔,以便在Apple 产品蓝牙配件设计指南(第 3.5 节广告间隔)。此外,您应该在连接时禁用扫描,因为扫描会使连接过程减慢约 55 倍。

请注意,基于 iOS 对每个连接事件发送的数据包数量的限制不应明显影响发现时间(除非您有一个巨大的 GATT 数据库并正在查询整个数据库)。根据 LE 协议设计,这些限制仅对“无响应写入”和“特征值通知”可见。

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

有没有办法更快地发现BLE外设服务? 的相关文章

  • UITableView 给出空表,不加载数据

    当保存我的表的视图是主 第一个 视图时 一切正常 但是 当它不是第一个视图并且我切换到该视图时 我的表不会加载数据 并且我得到一个空桌子 使用 NSLog 我可以看出该程序是不调用 numberOfRowsInSection 和 cellF
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • iOS:GMail API - 通过电子邮件发送附件

    我能够成功发送没有附件的电子邮件 但是 当我尝试使用 GTLUploadParamaters 上传附件时 出现 501 错误 我尝试添加照片库中附件的 NSData 以及仅发送图像的 URL 在这两种情况下我都得到了同样的错误 Create
  • 核心数据二进制数据允许外部存储崩溃

    我在 iOS 12 0 1 上发生崩溃 日志如下 ImageIO CFDataGetBytes data 0x28539b2f0 size 154262 offset 8 count 8 dst 0x16dbf86f0 External d
  • 将 NSDictionary 保存到文件有任何限制吗

    我想用下面的方法来保存NSDictionary void writeDicToFile NSDictionary dic fileName NSString fileName NSString filePath NSTemporaryDir
  • MIDI 文件解析

    我们如何使用 Objective C 进行 MIDI 文件解析 在Java中用于MIDI文件解析的包名为javax sound midi Objective c 有什么东西吗 如果你们中有人回复的话将会有很大的帮助 提前致谢 您可以使用 C
  • 为什么使用 UIImageJPEGRepresentation 方法通过 writetofile 保存的 .jpeg 文件大小比 ios 中的 UIImageWriteToSavedPhotosAlbum 大

    我正在尝试拯救一个UIImage设备中 jpeg 文件的对象 我正在使用这段代码 void saveImageToDocumentsDirectory UIImage mimage withFileName NSString fileNam
  • NSLocale 货币符号,显示金额值之前或之后

    我在用StoreKit在我的应用程序中实现应用程序内购买商店 我有一个自定义设计 这意味着价格的值应该是白色的且较大的 货币符号较小 较暗并与价格值的顶部对齐 我可以使用以下命令毫无问题地获取货币符号NSLocale in SKproduc
  • 播放声音无延迟 iOS

    我找不到如何以低延迟播放真实声音的方法 我尝试使用 AVFoundation 音频播放器 巨大的延迟大约 500 毫秒 所以我尝试创建系统声音 如果运气不好 延迟大约为 200 毫秒 虽然不多 但对我来说没有用 我最多需要 50 毫秒 确保
  • iOS7及以上版本中如何在接收器和扬声器之间切换音频输出?

    我有一个音频播放器 可以选择在接近传感器通知 1 时将音频输出从扬声器切换到接收器 耳机 无论是否连接耳机 以下是我执行此操作的代码 void switchAudioOutput NSString output AVAudioSession
  • 使用 Nib 实现国际化。这真的是个好主意吗?

    在苹果文档中 他们说笔尖只需将笔尖翻译成多种语言即可实现国际化 我现在正在考虑一个更糟糕但现实的场景 你已经制作了一个巨大的用户界面 然后你将其翻译成 25 种语言 所以你会得到 25 个不同的笔尖 您还会在样式和定义 UI 方面获得巨大的
  • 使用 NSSet/NSMutableSet 来过滤对象?

    我已经看到一些有关使用 NSSet NSMutableSet 过滤对象的问题 答案 这些情况使用简单类型的对象 例如NSString or int 以下是用于过滤的代码示例NSString对象 NSSet smallArray NSSet
  • 支持 iOS6 和 iOS7 的启动屏幕 - 强制闪屏

    当谈到启动屏幕时 我找不到一种统一的方法来模仿 iOS6 和 iOS7 支持两者 上的应用程序的外观 如果我们有工具栏菜单 我们是否被迫制作徽标或类似的常规启动屏幕 或者你们有什么好主意如何解决它 简短回答 在 iOS 7 中 应用程序可以
  • 在 UITableviewCell 高度动画的同时动画 CALayer 阴影

    我有一个 UITableView 我正在尝试使用它来展开和折叠beginUpdates and endUpdates方法并在发生时显示阴影 在我的自定义 UITableViewCell 中 我有一个图层 我为其创建阴影layoutSubvi
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • 从 NSError 返回 NSString

    我正在使用NSURLRequest我的 iPhone 应用程序中的类 调用它的方法返回一个NSString这对于连接正常时非常有用 但问题是我需要将 NSError 转换为 NSString 以便我可以将其返回或运行一些if 对此的声明 有
  • Objective-c中的贝塞尔曲线算法

    比我聪明的人可以看一下这个吗 我正在尝试实现我发现的贝塞尔曲线算法here http webtweakers com swag GRAPHICS 0074 PAS html在 Objective c 中 输出是错误的 我想我正确地转换了代码
  • 增加 NSData 的长度

    基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str
  • NSMenuItem、自定义视图和 mouseUp 的奇怪问题:

    我在这里遇到了一个非常非常奇怪的 NSMenu 问题 我使用的大约一半的 NSMenuItems 通过 NSMenuItem 上的 setView 方法具有自定义视图 在此自定义视图中 我实现了 mouseUp 来捕获用户单击菜单项的时间
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p

随机推荐

  • iOS8 区域本地化(例如 pt-BR)?

    据我了解 iOS8 现在支持区域本地化 在本例中我想支持 pt BR See http www ibabbleon com iOS Language Codes ISO 639 html 我遇到了这个问题 使用全新的单视图应用程序对此进行测
  • 转储文件分析入门

    我正在使用旧版 VB6 COM 应用程序 该应用程序有时会导致 Windows 7 崩溃 我现在已经使用 Sysinternals 的 ProcDump 工具生成了其中一个崩溃的 dmp 文件 但是 我以前从未使用过转储文件 您会推荐哪些资
  • 从 ScrollView Swift 中删除子视图

    我使用 for 循环在滚动视图中创建标签和按钮 是否可以删除滚动视图内的所有对象 我想用新内容更新它 for peop in personArray scrollView clearContent Name label var label
  • 格式化 NSNumber 对象时如何指定小数位?

    我使用下面的一段 Objective C 代码来格式化 NSNumber 它在大多数情况下都工作正常 但是当 NSNumber 对象包含整数 没有小数部分 时 它并不能完全满足我的要求 UILabel label UILabel alloc
  • Python 多处理池卡住

    我正在尝试运行在网上找到的 python multiprocessing pool 模块的一些示例代码 代码是 def square x return x x if name main pool Pool processes 4 input
  • 如何区分类型是值类型还是引用类型?

    一些简单的类型 如 int string 等 很容易意识到它们是 ValueTypes 或 RefrenceTypes 但我想知道有什么方法可以区分吗 所有结构 枚举和本机类型都是值类型 在运行时你可以这样检查 Type type type
  • 如何为 HTTP GET 请求设置标头并触发文件下载?

    Update20140702 解决方案 详细答案作为博客文章 但我将其他答案之一标记为已接受 而不是我自己的 因为它让我成功了一半 并奖励我的努力 似乎无法通过以下链接设置 HTTP 请求标头 a href 并且只能使用XMLHttpReq
  • HTTP 请求在 Postman 中有效,但在 C# 代码中无效

    我想用 C 做一个简单的 HTTP 请求 但是有些东西不起作用 我得到的只是403 Forbidden状态码 当我尝试在邮递员中执行相同的请求时 一切正常 我尝试运行 Fiddler 并查看 Postman 发送的所有标头 我全部复制粘贴了
  • 我是否应该要求 IdP 签署 SAML2 SSO 响应?

    我们的应用程序具有与 3 个不同 Shibboleth IdP 的 SAML2 SSO 集成 我们正在尝试添加第四个 也是 Shibboleth 但遇到了一些问题 因为我们的应用程序期望所有 SSO 响应都经过验证签名 其他 3 个正在签署
  • 从 Nhibernate 执行的查询很慢,但从 ADO.NET 执行的查询很快

    我的 MVC 应用程序中有一个查询 大约需要 20 秒才能完成 使用 NHibernate 3 1 当我在 Management studio 上手动执行查询时 需要 0 秒 我在 SO 上看到过类似的问题 所以我进一步进行了测试 我使用
  • 是否可以为字符串文字创建模板化的用户定义文字(文字后缀)?

    当我发现可以制作用户定义的文字模板时 我感到很惊讶 template
  • 从 setTimeout 获取返回值[重复]

    这个问题在这里已经有答案了 我只想获取返回值setTimeout但我得到的是函数的完整文本格式 function x setTimeout y function return done 1000 return y console log x
  • Android - 仅将方向锁定为两个方向

    如何使我的 Android 应用程序成为横向或纵向 但没有相反的方向 意思是我想启用SCREEN ORIENTATION PORTRAIT and SCREEN ORIENTATION LANDSCAPE但要禁用SCREEN ORIENTA
  • ckeditor - onpaste 事件

    有谁知道我如何附加onpasteCKEditor 3 x 中的事件 I basically want to grab CTRL V data and add few text to it and then add it to the edi
  • 如何使用 GDB 7.x 查看 STL 容器的内容

    我一直在使用宏解决方案 正如它所概述的那样here 但是 其中提到了如何在没有宏的情况下查看它们 我指的是 GDB 7 及以上版本 有人能说明一下如何吗 Thanks 从 SVN 获取 python 查看器 svn gcc gnu org
  • 从 Objective-C 移植到 C++ 的最佳方式是什么?

    我没有任何 Objective C 经验 但有很强的 C 背景 是否有一个自动化工具 脚本 或者 最坏的情况下 是否有一些手动方法 使用一些优秀的参考来将 Objective C 编写的代码移植到 C 其中有何困难 编辑 我听说该代码相当简
  • 给搜索栏一个半圆形

    是否可以使用 android 形状元素为 Seekbar 提供弧形形状 如果没有 还有其他方法可以改变搜索栏的形状吗 我有一个允许半圆的开源 CircularSeekBar http devadvance com circularseekb
  • 平移寻找AVPlayer

    我正在尝试在 AVPlayer 中向前和向后平移和搜索 这是可行的 但确定平移在何处转换为资产长度的基本数学是错误的 有人可以提供帮助吗 void handlePanGesture UIPanGestureRecognizer pan CG
  • Flutter 的 Paragraph 类的宽度指标有何含义?

    The 文档for Paragraph 有四种不同的方法来获取宽度距离 宽度 双倍该段落占用的水平空间量 最长线 双段落中从最左边字形的左边缘到最右边字形的右边缘的距离 最大固有宽度 双精度返回最小宽度 超过该宽度增加宽度不会减小高度 mi
  • 有没有办法更快地发现BLE外设服务?

    我发现我在 iOS7 中实现 BLE 协议在启动阶段非常慢 在我的应用程序中 启动序列约占整个执行时间的 68 我该怎么做才能让它更快 我已经计时了 这就是我得到的 t dt 37 598 BLE Discovered peripheral