15 协议栈能力

对于不同的软件包、不同的芯片系列,协议栈能力不同,汇总76于表 15.1,表 15.2,表 15.3 和 表 15.4

表 15.1: {typical, extension, exp} 软件包协议栈能力
系列 广播集数目 连接数目 白名单容量 CTE 最大 MTU
ING9188X \(8\) \(8\) \(16\) \(\checkmark\) \(247\)
ING9187X \(8\) \(8\) \(16\) \(247\)
ING9168X \(5\) \(5\) \(8\) \(\checkmark\) \(247\)
ING20X \(2\) \(2\) \(4\) \(\checkmark\) \(247\)
表 15.2: {mass_conn} 软件包协议栈能力
系列 广播集数目 连接数目 白名单容量 CTE 最大 MTU
ING9188X \(8\) \(26\) \(24\) \(\checkmark\) \(247\)
ING9187X \(8\) \(26\) \(24\) \(247\)
ING9168X \(5\) \(10\) \(10\) \(\checkmark\) \(247\)
ING20X \(5\) \(5\) \(5\) \(\checkmark\) \(247\)
表 15.3: {mini} 软件包协议栈能力
系列 广播集数目 连接数目 白名单容量 CTE 最大 MTU
ING9188X \(1\) \(1\) \(4\) \(\checkmark\) \(247\)
ING9187X \(1\) \(1\) \(4\) \(247\)
ING9168X \(1\) \(1\) \(4\) \(\checkmark\) \(247\)
ING20X \(1\) \(1\) \(4\) \(\checkmark\) \(247\)
表 15.4: {rom} 软件包协议栈能力
系列 广播集数目 连接数目 白名单容量 CTE 最大 MTU
ING20X \(1\) \(1\) \(4\) \(\checkmark\) \(247\)

其中,ING20X 的 rom 软件包功能类似 extension 软件包,但协议栈能力类似 mini 软件包。

