因为ios进行配对之后,ios会有一个智能回连机制,会一直尝试回连设备,设备处于可被发现就会被连接上,此时ble是单设备连接,连接会被占用会造成其它设备连接不上的情况
针对ios手机进行配对之后无法断开连接的问题提出解决方案
一、断连时幕布端清除设备配对信息
会导致投影不能自动回连,每次开机需要重新配对,且ios设备本地已有配对信息此时和幕布端的配对信息不匹配会连接不上需要用户手动忘记该配对信息
二、引导ios用户手动忘记本地蓝牙配对信息
此时回到最初状态,重新配对连接
三、ble配置支持多设备连接
1. GATT 连接建立的前提
在 BLE 通信中,设备分为 Central(中心设备) 和 Peripheral(外围设备)。
Peripheral 负责广播(advertising),等待 Central 设备连接。
Central 负责扫描(scanning),并主动发起连接。
连接成功后,双方进入 GATT 通信阶段。
2. GATT 连接建立流程
1) Peripheral 设备:广播(Advertising)
Peripheral 设备会广播自己的 UUID、名称、服务等信息,等待 Central 设备连接。
在 RTL8762 中,Peripheral 设备通常使用 gap.h 提供的 API 进行广播:
#include "gap.h"
#include "gap_adv.h"
// 广播数据
static const uint8_t adv_data[] = {
0x02, // 长度
GAP_ADTYPE_FLAGS, // 广播类型
GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
0x03, // 长度
GAP_ADTYPE_16BIT_MORE, // UUID
LO_UINT16(0xFFF0), HI_UINT16(0xFFF0)
};
// 设置广播参数
void setup_advertising(void) {
le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), (void*)adv_data);
le_adv_start(); // 开始广播
}
Peripheral 设备调用 le_adv_start()
开启广播。
2) Central 设备:扫描 & 连接
Central 设备会扫描周围的 BLE 设备,并选择目标 Peripheral 进行连接。
在 RTL8762 中,Central 设备通常使用 gap.h 提供的 API 进行扫描:
#include "gap.h"
#include "gap_scan.h"
// 扫描回调
void scan_callback(T_LE_SCAN_INFO *p_info) {
printf("发现设备: %02X:%02X:%02X:%02X:%02X:%02X\n",
p_info->bd_addr[5], p_info->bd_addr[4], p_info->bd_addr[3],
p_info->bd_addr[2], p_info->bd_addr[1], p_info->bd_addr[0]);
// 发现目标设备后,停止扫描并发起连接
le_scan_stop();
le_connect(p_info->bd_addr, GAP_REMOTE_ADDR_LE_PUBLIC);
}
// 开启扫描
void start_scan(void) {
le_scan_start();
}
复制编辑
当 le_scan_start()
发现目标设备后,会调用 le_connect()
进行连接。
3) 连接建立 & GATT 服务发现
连接成功后,BLE 设备进入 GATT 通信阶段,包括:
连接事件回调
连接建立后,gap_conn.h
触发 gap_conn_callback()
回调:
void gap_conn_callback(uint8_t conn_id, T_GAP_CONN_STATE new_state) {
if (new_state == GAP_CONN_STATE_CONNECTED) {
printf("BLE 连接成功, Conn ID: %d\n", conn_id);
le_gatt_discover_services(conn_id); // 发现 GATT 服务
}
}
GATT 服务发现 在连接建立后,Central 设备会发送 ATT 请求,查询 Peripheral 设备上的 GATT 服务:
void discover_services(uint8_t conn_id) {
le_gatt_discover_services(conn_id);
}
GATT 读写特征值 发现 GATT 服务后,可以读取或写入特征值:
void read_characteristic(uint8_t conn_id, uint16_t handle) {
le_gatt_read(conn_id, handle);
}
void write_characteristic(uint8_t conn_id, uint16_t handle, uint8_t *data, uint16_t length) {
le_gatt_write(conn_id, handle, data, length);
}
总结
在 RTL8762 BLE GATT 连接建立过程中:
Peripheral 设备 通过
le_adv_start()
开启广播。Central 设备 通过
le_scan_start()
扫描设备,并调用le_connect()
进行连接。连接建立后,Central 设备调用
le_gatt_discover_services()
发现 GATT 服务。GATT 交互阶段,Central 设备可以使用
le_gatt_read()
读取特征值,或le_gatt_write()
写入数据。
整个过程符合 BLE 标准协议,RTL8762 提供了 gap.h
和 gap_conn.h
等 API,简化了 GATT 连接建立和数据交互。