我遇到一个问题,在这个时间之间写一个值与一个特征使用
[peripheral writeValue:dataPacket forCharacteristic:writeChar type:CBCharacteristicWithResponse]

实际上物理发送蓝牙数据包的iOS设备逐渐变得越来越长.

这可以从调试器的以下输出中说明:

2013-10-23 14:12:17.510 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.595 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:17.598 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:17.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.656 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:17.657 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:22.601 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:23.123 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:23.125 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:27.601 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:28.111 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:28.113 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:32.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:34.595 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:34.597 Test App iOS[1561:60b] Packet response received


2013-10-23 14:12:37.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:39.582 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:39.585 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:42.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:44.570 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:44.573 Test App iOS[1561:60b] Packet response received

2013-10-23 14:12:47.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:49.558 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:12:49.560 Test App iOS[1561:60b] Packet response received

// Several packets omitted...

2013-10-23 14:13:07.610 Test App iOS[1561:60b] Packet sent
2013-10-23 14:13:09.508 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:13:09.511 Test App iOS[1561:60b] Packet response received

2013-10-23 14:13:12.610 Test App iOS[1561:60b] Packet sent
2013-10-23 14:13:14.496 Test App iOS[1561:60b] Packet sent confirmation,error = (null)
2013-10-23 14:13:14.498 Test App iOS[1561:60b] Packet response received

// 等等…

数据包发送消息在writeValue命令之后立即输出,将数据包写入特性.

数据包发送确认输出在didWriteValueForCharacteristic委托方法的第一行.

数据包响应接收消息在didUpdateValueForCharacteristic中输出,当BTLE设备发送响应数据包(通过次要通知特性)时,调用它来确认收到我发送的数据包.

从最初可以看出,我调用writeValue forCharacteristic方法和回调以确认数据包之间的时间已经在didWriteValueForCharacteristic中发送,最初是85ms(已经是缓慢但可承受的).我每5秒发送一次这些数据包,只有少量的数据包发送到〜2秒钟后才能持续静止2秒.在发送数据包的确认后,从BTLE设备发回的响应数据包总是〜2ms.

我不明白为什么在调用writeValue和确认回调didWriteValueForCharacteristic之间的CoreBluetooth库中得到这个延迟.

在所有其他方面,代码正常工作(BTLE设备正在完成正在被指示的操作,并且没有任何数据包丢失).

我有一个由BT4.0模块制造商(包括源代码)提供的示例应用程序,它不会遇到这种日益增长的延迟 – 不幸的是,示例应用程序旨在应对模块的大量实现,而不仅仅是我们的具体实现所以大量复杂的包含与我们的实现无关的很多代码 – 我已经在示例中的每个函数中放置了断点,并手动逐步确定了它们正在发出的命令,并且我相信我完全复制它们但显然不是).

我看不到他们在做什么,我没有做,反之亦然.我可以在两个项目之间找到唯一的区别是我使用ARC,他们使用手动引用计数.

其他信息:
一切都在主线程上运行(与模块制造商的示例应用程序一样)
我使用主队列创建中央管理器(类似于模块制造商示例应用程序)
iOS设备上的cpu负载在我的应用程序运行时只有3%,而且由于cpu负载等原因,似乎没有任何延迟.

我正在撕裂我的头发,如果有人可以提出任何可能的原因或解决这个问题,我将永远感激!

谢谢,
丰富

解决方法

我已经取得了一些进展,消息不好.事实证明,我的原始描述的问题是不正确的.我假设(总是一件坏事情),模块供应商生产的示例应用程序将是正确的,但是它报告的时序数据是错误的 – 当他们报告〜3ms来发送数据包并检索它们只是定时的响应从-didWriteValueForCharacteristic,并不包括调用writeValueForCharacteristic和didWriteValueForCharacteristic之间的时间 – 一旦我包括这个时候,他们的应用程序的行为像我的缓慢.

经过进一步的调查,iOS CoreBluetooth库似乎在要求发送数据包和实际开始发送之间造成延迟 – 这些任意延迟可以在80ms到2sec之间的任何地方.有没有人知道为什么iOS库发送实际数据包的速度太慢?我们在Android下运行的等效代码或多或少地即时.

