1. 简介
刚刚毕业接触到了一个挺有意思的蓝牙TWS (Bluethooth True Wireless Stereo)的项目。由于在建立语音通路SCO(Synchronous Connection Oriented link)时,对实时性要求很高。TWS Master 将SCO数据转发给TWS Slave,会造成多个场景下的卡顿或延迟。
因此考虑通过TWS Slave建立一个虚拟的SCO链路来监听 Moble和 TWS Master的通话内容。
实时监听,不用担心转发不及时所产生的卡顿等问题;
降低了TWS Master的功耗;
可以随时进行主副耳的切换以及麦克的切换。
2. 技术路线
建立一个无连接的ACL(Asynchronous Connection Less)链路;
建立一个无连接的SCO链路;
TWS双耳联调。
3. 调试
蓝牙构建一个sniffer大多功能是在controller中实现的,所以使用WVT(Waves Validation Tool)向controller下发HCI (Host control interface) command会大大提升调试效率。我们可以选择一款CSR的Bluetooth Dongle,通过WVT工具与controller进行链接。这样我们就完全脱离了HOST的控制,单纯对controller进行开发与调试。
- Register debug handler
本IP的HCI command handler使用的是一种查表的方式,通过提前注册好的OP Code,来查找相应的debug服务函数;
- Send HCI command from WVT
利用WVT,将蓝牙适配器和controller进行连接,下发HCI命令;
- Callback the debug function
执行回调函数,并且返回执行状态给WVT
HCI调试接口示例代码片
static int
dbg_set_sniffer_env_handler(ke_msg_id_t const msgid, struct dbg_sniffer_env_cmd const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
// structure type for the complete command event
struct hci_basic_cmd_cmp_evt *event;
// allocate the status event message
event = KE_MSG_ALLOC(HCI_CMD_CMP_EVENT, src_id, HCI_DBG_SET_SNIFFER_ENV_CMD_OPCODE, hci_basic_cmd_cmp_evt);
ld_set_sniffer_env(param->sniffer_active, param->sniffer_role, param->monitored_dev_addr.addr, param->sniffer_dev_addr.addr);event->status = CO_ERROR_NO_ERROR;
// sends the messagehci_send_2_host(event);
return (KE_MSG_CONSUMED);
}
目前已经成功监听到了TWS Master和手机的通话,可以稳定监听2分钟以上的电话,接下来会不定时地详细更新技术路线。
大家多交流,刚入门菜鸡一只,期待指教!