接上一篇文章,FiRa标准——蓝牙OOB技术规范(一)_UWB码农Luo的博客-CSDN博客,对FiRa标准中,蓝牙设备的发现流程进行描述。
其中,CP为FiRa Bluetooth Connector Primary, 主连接器的简称;
CS为FiRa Bluetooth Connector Secondary,辅助连接器的简称。
基于蓝牙GAP和GATT角色,有以下一些示例需要考虑:
关于蓝牙CSR的角色:广播者(Advertiser)、扫描者(Scanner)、从设备(Slave)、主设备(Master)、发起者(Initiator)。
由于几种情况有一定的相似性,重点对第一种情况和第4种情况进行了描述。
广播方,支持SCAN_REQ/SCAN_RSP流程(对主动扫描的响应)。
应使用扩展广播通道/PDUs,如果实现上支持。
Advertiser应公开在蓝牙核心规范补充V10中定义的CP UUID。
Advertiser可以在“Service Data”中公开附加参数,AD type。
部分实现可参考:
typedef struct {
uint8_t length;
uint8_t type;
uint16_t uuid;
}cp_adv_srv_t;
typedef struct {
uint8_t type : 4u;
uint8_t len : 4u;
}fira_spec_t;
//uwb 指示数据
typedef struct {
fira_spec_t fira_spec; /* 统一封装 */
uint8_t cap_bitmask;
uint8_t rssi_threshold;
}uwb_indication_data_t;
//子序列数据,长度根据uwb_indication_t.fira_spec_len决定。
uwb_indict_sq_idx = sizeof(cp_adv_srv_t) + sizeof(uwb_indication_data_t);
typedef struct {
uint8_t fira_spec_type : 4u;
uint8_t fira_spec_len : 4u;
uint16_t vendor_id;
}vendor_spec_data_t;
vendor_spec_index = uwb_indict_sq_idx + uwb_indication_t.fira_spec_len
+ sizeof(vendor_spec_data_t);
//UWB regulatory 监管信息
typedef struct {
uint8_t fira_spec_type : 4u;
uint8_t fira_spec_len : 4u;
uint8_t src_inf : 4u;
uint8_t reserved : 3u;
uint8_t outdoor_permit : 1u;
uint16_t country_code;
uint32_t timestamp;
uint16_t regul_info;
}uwb_regul_info_t;
#define UWB_REGUL_1ST_CHAN_MASK 0xF000 /* bit 15-12, 1st channel */
#define UWB_REGUL_CHAN_NUM_MASK 0x0E00 /* bit 11-9, channel numbers */
#define UWB_REGUL_OUT_INDOOR_MASK 0x0100 /* bit 8, outdoor/indoor */
#define UWB_REGUL_POWER_LIMIT_MASK 0x00FF
typedef struct {
uint8_t fira_spec_type : 4u;
uint8_t fira_spec_len : 4u;
}fira_profile_support_info_t;
/* 或封装为枚举类型,enum, 增加reserved段 */
#define FIRA_SPEC_TYPE_UWB_INDICATION 0x01
#define FIRA_SPEC_TYPE_VENDOR_SPEC 0x02
#define FIRA_SPEC_TYPE_UWB_REGUL 0x03
#define FIRA_SPEC_TYPE_PROFILE_SUPPORT 0x04
Scanner应支持主动扫描流程(通过SCAN_RSP/SCAN_REQ方法)。
如果可能,Scanner应支持扩展广播信道/PDUs。
Scanner负责实际设备的发现流程,因为其可以检测广播者,此外还应建立蓝牙连接的初始化(在蓝牙链路层作为Master),基本算法如下:
case 2/case 3默认按照case 1来执行。
在该配置中,CPR设备的广播者/外设角色行为与case 1中描述的完全相同,除了“UWB指示数据”字段中的蓝牙GAP角色指示放置到FiRa “Service Data”AD类型对象中。
广播者应支持SCAN_REQ/SCAN_RSP流程(应答主动扫描)。
广播者应使用扩展广播信道/PDUs,如果在实现中支持。
广播者应公开在蓝牙核心规范供应(Bluetooth Core Specification Supplement v10)CS UUID。
相关“Service Data”AD type结构体定义如表5所示。(基本与CP UUID的AD type相似)
接下来同样包括以下几个字段,基本与CP UUID一致:
字段名 |
大小(bits) |
UWB indication data |
24 |
Vendor specific data |
变长 |
UWB regulatory information |
变长 |
FiRa Profile Support Information |
变长 |
Scanner应支持主动扫描流程(通过SCAN_RSP/SCAN_REQ方法)。在蓝牙中,当广播者收到Scanner的SCAN_RSP/SCAN_REQ之后,可以广播应答。
如果可能,Scanner应支持扩展广播信道/PDUs。
Scanner负责实际的设备发现流程,因为其可以检测广播者,并负责建立蓝牙连接的初始化(在蓝牙链路层作为Master,即Central角色)。在双模情况下,CP端(Connector Primary,主连接器)的算法如下:
CP侧的扫描者可以在连接CS之后停止广播。如果决定使用GAP Central角色进行实际数据交换,也可以拒绝/中止来自CS侧的任何传入/正在进行的连接。
CS设备的操作与示例1的设备发现一致,仅一个例外:如若来自CP的广播对象中,“UWB指示数据”字段中指示双重GAP角色支持(BIT0,设置为0b1),则应限制连接到此类设备。相反,可以继续发现过程,以便发起与另一个设备的连接。
如果CS扫描者检测到这样的CP广播者,则可以增加广播频率或信号强度,以便从CP侧触发蓝牙连接。
补充信息:
GAP,Generic Access Profile,保证不同的蓝牙产品可以互相发现对方并建立连接。GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接。
在BLE下,GAP Role有四种: