低功耗蓝牙 - 重复更新特征值

2024-01-07

关于电气工程 Stackexchange 的后续问题 https://electronics.stackexchange.com/questions/30964/improving-throughput-of-a-bluetooth-low-energy-connection

我想写出a的值蓝牙低功耗在短时间内重复特征(作为一个可能的用例,想象一只鼠标)。

  • 128位UUID的特点是20 bytes长的。因此,它可以写入单个低能耗交易中。
  • 写入以 50 Hz 的速率发生,这等于写入每20毫秒一次.
  • 因此,20 * 50 * 8 =8 kbit/s被写。
  • 我正在使用Command / 写了没反应模式来写入特征。因此,属性层上不会发生任何确认。
  • 未连接其他蓝牙或蓝牙低功耗设备。不通过 WLAN 执行任何操作。测试期间不会读取或写入其他特征。

我通过从 iPhone 4S 发送包含序列号的数据包来测试该程序。每发送一个数据包后,序列号就会加一。

在接收端,一个可编程开发板,包含一个CSR1000 http://www.csr.com/products/45/csr-energyBLE 芯片用于接收数据包并将接收到的序列号打印到串行连接。

我的问题如下:

  • 一段时间后,数据包开始丢失。前 100 个数据包在 50 Hz 下工作正常。从那时起,数据包开始被丢弃。

               0x00 - 0x46   received
                0x47, 0x48   missing
    0x49, 0x4a, 0x4b, 0x4c   received
                      0x4d   missing
    0x4e, 0x4f, 0x50, 0x51   received
                      0x52   missing
    0x53, 0x54, 0x55, 0x56   received
                      0x57   missing
    ...
    

    大多数情况下,一包四个数据包可以很好地传输(很少情况下,只有 2 个数据包)。然后,有 1-7 个数据包丢失。

    当我减小特征值大小时,问题仍然存在。

    当我以 100Hz 而不是 50Hz 写入时,情况是一样的 - 只是在大约 35 个数据包之后开始发生丢弃,并且在成功传输 4 个数据包之间有 5-7 个数据包被丢弃。

    对于丢失的数据包,无论写入频率如何,最终的传输速率约为 5 kbit/s。这显然低于低功耗蓝牙在技术上可能达到的约 305 kbit/s。

  • 当我从开发板向 iPhone 4S 发送数据包时,问题也会出现在相反的方向。同样,5 kbit/s 是我获得的最大值。通知机制就用于这种场景。同样,属性层上没有发生任何确认。

  • 当我尝试同时向两个方向发送时,事情开始变得严重,以至于我必须重置开发板和 iPhone 4S。

问题:

  • 这可能是开发板上使用的低功耗蓝牙芯片的问题吗?

    如果是的话,为什么问题也会出现在相反的方向,即 iPhone 作为接收器?

    市面上有支持高频访问特性的开发板吗?

  • 问题的根源可能是什么?

    除了假设之外,还请尝试参考蓝牙规范/演示幻灯片/文章的部分内容。

市场上存在蓝牙低功耗鼠标。鼠标的典型轮询率为 125 Hz,并且必须至少发送两个 16 字节值以及每个时钟周期的额外 HID 开销。因此,我的问题应该有一个解决方案。

Update

The LE 连接完成事件描述于蓝牙规范版本 4.0 第 2 卷 E 部分第 7.7.65.1 节。我收到以下不同连接参数的值:

Parameter               Value      Description
--------------------------------------------------
Conn_Interval           0x0054     Time =  105 ms
Conn_Latency            0x0000     Time =    0 ms
Supervision_Timeout     0x00fc     Time = 2520 ms
Master_Clock_Accuracy     0x05              50 ppm

发出一个连接参数更新解决了问题并将吞吐量从 5 kbit/s 提高到〜33 kbit/s。然而,这仍然低于预期的约 305 kbit/s。

Conn_Interval = 0x000f = 18.75 ms
Conn_Latency  = 0x0000
Supervision_Timeout = 0x00fc

有没有什么方法可以达到完整的~305 kbit/s?

关于电气工程 Stackexchange 的后续问题 https://electronics.stackexchange.com/questions/30964/improving-throughput-of-a-bluetooth-low-energy-connection

烧掉一个 TSI 并等待一个月就能得到苹果的回复。

基本上,他们告诉我们该行为是在 iOS 5.1 中设计的。它 某种程度上是有道理的,因为他们不希望你的应用程序 性能取决于其他应用程序是否使用蓝牙或 WiFi。