如果我有我的愤世嫉俗的帽子,我会说苹果是故意这样做,以防止需要使用BTLE开发快速响应的应用程序,从而迫使硬件开发人员使用需要苹果安全芯片的蓝牙3,从而有效地招致苹果许可单位制造成本…

ios – 核心蓝牙在发送数据包时会减慢速度的更多相关文章

  1. IOS 7中的外部蓝牙键盘集成

    解决方法使用新的UIKeyCommand类和UIResponder链,iOS7中的蓝牙键盘上有100%支持的键盘快捷键处理方式.Ididblogaboutthis,但这是要点:在Responder链中的某处为keyCommands添加一个返回UIKeyCommand对象数组的方法:然后,当按下F时,Responder链将查找该handleCommandF方法.如果有多个定义,它将使用最严格的定义.请注意,这仅在输入是第一响应者时才有效.如果你想在你的应用程序中使用“全局”快捷方式,你可以在屏幕上隐藏UIT

  2. iOS蓝牙BLE安全性和“Just works”关联模型

    根据thisdocument和thiswhitepaper,有一些安全措施旨在防止被动窃听蓝牙BLE连接.有没有办法在iOS中央管理器和外围设备之间实现安全连接?

  3. 通过蓝牙HID加密狗将数据从ios设备发送到Windows PC

    >如果可以使用BLE4.0使用蓝牙到HID键盘仿真器加密狗,是否可以将支持BLE4.0的iOS设备与它配对?>有没有人尝试任何特定的HID键盘模拟器加密狗支持BLE4.0?

  4. ios – 如何使用iphone使用蓝牙或wifi与OBD II进行通信

    我想为iOS创建一个简单的应用程序,它通过ODBIIWifi/蓝牙设备从汽车读取数据并在iPhone屏幕上显示.但我不知道从哪里开始.请有人帮我实现以下结果.我有蓝牙和wifi加密狗.第1步:配对蓝牙或Wifi加密狗和iPhone.第2步:通过加密狗阅读详细信息请参阅我能够轻松理解的任何教程或示例代码.我想深入了解这些过程,并希望自己编写代码.所以请帮忙.提前致谢.解决方法正如David所说,在i

  5. iOS核心蓝牙状态保存和恢复问题

    我还在Apple开发者论坛上看了一篇文章,自从iOS7以来,如果用户手动杀死我正在做的应用程序,操作系统现在永远不会以任何理由重新启动应用程序.任何有关这方面的帮助将非常感谢!

  6. ios – Arduino和iPhone与蓝牙3.0的连接

    我想构建一个需要蓝牙连接的应用程序.蓝牙HC05模块连接到Arduino.我想知道构建可连接到此蓝牙模块的应用程序所需的框架.仍然不知道如何开始.有人可以帮忙吗?

  7. iOS BLE蓝牙 – 发送/接收HEX数据

    我正在创建一个应该连接到自定义BLE设备的iOS应用程序.我需要iOS应用程序发送2个HEX命令,一个用于启用设备的一部分,另一个用于请求数据.iOS中是否有任何方式发送/接收自定义HEX数据,除了使用服务&特点?

  8. 可以通过iOS中的蓝牙PAN与系留设备进行通信

    我有一个设备,我通过蓝牙从iOS设备分享我的连接.我想知道是否可以访问在PAN网络上的iPhone上创建服务器并从设备访问它或在设备上创建服务器并从iPhone访问它.有没有人有这种经历?

  9. ios – iPhone中的蓝牙编程

    我打算开发一个iPhone应用程序,使用蓝牙将文件/数据传输到Windows桌面或从我的Windows桌面传输.请告知我iPhoneSDK中是否有用于此目的的编程接口.在WindowsMobile中,我可以使用FTP配置文件或在串行端口配置文件上编写应用程序来传输文件.任何人都可以通过编写适当的应用程序告诉我,这是否可以通过iPhone实现.如果没有,请让我知道通过蓝牙从iPhone传输文件/数据到Windows桌面PC的替代方法.解决方法不,FTP或SPP蓝牙配置文件在iPhone中没有打开…

  10. 当蓝牙设备靠近时,唤醒ios应用程序

    还是可以任何新的外设唤醒应用程序?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部