更多内容请参照我的个人站点: http://stackvoid.com/
ACL 链路在 Bluetooth 中非常重要,一些重要的应用如 A2DP, 基于 RFCOMM 的应用,BNEP等都要建立 ACL 链路,发送/接收ACL 包。今天跟大家一起来分析 ACL 包发送/接收流程,以及涉及到的重要 command/event。
ACL包发送
下面的图(点击大图)是各种应用层使用 L2CAP 的 API:L2CA_DataWrite 发送数据流的过程,此API继续往下走,我仅分析了正常数据流的走向(暂时没有考虑别的情况)。
应用层数据到 L2CAP 的入口
我们假设一个听音乐的场景,Mike跟大家一起分析音乐数据流 AVDTP 以下层的传送。
在 AVDTP 中,所有的功能想发送 Data,必须调用 avdt_ad_write_req 这个函数,Mike 就从这个函数入手分析。
1 //当CCB或SCB给l2cap的 Channel 发送数据时,他们最终都会使用到L2CAP的 API:L2CA_Data_Write
2 UINT8 avdt_ad_write_req(UINT8 type, tAVDT_CCB *p_ccb, tAVDT_SCB *p_scb, BT_HDR *p_buf)
3 {
4 UINT8 tcid;
5
6 /* get tcid from type, scb */
7 tcid = avdt_ad_type_to_tcid(type, p_scb);
8
9
10 return L2CA_DataWrite(avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid, p_buf);
11 }
12 //L2CA_DataWrite的返回形式有三种,分别是:
13 //1. L2CAP_DW_SUCCESS:此数据写成功
14 //2.L2CAP_DW_CONGESTED:写数据成功,但是当前信道拥堵
15 //3.L2CAP_DW_FAILED:写数据失败