天天看點

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

今天将詳細的講解下低功耗藍牙裝置和手機連接配接時的抓包,以此幫助我這樣的小白,并積累經驗~

我用的外設晶片是DA14580晶片,協定棧是Dialog的IP藍牙協定棧,和手機相連,利用sniffer packet抓包~歡迎指導交流

首先來了解下理論知識,更新參數即在藍牙主從裝置建立連接配接之後,主裝置或從裝置發起的對連接配接過程中參數的更改的行為,下面我們進行的是從裝置發起連接配接參數更改請求,主裝置接收請求并更改參數:

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

從上圖可以很清楚的看出從機發起連接配接時,和主機的互動流程。

然後進行操作,将Dongle和低功耗藍牙開發闆連上電腦,開發闆中的程式運作起來~走起

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

進入到sniffer packet中(sniffer packet不會的請自行百度啊),單擊上圖中的三角形,運作抓包工具,如下,可以看到很多廣播資料包

出現如下圖所示的InitA,即進行連接配接

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

上圖不清楚,下面用表格将圖中的關鍵參數列出來~

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數
低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

上圖中的參數為:

Channel:0x25,廣播信道,轉化為十進制為37;低功耗藍牙的廣播位址為37/38/39中的任意一個;

InitA:連接配接發起者的藍牙裝置位址,長度為6位元組;

AdvA:廣播者的藍牙裝置位址,長度為6位元組;

AcessAddr:接入位址,在兩個低功耗裝置建立連接配接之前,master裝置負責生成接入位址,類似于一個四個位元組的随機數,當連接配接建立之後,master和slave都使用該位址進行通信;連接配接斷開後,接入位址自動失效。

CRCInit:CRC初始值,是master和slave用來驗證資料包的完整性的。

WinSize:定義了裝置每次開啟收發機的視窗時間,無論是master還是slave,都遵循WinSize的定義。

WinOffset:定義了在CONNECT_REQ指令之後的一個通信視窗的偏移量,在slave裝置接收到請求指令後,裝置需要占用一些時間,根據LLData參數進行一些相關的配置。

在CONNECT_REQ之後,第一個由master發送到slave的資料幀,稱為“錨點”,因為之後的所有的連接配接事件都以該時刻為基準。

ConnInterval的取值範圍在7.5ms至4s之間,是以,确定錨點之後,master和slave将按照ConnInterval确定的時間間隔進行資料互動。

ConnInterval = Interval*1.25ms

對低功耗藍牙技術,為了實作低功耗特性,不需要每次ConnInterval都産生連接配接事件,是以引入參數 Latency,可以有效減少連接配接事件的産生,ConnSlaveLatency = Latency,這個參數定義了slave裝置可以忽略多少個連續的連接配接事件,這表示slave不需要在每個連接配接事件産生的時刻都喚醒并打開射頻接收機進行幀聽,進而減少slave裝置的功耗。

Timeout:定義了連接配接逾時的長度,connSupervisionTimeout = Timeout*10ms,其值再100ms到32s之間。

注意:connSupervisionTimeout必須大于(1+ ConnSlaveLatency)*ConnInteral*2。否則,slave裝置在Lantency狀态,也會被認為是連接配接逾時而導緻連接配接斷開。

ChM和Hop:跳頻相關的,當連接配接建立以後,master和slave按照預先設定的信道圖譜,和跳頻跨度進行跳頻工作。信道圖譜來自ChM參數,每跳跨度來自Hop參數。Hop的取值範圍在5—16之間。

我進行了外設發起連接配接參數更新的請求,手機端判斷是否接受該請求并更新參數。下面是外設發起更新參數的過程

低功耗藍牙裝置DA1458x晶片開發之更新連接配接參數

從上圖可以看出,外設給出了最小Interval和最大Interval,SlaveLatency為0,Timeout時間延長。ATT将資料傳輸到LL層,粉色的LL層給出詳細參數請求。

之後,土黃色的L2CAP層收到來自手機端的應答,其Result為0x0000,表示更新參數成功。

至此,低功耗藍牙外設發起參數更新的過程結束啦~撒花~

繼續閱讀