TWS实现数据互发原理
📎 原始文档:https://www.kdocs.cn/l/ctaS8a4KtFqJ TWS实现数据互发原理
1. 核心API
主要通过 tws_api_send_data_to_sibling 或 tws_api_send_data_to_slave 这两个API实现数据发送:
int tws_api_send_data_to_sibling(void *data, u16 len, u32 func_id);
int tws_api_send_data_to_slave(void *data, int len, u32 func_id);
- data:要发送的数据指针
- len:数据长度
- func_id:功能ID(用于区分不同的同步/命令类型)
2. 典型用法举例
发送数据
如在 apps\soundbox\mode\bt\bt_tws.c:
void bt_tws_sync_volume()
{
if (app_in_mode(APP_MODE_BT) == 0) {
return; //非蓝牙模式不同步音量防止声音突变
}
u8 data[2];
data[0] = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
data[1] = app_audio_get_volume(APP_AUDIO_STATE_CALL);
tws_api_send_data_to_slave(data, 2, TWS_FUNC_ID_VOL_SYNC);
}
注册接收回调
通过 REGISTER_TWS_FUNC_STUB 宏注册接收回调,收到数据后自动分发到对应处理函数。例如:
REGISTER_TWS_FUNC_STUB(app_vol_sync_stub) = {
.func_id = TWS_FUNC_ID_VOL_SYNC,
.func = bt_tws_vol_sync,
};
- 当对耳收到带有 TWS_FUNC_ID_VOL_SYNC 的数据时,会调用 bt_tws_vol_sync 处理。
接收数据
接收端接收数据的回调如下,可在回调内处理接收的数据:
static void bt_tws_vol_sync(void *_data, u16 len, bool rx)
{
if (rx) {
u8 *data = (u8 *)_data;
if (app_in_mode(APP_MODE_BT) == 0) {
app_audio_set_volume(APP_AUDIO_STATE_CALL, data[1], 1);
r_printf("vol_sync: %d\n", data[1]);
return; //非蓝牙模式不同步音量防止声音突变
}
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, data[0], 1);
app_audio_set_volume(APP_AUDIO_STATE_CALL, data[1], 1);
r_printf("vol_sync: %d, %d\n", data[0], data[1]);
}
}
3. 发送流程总结
- 发送端:调用 tws_api_send_data_to_sibling,指定数据和功能ID。
- 接收端:通过 REGISTER_TWS_FUNC_STUB 注册的回调函数自动收到并处理数据。
- 功能ID:用于区分不同类型的数据同步或命令。
4. 典型应用场景
- 音量同步、LED状态同步、协议数据同步、音频帧同步等。
- 可以仿照现有的电量同步或者音量同步等的格式去自定义数据收发。
5. 其它说明
- 数据长度一般要求 ≤ 512 字节。
- 发送的数据会通过TWS链路传递到对耳。
- 通过功能ID和回调机制,支持多种同步和命令类型的灵活扩展。