用蓝牙搭建一个sniffer来监听通话

1. 简介

刚刚毕业接触到了一个挺有意思的蓝牙TWS (Bluethooth True Wireless Stereo)的项目。由于在建立语音通路SCO(Synchronous Connection Oriented link)时,对实时性要求很高。TWS Master 将SCO数据转发给TWS Slave,会造成多个场景下的卡顿或延迟。

因此考虑通过TWS Slave建立一个虚拟的SCO链路来监听 Moble和 TWS Master的通话内容。

  1. 实时监听,不用担心转发不及时所产生的卡顿等问题;

  2. 降低了TWS Master的功耗;

  3. 可以随时进行主副耳的切换以及麦克的切换。

2. 技术路线

  1. 建立一个无连接的ACL(Asynchronous Connection Less)链路;

  2. 建立一个无连接的SCO链路;

  3. TWS双耳联调。

3. 调试

蓝牙构建一个sniffer大多功能是在controller中实现的,所以使用WVT(Waves Validation Tool)向controller下发HCI (Host control interface) command会大大提升调试效率。我们可以选择一款CSR的Bluetooth Dongle,通过WVT工具与controller进行链接。这样我们就完全脱离了HOST的控制,单纯对controller进行开发与调试。

  1. Register debug handler

本IP的HCI command handler使用的是一种查表的方式,通过提前注册好的OP Code,来查找相应的debug服务函数;

  1. Send HCI command from WVT

利用WVT,将蓝牙适配器和controller进行连接,下发HCI命令;

  1. 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分钟以上的电话,接下来会不定时地详细更新技术路线。
大家多交流,刚入门菜鸡一只,期待指教!

你可能感兴趣的:(用蓝牙搭建一个sniffer来监听通话)