零. 概述
主要介紹下藍牙協議堆疊(bluetooth stack)傳統藍牙音頻協議之高質量音頻分布協議(A2DP) 連接播放音樂斷開流程(被連接)介紹
一. 宣告
本專欄文章我們會以連載的方式持續更新,本專欄計劃更新內容如下:

第一篇:藍牙綜合介紹 ,主要介紹藍牙的一些概念,產生背景,發展軌跡,市面藍牙介紹,以及藍牙開發板介紹,
第二篇:Transport層介紹,主要介紹藍牙協議堆疊跟藍牙芯片之前的硬體傳輸協議,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:傳統藍牙controller介紹,主要介紹傳統藍牙芯片的介紹,包括射頻層(RF),基帶層(baseband),鏈路管理層(LMP)等
第四篇:傳統藍牙host介紹,主要介紹傳統藍牙的協議堆疊,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的協議吧,
第五篇:低功耗藍牙controller介紹,主要介紹低功耗藍牙芯片,包括物理層(PHY),鏈路層(LL)
第六篇:低功耗藍牙host介紹,低功耗藍牙協議堆疊的介紹,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:藍牙芯片介紹,主要介紹一些藍牙芯片的初始化流程,基于HCI vendor command的擴展
第八篇:附錄,主要介紹以上常用名詞的介紹以及一些特殊流程的介紹等,
另外,開發板如下所示,對于想學習藍牙協議堆疊的最好人手一套,以便更好的學習藍牙協議堆疊,相信我,學完這一套視頻你將擁有修改任何協議堆疊的能力(比如Linux下的bluez,Android下的bluedroid),

-------------------------------------------------------------------------------------------------------------------------
CSDN學院鏈接(進入選擇你想要學習的課程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144
藍牙交流扣扣群:970324688
Github代碼:https://github.com/sj15712795029/bluetooth_stack
入手開發板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708
藍牙學習目錄:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900
--------------------------------------------------------------------------------------------------------------------------
2. A2DP連接播放音樂斷開流程(被連接)
此部分就不再整理從HCI到L2CAP到AVDTP連接的程序,直接貼出來AVDTP以及A2DP的互動

步驟1)手機發起AVDTP discover命令來問詢開發板支持的SEID,開發板回復
步驟2)手機根據SEID來獲取SEP的可配置資訊,開發板回復
步驟3)手機來設定播放的一些引數(采樣率,通道數,位寬等),開發板回復
步驟4)手機開打開SEP,開發板回復
步驟5)手機發送Start指令準備播放音樂,開發板回復
步驟6)手機發送音樂
步驟7)手機暫停播放,開發板回復
步驟8)手機關閉SEP,開發板回復
我們來一一解釋下步驟:
步驟1)手機發起AVDTP discover命令來問詢開發板支持的SEID,開發板回復

① 手機發送AVDTP discover命令問詢開發板支持的SEID

② 目前開發板我只寫了SBC編解碼,所以只有一個SEP,開發板回復給手機

由于我寫的協議堆疊目前只是注冊一個SEID,所以這里的回復是只回復了一個
步驟2)手機根據SEID來獲取SEP的可配置資訊,開發板回復

① 手機發送Get All Capabilities來獲取開發板支持的配置

② 開發板回復支持的配置

注意此部分是A2DP注冊的,也就是說開發板告知手機我都可以支持哪些配置,其中的配置就是A2DP media information element,格式如下:

那我們填寫的配置引數是:
static const uint8_t sbc_snk_codec_caps[] =
{
AVDTP_AUDIO<<4,
AVDTP_CODEC_SBC,
A2DP_SBC_48000|A2DP_SBC_44100|A2DP_SBC_32000|A2DP_SBC_16000|\
A2DP_SBC_JOINT_STEREO|A2DP_SBC_STEREO|A2DP_SBC_DUAL_CHANNEL|A2DP_SBC_MONO,
A2DP_SBC_BLOCK_LENGTH_16|A2DP_SBC_BLOCK_LENGTH_12|A2DP_SBC_BLOCK_LENGTH_8|A2DP_SBC_BLOCK_LENGTH_4|\
A2DP_SBC_SUBBANDS_8|A2DP_SBC_SUBBANDS_4|A2DP_SBC_ALLOCATION_METHOD_LOUDNESS|A2DP_SBC_ALLOCATION_METHOD_SNR,
SBC_SNK_MIN_BITPOOL,
SBC_SNK_MAX_BITPOOL,
};
步驟3)手機來設定播放的一些引數(采樣率,通道數,位寬等),開發板回復

① 手機根據我們支持的配置引數選擇一種配置

可以看到手機選擇SBC codec,雙聲道立體音,44.1kHz的采樣率等
② 開發板回復手機

步驟4)手機開打開SEP,開發板回復

① 手機打開SEP

② 開發板回復

步驟5)手機發送Start指令準備播放音樂,開發板回復

① 手機發送start指令

此命令是手機從播放器點擊播放按鈕,發過來的指令,此命令收到后,后續手機就會持續不斷的網開發板發送音樂資料
② 開發板回復

步驟6)手機發送音樂

此部分音樂流程我們在A2DP的時候已經介紹
步驟7)手機暫停播放,開發板回復

① 手機發送暫停指令

② 開發板接受

步驟8)手機關閉SEP,開發板回復

① 手機關閉SEP

此命令一般在A2DP斷開之前會發送
② 開發板接受

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232519.html
標籤:其他
上一篇:從另一個角度去解讀Blinker,剖析精簡原始碼,學習開源精神,菜鳥哥還是忍不住對它下手了
下一篇:Cyber UART通信學習
