14 协议栈能力

对于不同的软件包、不同的芯片系列,协议栈能力不同,汇总74于表 14.1,表 14.2 和 表 14.3

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

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


  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. PAwR 每个子事件、每个响应都只包含一个数据包,不支持 PDU 队列。↩︎

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  70. 由规范规定。↩︎

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

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

  73. 可以使用 btstack_push_user_runnable↩︎

  74. 依据 SDK v8.3.7。ING916XX 协议栈能力可能发生变化。↩︎

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


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

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