可视化工具一拖二tws+dongle一对一唯一快连配置
📎 原始文档:https://www.kdocs.cn/l/ctUPmgjtkU6t 可视化工具一拖二tws+dongle一对一唯一快连配置
以下修改即可实现dongle设备与耳机设备的一对一edr快连,dongle设备与耳机的默认快连是通过由蓝牙名生成快连码;修改为一对一快连后:耳机与dongle设备在首次连接还是通过蓝牙名生成的快连码做连接,在首次连接成功后,双方获取到各自的蓝牙mac地址,通过双方的mac地址生成唯一的蓝牙快连地址并保存至VM区,之后即是通过唯一快连地址去连接。
添加以下的一对一唯一快连配置后,如需添加修改清除双方一对一快连信息,则参考可视化工具一拖二tws+dongle-耳机与dongle之间实现通信控制.otl
【耳机端】
1.【syscfg_id.h】

#define CFG_USER_EDR_QUICK_ADDR 3
#define CFG_USER_DONGLE_ADDR 4
2.【earphone.c】

u8 bt_addr[6];
u8 local_addr[6];
u8 edr_quick_addr[6];

printf(">BT_STATUS_CONNECTED<\n");
int ret = syscfg_read(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
if(ret != sizeof(edr_quick_addr) || !strcmp(edr_quick_addr,0)){
memcpy(bt_addr ,bt->args, 6);
put_buf(bt_addr,6);
if(btstack_get_dev_type_for_addr(bt_addr) == REMOTE_DEV_DONGLE_SPEAK){
printf("CONNECT_DEV_IS_DONGLE\n");
syscfg_read(CFG_BT_MAC_ADDR, local_addr, 6);
put_buf(local_addr,6);
for(u8 i=0; i<6; i++){
edr_quick_addr[i] = local_addr[i] + bt_addr[i];
}
put_buf(edr_quick_addr,6);
if(edr_quick_addr){
syscfg_write(CFG_USER_DONGLE_ADDR, bt_addr, 6);
syscfg_write(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
}
}
}
printf("-------------------------\n");

#if TCFG_BT_DONGLE_ENABLE
u16 bt_get_quick_con_indicate()
{
printf("<bt_get_quick_con_indicate>\n");
u8 edr_quick_addr[6];
u16 crc = 0;
crc = CRC16(bt_get_local_name(), strlen(bt_get_local_name()));
int ret = syscfg_read(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
if(ret == sizeof(edr_quick_addr) && strcmp(edr_quick_addr,0)){
printf("----have_quick_addr----\n");
for (u8 i = 0; i < 6; i++){
crc += edr_quick_addr[i];
}
}
printf(">>local_name:%s",bt_get_local_name());
return 0xfd + crc;
}
#endif
【dongle端】
1.【syscfg_id.h-dongle程序】

#define CFG_USER_EDR_QUICK_ADDR 2
2.【bt_status_event.c】

u8 bt_addr[6];
u8 local_addr[6];
u8 edr_quick_addr[6];

printf(">BT_STATUS_CONNECTED<\n");
int ret = syscfg_read(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
if(ret != sizeof(edr_quick_addr) || !strcmp(edr_quick_addr,0)){
memcpy(bt_addr ,bt->args, 6);
put_buf(bt_addr,6);
syscfg_read(CFG_BT_MAC_ADDR, local_addr, 6);
put_buf(local_addr,6);
for(u8 i=0; i<6; i++){
edr_quick_addr[i] = local_addr[i] + bt_addr[i];
}
put_buf(edr_quick_addr,6);
if(edr_quick_addr){
syscfg_write(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
}
printf("-------------------------\n");
}
3.【user_cfg.c】

u16 bt_get_quick_con_indicate()
{
printf("<bt_get_quick_con_indicate>\n");
u8 edr_quick_addr[6];
u16 crc = 0;
crc = CRC16(bt_get_local_name(), strlen(bt_get_local_name()));
int ret = syscfg_read(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
if(ret == sizeof(edr_quick_addr) && strcmp(edr_quick_addr,0)){
printf("----have_quick_addr----\n");
for (u8 i = 0; i < 6; i++){
crc += edr_quick_addr[i];
}
}
printf(">>local_name:%s",bt_get_local_name());
return 0xfd + crc;
}
补充:耳机关机再开机概率不连接dongle只回连蓝牙;处理方法如下,耳机端添加TWS同步快连地址

#define TWS_FUNC_ID_ADDR_SYNC TWS_FUNC_ID('A', 'D', 'D', 'R')
u8 dongle_bt_addr[6];
void tws_sync_quick_deal(void){
printf("tws_sync_quick_deal\n");
u8 bt_addr[6];
u8 local_addr[6];
u8 edr_quick_addr[6];
memcpy(bt_addr ,dongle_bt_addr, 6);
syscfg_read(CFG_TWS_COMMON_ADDR, local_addr, 6);
printf("user:put buf-local_addr:\n");
put_buf(local_addr,6);
for(u8 i=0; i<6; i++){
edr_quick_addr[i] = local_addr[i] + bt_addr[i];
}
printf("user:put buf-edr_quick_addr:\n");
put_buf(edr_quick_addr,6);
if(edr_quick_addr){
syscfg_write(CFG_USER_DONGLE_ADDR, bt_addr, 6);
syscfg_write(CFG_USER_EDR_QUICK_ADDR, edr_quick_addr, 6);
}
}
static void bt_tws_quick_addr_sync(void *_data, u16 len, bool rx)
{
if (rx) {
u8 *data = (u8 *)_data;
memcpy(dongle_bt_addr,data,6);
sys_timeout_add(NULL,tws_sync_quick_deal,1000);
}
}
REGISTER_TWS_FUNC_STUB(app_addr_sync_stub) = {
.func_id = TWS_FUNC_ID_ADDR_SYNC,
.func = bt_tws_quick_addr_sync,
};
void bt_tws_sync_addr_send(u8 *addr)
{
printf("bt_tws_sync_addr_send\n");
u8 data[6];
memcpy(data,addr,6);
tws_api_send_data_to_slave(data, 6, TWS_FUNC_ID_ADDR_SYNC); //发送数据给对耳
}