根据工程师的评论 - 在 iOS 5.1 下,连接间隔期间应该有 6 对通知,这意味着 6*数据包大小*1000/间隔。这应该转换为 ~55kbps max(最小 间隔为 20 毫秒,数据包大小为 23 字节)。我们决定 限制每个间隔的对数,并有一个最小间隔 iPhone 和 iPad 之间共享天线 BT 经典、BT LE 和 WiFi。

iOS LE 被设计为低功耗传输。对于更高的吞吐量,经典 BT 是更好的传输方法。

回到我这里 - 根据上面工程师的评论,如果希望实现 200 kbs 的吞吐量,经典蓝牙就是答案。 但是,如果希望使用 iPhone 上的应用程序,我 可以理解,这不是简单的改变——经典BT需要MFI 许可。

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

低功耗蓝牙 - 重复更新特征值 的相关文章

  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • Cognito/IAM 策略和 S3 获取对象

    我正在尝试将 S3 和 Cognito 集成到我的 iOS 应用程序中 但到目前为止尚未成功 我相信该错误与我针对 Auth 和 Unauth 用户的 IAM 策略有关 所以这是我的政策 Version 2012 10 17 Stateme
  • 具有多种自定义单元格类型的 RxSwift 表视图

    我想知道是否有任何代码示例RxSwift当我可以在一个表视图中使用多个自定义单元格时 例如 我有两个部分 第一部分有 10 个单元格 类型为CellWithImage标识符和第二部分有 10 个带有类型的单元格CellWithVideo标识
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重
  • UIViewController 作为单例

    我在标签栏应用程序中有一个 UIViewController 我已经从 MainWindow nib 文件添加了控制器 即不是以编程方式 我的问题是如何使我的视图控制器成为单例 解决 Facebook 委托问题 您可能想让您的 Facebo
  • 当我使用并行代码时,为什么我的计算机没有显示加速?

    所以我意识到这个问题听起来很愚蠢 是的 我使用的是双核 但我尝试了两个不同的库 Grand Central Dispatch 和 OpenMP 并且当使用 clock 来对带有和不带有使平行的话 速度是一样的 根据记录 他们都使用自己的并行
  • 什么是粗网格搜索和细网格搜索?

    我正在读这个答案 用于 2D 碰撞检测的四叉树的高效 且解释良好 实现 https stackoverflow com questions 41946007 efficient and well explained implementati
  • 以编程方式更改 UISlider 的范围

    如何以编程方式设置 UISlider 的最小最大范围 例如 虚拟代码 UISlider slider UISlider alloc init slider min 3 slider max 3 EDIT 所以我有以下内容 sl minimu
  • CocoaPods 生成无效的项目文件(未找到标头)

    我有一个带有 Podfile 的项目文件 如下所示 platform ios 7 0 def import pods pod Specta 0 1 8 pod Expecta 0 2 1 pod RestKit 0 20 3 pod Mag
  • 是否可以使用 iOS SDK 更改 Amazon Cognito 中的用户名?

    正如标题中所写 是否可以更改 Amazon Cognito 用户的用户名 我在文档中找不到任何内容 可以更新preferred username使用 iOS SDK 的 Cognito 用户 使用updateAttributesAPI 调用
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • 将所有奇数位置的元素移动到左半部分,将偶数位置的元素移动到右半部分

    给定一个包含正整数和负整数的数组 将所有奇数索引元素移动到左侧 将偶数索引元素移动到右侧 问题的难点是在维持秩序的同时就地做 e g 7 5 6 3 8 4 2 1 输出应该是 5 3 4 1 7 6 8 2 如果顺序不重要 我们可以使用快
  • 在没有 BluetoothManagerCallback 的情况下调用 getBluetoothService

    我正进入 状态getBluetoothService called with no BluetoothManagerCallback在我的 Android 应用程序中经常出现错误 我不知道是什么原因导致这个或任何有关蓝牙管理器回调的事情 谁
  • RxSwift、RxCocoa 和 UITableview

    我在使用 RxSwift 实现 UITableView 时遇到问题 我尝试使用以下代码将模型数组的可观察对象绑定到表项 models bind to self tableView rx items cellIdentifier Cell c
  • iOS 中的词干 - 不适用于单个单词

    我在用NSLinguisticTagger用于词干提取 我能够获得句子中单词的词干 但无法获得单个单词的词干 以下是我正在使用的代码 NSString stmnt i waited NSLinguisticTaggerOptions opt
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