通过 ll_get_capabilitiesbtstack_get_capabilities 可分别获取链路层和 Host 的协议栈能力77


  1. https://www.bluetooth.com/↩︎

  2. https://ingchips.github.io/application-notes/an_aoa/index.html↩︎

  3. 特殊情况下,Controller、Host 也可以融合到一起运行,请参考 SDK 示例 Peripheral Console (Real-time)↩︎

  4. FreeRTOS 提供了 uxTaskPriorityGetvTaskPrioritySet 等,用于查询和修改优先级。↩︎

  5. 如无特殊说明,本文档中的 App 皆指运行在芯片上的蓝牙程序。↩︎

  6. 指示服务器端主动报告特征的值。↩︎

  7. https://www.bluetooth.com/16-bit-uuids-for-sdos/↩︎

  8. 私有事件(如 HCI_SUBEVENT_LE_VENDOR_PRO_CONNECTIONLESS_IQ_REPORT)除外。↩︎

  9. Core Specification Supplement, Part B, Common Profile and Service Error Codes↩︎

  10. 更准确地说,只是把一条 HCI 消息放入消息队列。↩︎

  11. https://ingchips.github.io/blog/2021-01-25-zig-async/↩︎

  12. 地址改变后,曾与之配对的设备无法自动重连。↩︎

  13. 参照蓝牙核心规范。↩︎

  14. ING918 芯片家族不支持此特性。↩︎

  15. 称为一个 PDU 队列(train)。↩︎

  16. AuxPtr 里的时间偏移略有不同。↩︎

  17. 将原始编号再映射到当前的信道集合得到实际的信道号。↩︎

  18. Periodic Advertising Sync Transfer。↩︎

  19. SDK v9.0.1 或更新版本。↩︎

  20. PAwR 每个子事件、每个响应都只包含一个数据包,不支持 PDU 队列。↩︎

  21. https://github.com/ingchips/ING918XX_SDK_SOURCE/blob/75cbf9928711c39e0b234ae11796bc1696111998/bundles/typical/inc/platform_api.h#L265↩︎

  22. 旧版本下可以由 Host 随机更新 RPA,一般由软件实现,所以功率比用 Controller 实现功耗高。↩︎

  23. 广播间隔小于 \(3.75ms\)↩︎

  24. 在不引起混淆的前提下,本手册混用“广播”、“广播集”这两个名词。↩︎

  25. 请参阅 SDK 用户手册。↩︎

  26. 关闭之后,其它设备无法再与该周期广播建立同步。↩︎

  27. 后两种策略在规范中称为 Extended filter policy。ING916 和 ING918 不支持后两种策略。↩︎

  28. 即周期性地接收周期广播。↩︎

  29. 需要连接多个设备,使用白名单方式效率更高。↩︎

  30. 参考 《Controller API Reference》。↩︎

  31. 对于 v8.2 以下版本,这个函数仅用于主角色, 从角色需要使用 l2cap_request_connection_parameter_update 请求更新。↩︎

  32. 调用之前建议先检查对方是否支持此特性。此 API 无论主从角色都可以调用。↩︎

  33. 在不引起混淆的前提下,本手册混用 ATT 服务器、GATT 服务器,代码里也用 att_server 代指 gatt_server↩︎

  34. 事实上,这几件事已由 Wizard 工具代劳。↩︎

  35. 在手册、工具、代码的不同位置可能使用了不同的名词,如 Profile 数据库、GATT 数据库、GATT 数据等。↩︎

  36. 协议栈里称为“会话”,规范里称为“队列”。↩︎

  37. 仅适用于有响应的写入,无响应的写入无效。↩︎

  38. 解决方法参考 L2CAP 传输队列↩︎

  39. 解决方法参考 L2CAP 传输队列↩︎

  40. 以及转发过来的 L2CAP_EVENT_CAN_SEND_NOW 事件。↩︎

  41. SDK v8.4.23 及以上版本。↩︎

  42. SDK v8.4.23 及以上版本。↩︎

  43. 5.1 及更低版本里称为 LE_PSM↩︎

  44. 整个 SDU 只占用一个 K 帧↩︎

  45. 整个 SDU 占用多个 K 帧 这个事件对应其中一个 K 帧↩︎

  46. 指进入链路层发送队列。↩︎

  47. 当信用点用完或者链路层队列已满时,会出现此情况↩︎

  48. att_server_request_can_send_now_event 是基于 att_dispatch_server_request_can_send_now_event 实现的。↩︎

  49. 生成时需要保证具有足够高的熵。↩︎

  50. IRK、DHK、LTK、CSRK 等的具体含义及作用请参考蓝牙核心规范。↩︎

  51. 以及给予用户必要的提示的能力。↩︎

  52. 没必要过于频繁地更新地址。尤其是对于可解析地址,每更新一次,就意味着泄露了一点关于 IRK 的消息。↩︎

  53. 注意:当该广播是可连接的并且正在广播时,不允许修改地址。↩︎

  54. https://www.bluetooth.com/learn-about-bluetooth/key-attributes/bluetooth-security/method-vulnerability/↩︎

  55. dx.doi.org/10.6028/NIST.FIPS.186-4↩︎

  56. BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 3, Part H, 2.3.6↩︎

  57. 典型值。不同软件包有所不同。↩︎

  58. 更多信息请参考《Application Note: Direction Finding Solution》, https://ingchips.github.io/application-notes/an_aoa/sdk-support.html#proprietary-solution-2↩︎

  59. ING918 不支持此功能。↩︎

  60. 关于原理、使用方法等更多信息请参考《使用 ING916 定位传统蓝牙设备》,https://ingchips.github.io/blog/2023-03-11-legacy-aoa/↩︎

  61. 更多信息请参考《Application Note: Direction Finding Solution》, https://ingchips.github.io/application-notes/an_aoa/sdk-support.html#proprietary-solution-2↩︎

  62. 本节功能中,ING918 仅支持自定义连接间隔。↩︎

  63. 参见蓝牙核心规范 Vol 3, Part H, 2.3.5.6 LE Secure Connections pairing phase 2.↩︎

  64. 参考《Application Note: Direction Finding Solution》。↩︎

  65. 参考《Controller API Reference》。↩︎

  66. 参考《Controller API Reference》。↩︎

  67. 为防止与 Media Access Controller 混淆,蓝牙规范使用 MIC 代替 MAC。↩︎

  68. https://ingchips.github.io/blog/2021-06-02-sdk-6/#%E5%85%BC%E5%AE%B9%E6%80%A7↩︎

  69. 只能在 app_main 就调用。↩︎

  70. 对于 v8.4.12 或更旧的版本,所能存储的设备个数等于软件包所支持的连接数目。↩︎

  71. 为多个连接创建多个同步执行器的优势在于多个 GATT 客户端上的会话可以并发。↩︎

  72. 由规范规定。↩︎

  73. https://www.bluetooth.com/specifications/assigned-numbers/↩︎

  74. 这个函数的原始版本不是严格意义上的异步操作。考虑到在一个同步执行体内可能既会用到有响应的写入,也会用到无响应的写入,加入这个 API 可以带来便利。↩︎

  75. 可以使用 btstack_push_user_runnable↩︎

  76. 依据 SDK v9.0.0。ING916XX 协议栈能力可能发生变化。↩︎

  77. 限 SDK v8.4.13 或更高版本。↩︎


  1. 依据 SDK v9.0.0。ING916XX 协议栈能力可能发生变化。↩︎

  2. 限 SDK v8.4.13 或更高版本。↩︎