连接

[English]

连接是 BLE 设备之间数据传输的基础。连接通过主设备(Central)和从设备(Peripheral)之间的交互建立。 在阅读本节内容之前,建议先阅读 连接 章节,了解 BLE 连接的相关介绍。

GAP 层

GAP 层是 BLE 协议栈的控制层,负责管理连接、断开连接、连接参数管理等。在 NimBLE 中,其 API 接口在 ble_gap.h 文件中定义。

GAP 层的主要功能包括:

GAP 层主要功能

功能描述

相关 API

设备发现和广播

广播控制:’ble_gap_adv_start’, ‘ble_gap_adv_stop’, ‘ble_gap_adv_active’
广播数据设置:’ble_gap_adv_set_data’, ‘ble_gap_adv_rsp_set_data’
扫描控制:’ble_gap_disc’, ‘ble_gap_disc_cancel’, ‘ble_gap_disc_active’
扩展广播:’ble_gap_ext_adv_*’ 相关函数
周期性广播:’ble_gap_periodic_adv_*’ 相关函数

连接管理

建立连接:’ble_gap_connect’, ‘ble_gap_ext_connect’
连接参数更新:’ble_gap_update_params’
连接终止:’ble_gap_terminate’
连接状态查询:’ble_gap_conn_find’, ‘ble_gap_conn_active’
多连接支持:’ble_gap_multi_connect’

安全相关

配对和加密:’ble_gap_security_initiate’, ‘ble_gap_pair_initiate’
加密控制:’ble_gap_encryption_initiate’
解除配对:’ble_gap_unpair’, ‘ble_gap_unpair_oldest_peer’
隐私模式:’ble_gap_set_priv_mode’

物理层参数控制

PHY 设置:’ble_gap_set_prefered_le_phy’, ‘ble_gap_read_le_phy’
数据长度控制:’ble_gap_set_data_len’
子速率控制:’ble_gap_set_default_subrate’, ‘ble_gap_subrate_req’

信号质量监控

RSSI 读取:’ble_gap_conn_rssi’
路径损耗报告:’ble_gap_set_path_loss_reporting_enable’
发射功率报告:’ble_gap_set_transmit_power_reporting_enable’

事件处理

事件回调注册:’ble_gap_set_event_cb’
事件监听器:’ble_gap_event_listener_register’
支持多种事件类型,如连接、断开、加密状态改变等

测试功能

DTM(直接测试模式):’ble_gap_dtm_tx_start’, ‘ble_gap_dtm_rx_start’
增强型 DTM:’ble_gap_dtm_enh_tx_start’, ‘ble_gap_dtm_enh_rx_start’

其他功能

白名单管理:’ble_gap_wl_set’
设备信息读取:’ble_gap_read_rem_ver_info’
地址解析:’ble_gap_rd_local_resolv_addr’

获取配对设备列表

在 NimBLE 中,可以通过调用 ble_store_util_bonded_peers() 函数来获取已配对设备的列表。该函数会返回所有已绑定设备的信息,包括设备地址、密钥等。

设定 Channel Map

在 NimBLE 中,可以通过调用 ble_hs_hci_set_chan_class() 函数来设定 Channel Map。该函数会内部调用 Set_Host_Chan_Class 命令,告知控制器哪些数据通道是不良的,应该在未来的连接中避免使用。需要注意的是,这个设置只会影响控制器在未来建立连接或扫描/广播时可用的通道,不会触发发送 LL_CHANNEL_MAP_REQ 命令,也不会改变现有连接的通道映射。控制器可能会在未来建立连接时使用这些信息来避免不良通道,但不会对现有连接触发通道映射更新。

参考例程:

Bluedroid:

NimBLE:

多连接

多连接是 BLE 设备的一种特性,一个主设备可以同时连接多个从设备。

参考例程:

Bluedroid:

NimBLE:

BLE 安全

配对和绑定的概念:

配对 (Pairing): 两个设备同意双方建立一定级别的安全性连接。

绑定 (Bonding): 至少有一台设备向另一台设备发送安全相关信息(例如长期密钥(LTK)、连接签名解析密钥(CSRK)或身份解析密钥(IRK)),以供将来连接时使用。成功配对后,若支持绑定,则会进行密钥分发;否则,不会交换绑定信息。配对可能发生而不一定需要绑定。在配对过程中,设备会交换属性,以确定对方是否支持绑定。如果双方都不支持绑定,则不会存储对方的安全信息。

在 NimBLE 中,配对和绑定相关配置由 ble_hs_cfg 结构体定义,用户可以按需开启对应的配置项:

  • sm_io_cap: 设置 IO 能力,用于配对过程中的认证方式

  • sm_bonding: 是否启用绑定功能

  • sm_our_key_dist: 本设备分发的密钥类型
    • BLE_SM_PAIR_KEY_DIST_ENC: 加密密钥

    • BLE_SM_PAIR_KEY_DIST_ID: 身份解析密钥(IRK)

  • sm_their_key_dist: 对端设备分发的密钥类型
    • BLE_SM_PAIR_KEY_DIST_ENC: 加密密钥

    • BLE_SM_PAIR_KEY_DIST_ID: 身份解析密钥(IRK)

  • sm_mitm: 是否启用中间人保护

  • sm_sc: 是否启用安全连接(LE Secure Connections)

主动发起配对请求:

在 NimBLE 中,可以通过 ble_gap_security_initiate() 函数主动发起配对请求。

由手机端发起配对请求:

在手机端调用对应的 API 同样可以发起配对请求。此外在访问加密的服务或者属性时也会自动触发配对。