连接
连接是 BLE 设备之间数据传输的基础。连接通过主设备(Central)和从设备(Peripheral)之间的交互建立。 在阅读本节内容之前,建议先阅读 连接 章节,了解 BLE 连接的相关介绍。
GAP 层
GAP 层是 BLE 协议栈的控制层,负责管理连接、断开连接、连接参数管理等。在 NimBLE 中,其 API 接口在 ble_gap.h
文件中定义。
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 同样可以发起配对请求。此外在访问加密的服务或者属性时也会自动触发配对。