藍牙協議分析(5)_BLE廣播通信相關的技術分析

藍牙協議分析(5)_BLE廣播通信相關的技術分析

作者:wowo 發佈於:2016-5-27 16:15 分類:藍牙

1. 前言

大家都知道,相比傳統藍牙,藍牙低功耗(BLE)最大的突破就是加大了對廣播通信(Advertising)的支持和利用。關於廣播通信,通過“玩轉BLE(1)_Eddystone beacon”和“玩轉BLE(2)_使用bluepy掃描BLE的廣播數據”兩篇文章的介紹,我們已經有了一個整體的認識。本文將依此爲基礎,從技術的角度,分析和理解BLE協議中有關廣播通信的定義和實現。

注1:之前的藍牙協議分析文章(如“藍牙協議分析(3)_藍牙低功耗(BLE)協議棧介紹”),偏向於從橫向、從大而全的角度,介紹藍牙協議,以便讓大家有一個整體的認識。而從本文開始,我們會收斂到一個個的功能點上,以功能爲出發點,從縱向的角度,遊走於藍牙協議的各個層次中,以加深對藍牙協議的理解,進而達到融會貫通的目的。

2. 概述

2.1 使用場景

在BLE協議中,廣播通信主要有兩類使用場景:

1)單一方向的、無連接的數據通信,數據發送者在廣播信道上廣播數據,數據接收者掃描、接收數據。

2)連接的建立。

後續的分析,將圍繞這兩個使用場景展開。

2.2 協議層次

在BLE協議中,和廣播通信相關的協議層次比較簡單,主要包括:

GAP-------->HCI-------->LL

LL(Link Layer)位於最底層,負責廣播通信有關功能的定義和實現,包括物理通道的選擇、相關的鏈路狀態的定義、PDU的定義、設備過濾(Device Filtering)機制的實現等。

HCI負責將LL提供的所有功能,以Command/Event的形式抽象出來,供Host使用。

GAP負責從應用程序的角度,抽象並封裝LL提供的功能,以便讓應用以比較傻瓜的方式進行廣播通信。當然,這不是必須的,也就是說,我們可以在沒有GAP參與的情況下,進行廣播通信。

3. Link Layer

3.1 狀態定義

在某一個時刻,參與廣播通信的BLE設備,從LL的角度看,可以處於如下三種狀態的一種:

Advertising,數據發送方,週期性的發送廣播數據;

Scanning,數據接收方,掃描、接收廣播數據;

Initiating,連接發起方,掃描帶有“可連接”標誌的廣播數據,一旦發現,則發起連接請求(都是由Link Layer自動完成,不需要Host軟件參與)。

3.2 PDU定義

根據應用場景的不同,處於不同狀態的BLE設備,可以發送不同類型的PDU(Packet Data Unit),具體如下。

3.2.1 PDU格式

廣播通信中,傳輸的PDU有如下的格式:

Header(16bits)Payload(長度由Header中的“Length”字段決定)

 

Header的格式如下:

PDU Type(4 bits)RFU(2 bits)TxAdd(1 bit)RxAdd(1 bit)Length(6 bits)RFU(2 bits)

PDU Type,指示PDU的類型,具體可參考後面的介紹。

RFU,reserved for future use。

TxAdd、RxAdd,由具體的PDU Type決定其意義。

Length,PDU的長度,6 bits,有效範圍是6~37 octets。

3.2.2 PDU類型

PDU類型PDU格式說明
AdvertisingADV_INDAdvA(6 octets) 
AdvData(0~31 octets)
connectable undirected advertising event,用於常規的廣播,可攜帶不超過31bytes的廣播數據,可被連接可被掃描: 
AdvA,6bytes的廣播者地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
AdvData,廣播數據。
 ADV_DIRECT_INDAdvA(6 octets) 
InitA(6 octets)
connectable directed advertising event,專門用於點對點連接,且已經知道雙方的藍牙地址,不可攜帶廣播數據,可被指定的設備連接不可被掃描: 
AdvA,6bytes的廣播者地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
InitA,6bytes的接收者(也是連接發起者)地址,並由PDU Header的RxAdd bit決定地址的類型(0 public,1 random)。
 ADV_NONCONN_INDAdvA(6 octets) 
AdvData(0~31 octets)
和ADV_IND類似,但不可以被連接不可以被掃描
 ADV_SCAN_INDAdvA(6 octets) 
AdvData(0~31 octets)
和ADV_IND類似,但不可以被連接可以被掃描
ScanningSCAN_REQScanA(6 octets) 
AdvA(6 octets)
當接收到ADV_IND或者ADV_SCAN_IND類型的廣播數據的時候,可以通過該PDU,請求廣播者廣播更多的信息: 
ScanA,6bytes的本機地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
AdvA,6bytes的廣播者地址,並由PDU Header的RxAdd bit決定地址的類型(0 public,1 random)。
 SCAN_RSPAdvA(6 octets) 
ScanRspData(0~31 octets)
廣播者收到SCAN_REQ請求後,通過該PDU響應,把更多的數據傳送給接受者。 
AdvA,6bytes的廣播者地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
ScanRspData,scan的應答數據。
InitiatingCONNECT_REQInitA (6 octets) 
AdvA (6 octets) 
LLData (22 octets)
當接收到ADV_IND或者ADV_DIRECT_IND類型的廣播數據的時候,可以通過該PDU,請求和對方建立連接: 
InitA,6bytes的本機地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
AdvA,6bytes的廣播者地址,並由PDU Header的RxAdd bit決定地址的類型(0 public,1 random); 
LLData,BLE連接有關的參數信息,具體請參考後續文章的介紹。

 

3.2.3 總結

有關廣播通信的PDU類型,總結如下:

1)如果只需要定時傳輸一些簡單的數據(如某一個溫度節點的溫度信息),後續不需要建立連接,則可以使用ADV_NONCONN_IND。廣播者只需要週期性的廣播該類型的PDU即可,接收者按照自己的策略掃描、接收,二者不需要任何額外的數據交互。

2)如果除了廣播數據之外,還有一些額外的數據需要傳輸,由於種種原因,如廣播數據的長度限制、私密要求等,可以使用ADV_SCAN_IND。廣播者在週期性廣播的同時,會監聽SCAN_REQ請求。接收者在接收到廣播數據之後,可以通過SCAN_REQ PDU,請求更多的數據。

3)如果後續需要建立點對點的連接,則可使用ADV_IND。廣播者在週期性廣播的同時,會監聽CONNECT_REQ請求。接收者在接收到廣播數據之後,可以通過CONNECT_REQ PDU,請求建立連接。

4)通過ADV_IND/CONNECT_REQ的組合建立連接,花費的時間比較長。如果雙方不關心廣播數據,而只是想快速建立連接,恰好如果連接發起者又知道對方(廣播者)的藍牙地址(如通過掃碼的方式獲取),則可以通過ADV_DIRECT_IND/CONNECT_REQ的方式。

3.3 Advertising狀態

3.3.1 Advertising Channel的選擇

我們在“藍牙協議分析(3)_藍牙低功耗(BLE)協議棧介紹”中提到過,BLE可以使用40個Physical Channel中的3個作爲廣播通信的物理信道,綜合各種因素(抗干擾等),最終選取了如下三個:

RF ChannelRF Center FrequencyAdvertising Channel Index
02402MHz37
122426MHz38
392480MHz39

 

與此同時,Link Layer允許Host在這這三個物理信道中,任意選取一個或者多個,用於廣播。Link Layer將相同的廣播數據,在每一個被中的Channel中,發送一次。

3.3.2 Advertising Event的定義

由前面的描述可知,BLE廣播的過程中,根據使用場景的不同,會在被使用的每一個物理Channel上,發送(或接收)多種類型的PDU。基於此,BLE協議提出了“Advertising Event”的概念,即:

Advertising Event是在所有被使用的物理Channel上,發送的Advertising PDU的組合。

如果覺得有點繞口的話,我們再用用通俗的語言解釋:

BLE設備處於Advertising狀態的目的,就是要廣播數據。並且,根據應用場景的不同,可廣播4種類型的數據。

另外,BLE設備最多可以在3個物理Channel上廣播數據。也就是說,同一個數據(4中類型中的一種),需要在多個Channel上依次廣播。因此,這樣依次在多個Channel上廣播的過程,就叫做一個Advertising Event。

與此同時,有些廣播(如可連接、可掃描)發送出去之後,允許接收端在對應的Channel上,迴應一些請求(如連接請求、掃描請求)。並且,廣播者接收到掃描請求後,需要在同樣的Channel上回應。這些過程,也會計算在一個Advertising Event中。

以上可參考“BLUETOOTH SPECIFICATION Version 4.2 [Vol 6, Part B]” 4.4.2章節中的有關圖示,本文不再詳細介紹了。

3.3.3 Advertising Event Type

根據應用場景的不同(基本對應3.2.3小節所總結的4中場景),BLE協議也規定了不同類型的Advertising Event,包括:

Connectable Undirected Event;

Connectable Directed Event(包括Low Duty Cycle和High Duty Cycle);

Scannable Undirected Event;

Non-connectable Undirected Event。

不同的Advertising Event,所對應的Advertising參數(如週期等)也不同,具體請參考後面的描述。

3.3.4 Advertising週期的設定

對BLE廣播通信來說,Advertising的週期是一個比較重要的參數,因爲它關係到系統的功耗和通信的效率,因此需要根據使用場景,小心設定。

對除High Duty Cycle Connectable Directed Event之外的其它Advertising Event來說,Advertising週期主要由advInterval、advDelay兩個參數決定的,如下圖所示:

Advertising events perturbed in time using advDelay

圖片1 Advertising週期

其中,advInterval是一個可由Host設定的參數:對於Scannable Undirected和Non-connectable Undirected兩種Advertising Event,該值不能小於100ms(從功耗的角度考慮的,也決定了廣播數據的速率);對於Connectable Undirected和Low Duty Cycle Connectable Directed兩種Advertising Event,該值不能小於20ms(建立連接嘛,要快點)。

advDelay則是一個0~10ms的僞隨機數。

High Duty Cycle Connectable Directed Event則是一個比較狂暴的傢伙,其Advertising週期不受上面的參數控制,可以小到3.75ms。不過呢,BLE協議也同時規定:Link Layer必須在1.28s內退出這種狂暴狀態。名副其實的短跑冠軍啊!

注2:我們可以從上面的時間信息推斷出,BLE協議對廣播通信的期望,是非常明確的----不在乎速率、只在乎功耗。一般的廣播通信(不以連接爲目的),最高速率也就是31byte / 100ms = 2.48kbps。如果再算上可掃描的那段數據,也就是double,4.96kbps

注3:對於連接來說,如果事先不知道連接發起者的設備地址,則最快的連接速度可能是20ms。如果事先知道地址,使用High Duty Cycle Connectable Directed Event的話,則可能在3.75ms內建立連接。由此可以看出,BLE的連接建立時間,比傳統藍牙少了很多,這也是BLE設備之間不需要保持連接的原因。

3.4 Scanning狀態

3.4.1 scanWindow和scanInterval

Scanning狀態掃描、接收廣播數據的狀態,該狀態的掃描行爲是由scanWindow和scanInterval兩個參數覺得的。scanWindow指示一次掃描的時間(即可以理解爲RF RX打開的時間),scanInterval指示兩次掃描之間的間隔。如果這兩個參數的值相同,表示連續不停地掃描。

BLE協議規定,scanWindow和scanInterval最大不能超過10.24s,並且scanWindow不能大於scanInterval。

3.4.2 Passive Scanning和Active Scanning

Passive Scanning之所以稱作消極的(Passive),是因爲這種掃描模式下,BLE設備只聽不問,也就是說,只接收ADV_DIRECT_IND、ADV_IND、ADV_SCAN_IND、ADV_NONCONN_IND等類型的PDU,並不發送SCAN_REQ。

而Active Scanning,不只認真聽講,還勤於發問(SCAN_REQ),並接收後續的 SCAN_RSP。

這兩種Scanning的最終結果,就是把接收到的數據(包括Advertiser地址、Advertiser數據等),反饋給Host。

3.5 Initiating狀態

Initiating狀態和Scanning狀態類似,只不過它的關注點不一樣:它不關心廣播數據,只關心ADV_DIRECT_IND和ADV_IND兩類消息,並在符合條件的時候,發出CONNECT_REQ,請求建立連接。

3.6 設備過濾機制

從前面的描述可知,BLE的廣播功能,除了速率上面不給力之外,還是比較爽的。但有一個問題,需要引起我們的重視:

如果周圍有很多的BLE設備在廣播,對Scanner來說,它的Controller會掃描到很多廣播數據,如果這些數據都上報給Host(甚至用戶)的話,估計Host(或者用戶)會瘋掉。換句話說,垃圾信息太多了,我只想看、只想聽我感興趣的?腫麼辦?

沒關係,有辦法,基於白名單(White List)機制的設備過濾機制登場了。

3.6.1 白名單(White List)

每一個BLE的Controller,可以保存一個設備列表,通過該列表,可以實現設備過濾的功能。這個列表就稱作白名單(White List),保存了一些BLE設備地址。

白名單的大小由Controller自行覺得,並在reset的時候爲空,後續可以由Host通過HCI接口配置。基於白名單,Link Layer可實現多種設備過濾的策略,包括:

Advertising Filter Policy

Scanner Filter Policy;

Initiator Filter Policy。

具體可參考下面的描述。

3.6.2 Advertising Filter Policy

Advertising Filter Policy定義了Advertiser(處於Advertising狀態)的Link Layer怎麼處理SCAN_REQ(掃描請求)和CONNECT_REQ(連接請求),包括如下策略(Host可以根據實際情況配置,同一時刻只能配置一種):

Link Layer只接受位於白名單中的設備的掃描和連接請求(最嚴格);

Link Layer可以接受任何設備的掃描和連接請求(最不嚴格,Controller reset後的默認狀態);

Link Layer可以接受任何設備的掃描請求,但只接受位於白名單中的設備的連接請求;

Link Layer可以接受任何設備的連接請求,但只接受位於白名單中的設備的掃描請求。

3.6.3 Scanner Filter Policy

Scanner Filter Policy定一個Scanner(處於Scanning狀態)的Link Layer怎麼處理廣播數據,包括如下策略:

Link Layer只處理位於白名單中的設備的廣播數據,並且忽略沒有包括自身地址的connectable Directed advertising packet;

Link Layer處理所有設備的廣播數據,並且忽略沒有包括自身地址的connectable Directed advertising packet(Controller reset後的默認狀態)。

另外,如果設備支持“Extended Scanner Filter”策略,則可以同時支持如下的策略:

Link Layer只處理位於白名單中的設備的廣播數據,並且不能忽略InitA地址爲“resolvable private address”的connectable Directed advertising packet;

Link Layer處理所有設備的廣播數據,並且不能忽略InitA地址爲“resolvable private address”的connectable Directed advertising packet。

注4:有關resolvable private address,我們會在其它文章中介紹。

3.6.4 Initiator Filter Policy

Initiator Filter Policy定一個Initiator (處於Initiating狀態)的Link Layer怎麼處理可連接的廣播數據,包括如下策略:

Link Layer只處理位於白名單中的設備發送的可連接的廣播包,並在收到的時候發起連接請求;

忽略白名單,Link  Layer處理由Host指定的設備所發送的可連接的廣播包,並在收到的時候發起連接請求。

4. HCI

Link Layer中廣播通信有關的功能介紹完之後,HCI這一層就簡單了,因爲它僅僅是將Link Layer所提供的功能封裝成特定的Command和Event,沒有任何邏輯可言。

開始之前,我們先回憶一下“玩轉BLE(1)_Eddystone beacon”中給出的有關hcitool的例子:

# enable BLE advertising 
hcitool -i hci0 cmd 0x08 0x000A 01

# set advertising data to Eddystone UUID 
hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00

終於可以揭開它們的真面目了!

4.1 HCI Command/Event格式

先簡單介紹一下HCI Command和Event的格式(具體可參考“BLUETOOTH SPECIFICATION Version 4.2 [Vol 2, Part E]” 5.4章節)。

HCI Command的格式如下:

OCF(10bit) +OGF(6bit)Parameter Total LengthParameter1Parameter2

OCF和OGF共同組成16bit的操作碼(OpCode);

OGF是OpCode Group Field的簡稱,長度是6 bits,代碼該HCI命令所屬的group,對應上面HCI命令中的0x08;

OCF是OpCode Command Field的簡稱,代碼特定的HCI命令,對應上面HCI命令中的0x000A/0x0008;

Parameter Total Length,指示該Command所有參數的長度;

Parameter1、Parameter2、等等,16 bits的參數,由具體的Command決定。

注5:這裏所描述的Command格式,我們只需要關注OGF、OCF和Parameter即可,因爲後續我們主要使用“hcitool  cmd”命令進行演示,而hcitool已經幫我們封裝了。

HCI Event的格式如下:

Event code(8 bits)Parameter Total LengthParameter1Parameter2

具體意義不再詳細描述。

4.2 廣播通信相關的HCI Command介紹

本節簡單介紹一下和廣播通信有關的HCI Command,更爲詳細的信息,可參考“BLUETOOTH SPECIFICATION Version 4.2 [Vol 2, Part E]” 7.8小節的介紹。

注6:所有BLE相關的HCI Command的OGF都是0x08。

4.2.1 Advertising狀態有關的命令

1)HCI_LE_Set_Advertising_Parameters

設置廣播參數,包括Advertising Interval、Advertising Type、本機的地址類型、對端設備的地址類型和地址、所使用的物理Channel的map、Advertising Filter Policy等。

2)HCI_LE_Set_Advertising_Data

設置廣播數據,OCF爲0x0008,Command參數的格式如下:

Advertising Data Length(8 bits), Advertising Data

以上面的例子爲例,hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00

不同的顏色,依次代表OGF、OCF、Advertising Data Length、Advertising Data。

3)HCI_LE_Set_Scan_Response_Data

設置Scan請求時的應答數據,OCF爲0x0009,格式和HCI_LE_Set_Advertising_Data一模一樣。

4)HCI_LE_Set_Advertise_Enable

控制Advertising的使能與否,ICF爲0x000a,命令參數包括一個8 bits的“Advertising Enable”,如下:

hcitool -i hci0 cmd 0x08 0x000A 01

4.2.2 Scanning狀態有關的命令

1)HCI_LE_Set_Scan_Parameters

設置scan參數,包括Scan Type、Scan Interval、Scan Window、本機的地址類型、Scanning Filter Policy等。

2)HCI_LE_Set_Scan_Enable

Scan動作的開關,其數據格式和HCI_LE_Set_Advertise_Enable一致。

4.2.3 Initiating狀態有關的命令

1)HCI_LE_Create_Connection

建立連接,可指定Sca Interval、Scan Window、Initiator Filter Policy、Peer Address Type、Peer Address、Own Address Type等Initiating有關的參數,也可以指定連接相關的參數(這裏暫不說明)。

2)HCI_LE_Create_Connection_Cancel

取消連接。

4.2.4 白名單(White List)有關的命令

包括:

HCI_LE_Read_White_List_Size,獲取BLE Controller的白名單大小;

HCI_LE_Clear_White_List,清空白名單;

HCI_LE_Add_Device_To_White_List,將設備添加到白名單;

HCI_LE_Remove_Device_From_White_List,將設備從白名單移除;

5. GAP

對於廣播通信而言,GAP主要完成兩個事情:

1)將Link Layer的“協議語言”,如Advertising、Scannin、Initiating等,轉換爲更爲直觀的“人類語言”(當然,要進行一些封裝)。

2)爲廣播數據和掃描應答數據,定義一些統一的、規範的格式,以達到互聯互通的目的。

下面將分別介紹這兩個事情。

5.1 GAP模式定義

上面介紹Link Layer的時候,相信大家對那些術語有些暈暈的了,不過還好,回到Host端之後,熟悉的藍牙術語又回來了。GAP從用戶功能的角度,將Link Layer的各種狀態進行了一次映射,抽象出來瞭如下的4種模式(只有兩種和廣播通信有關,我們會重點介紹):

1)Broadcast mode and observation procedure

廣播模式,以及對應的解析過程。處於廣播模式的設備,可發送non-connectable undirected或者scannable undirected兩類advertising events。當然具備相應解析能力的設備,可接收這兩類events。

於此同時,GAP爲該模式下的設備定義了兩個角色(GAP role):Broadcaster和Observer,Broadcaster必須具有“Broadcast mode”能力,Observer必須具有“observation procedure”能力。

注7:大家可能會覺得這些術語有些混亂,理解它們,需要把握一點:GAP是一個profile,profile的首要目的是互聯互通,因此它最擅長的就是角色(role,Broadcaster和Observer)和能力(Broadcast mode 和observation procedure)的定義。任何支持GAP的設備,都要聲明自己支持哪些角色,而profile就要規定,哪種角色必須必備哪種能力。後面其它模式的理解,也遵循該原則。

2)Discovery modes and procedures

發現模式,以及對應的發現過程,用於設備的發現(和傳統藍牙保持一致了)。

GAP爲該模式下的設備定義了兩個角色:Peripheral和Central,Peripheral是被發現的設備,Central是主動發現別人的設備。同時,GAP定義了6種和發現有關的能力(不同角色的設備可以根據協議的規定,選擇具備哪些能力):

Non-Discoverable mode,不可被發現,設備不會廣播任何數據;

Limited Discoverable mode,可被發現(有限的),設備可發送non-connectable、scannable undirected或者connectable undirected三類advertising events。“有限”的意思是,設備只會在有限的一段時間內,廣播數據;

General Discoverable mode,可被發現(通用的),和上面的模式類似,不過可以廣播很長一段時間;

Limited Discovery procedure ,可執行有限的發現操作,可發現處於“Limited Discoverable mode”的設備;

General Discovery procedure ,可執行通用的發現操作,可發現處於“Limited Discoverable mode”和“General Discoverable mode”的設備;

Name Discovery procedure,可進行Name的發現操作。如果通過Scanning操作(包括Passive和Active兩種)沒有得到廣播設備的名稱,使用該過程,可以在建立連接之後,再獲取對方的名字。

3)Connection modes and procedures

連接模式,已經對應的連接過程,用於設備的連接(和傳統藍牙保持一致)。

所有四種角色的設備,Peripheral、Central、Broadcaster和Observer,都有可能涉及連接有關的模式,具體可參考藍牙spec中有關的定義。

連接有關的模式包括:

Non-connectable mode,不可被連接的模式,設備可發送non-connectable undirected或者scannable undirected兩類advertising events;

Directed connectable mode,可被指定的設備連接,設備只發送Connectable Directed advertising events;

Undirected connectable mode,可被連接(不指定設備),設備只發送Connectable undirected advertising events;

Auto connection establishment procedure,可自動連接處於directed connectable mode或者undirected connectable mode的設備。自動是指Controller自動,Host只需要發號施令即可;

General connection establishment procedure,通用的連接過程,Host需要參與。

Selective connection establishment procedure,建立連接的時候,Host可以指定一些連接參數,後續文章再詳細分析;

Direct connection establishment procedure,結合設備過濾機制,只連接特定的設備;

Connection parameter update procedure,連接參數的更新,後續在分析;

Terminate connection procedure,連接斷開的過程。

5.2 廣播數據格式

爲了互聯互通的目的,BLE協議爲31個bytes的廣播數據和掃描應答數據,定義了詳細的格式,如下:

Advertising and Scan Response data format

圖片2:廣播數據和掃描應答數據的格式

首先,廣播數據(或者掃描應答數據)由一個一個的AD Structure組成,對於未滿31bytes的其它數據,則填充爲0;

每個AD Structure由兩部分組成:1byte的長度信息(Data的長度),和剩餘的Data信息;

Data信息又由兩部分組成:AD Type(長度不定)指示該AD Structure的類型,以及具體的AD Data。

如果僅僅是這些,顯示不出藍牙組織的強大。最關鍵的還是AD Type,BLE協議根據實際的應用場景,定義了各種各樣的AD type,以及相應的數據格式,例如

Service UUID,指示本設備支持哪些profile;

Local Name,指示本設備的名稱;

Flags,指示本設備支持Limited Discoverable Mode/General Discoverable Mode的能力,以及BLE、BR/EDR的支持能力;

等等;

注8:AD Type的定義,可參考“https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile”。

注9:AD Data格式的定義,可參考“CSS(Core Specification Supplement) ”文檔。

最後,結合上面的hcitool cmd的例子,加深一下理解:

02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00

02 01 06,是一個AD Structure:Data的長度是02;Data是01 06;AD Type是01(Flags);AD Data是06,表明支持General Discoverable Mode、不支持BR/EDR。

03 03 aa fe,是一個AD Structure:Data的長度是03;Data是03 aa fe;AD Type是03(16 bits的Service UUID);AD Data是aa fe,是Eddystone profile的Service UUID。

17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00,是一個AD Structure:Data的長度是17(23bytes);Data是16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00;AD Type是16(Service Data);AD Data是aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00,是Eddystone profile具體的Service Data(可參考“https://github.com/google/eddystone/blob/master/protocol-specification.md”中相關的介紹)。

6. 總結

囉哩囉唆記了了這麼多,恐怕大家不容易看懂,就當自己的一個學習筆記吧,以後遇到相關的問題,來這篇文章查查應該就可以了。

 

原創文章,轉發請註明出處。蝸窩科技,www.wowotech.net

標籤: 藍牙 BLE scan advertising 廣播 discover connect

評論:

Moonbye 
2018-05-18 17:11
看了還是不明白,GAP定義角色和能力有啥意義,廣播包的格式中不是已經包含了可連接不可連接燈各種類型嗎,假設我GAP角色是Non-connectable mode,那我就不能發可連接的廣播了?
青春風鈴 
2018-03-01 14:44
你好,安卓手機端藍牙可設置:開放檢測(關或開),當關閉開放檢測時,其他手機檢測不到此手機,但已配對過的設備可以直接向這個手機發送文件,此手機用戶可選擇接受或拒絕。 
我問下:手機藍牙處於不開放檢測時,它對應着link layer的哪種狀態:Standby,Advertising,Scanning,Initiating,Connection。 
我的看法是首先用戶可以接收曾經配對過的手機發送信息,所以應該不是standby,connection也不是,那隻能是以下三種: 
advertise:只發送可連接的定向廣播,普通手機過濾掉了,所以用戶界面不顯示。 
scan:掃描,但用戶界面沒更新掃描,可能被底層過濾了 
initiating:只接受已配對過的手機的廣播,其他的過濾 
究竟對應着哪一種狀態啊?兩個已經配對過的手機靠近時,它們會自動建立連接嗎?或者發送文件方定向廣播與手機連接。我的最終問題是已知某手機藍牙地址,該手機處於不開放檢測,我怎麼定位它?麻煩了
Yaosir 
2018-02-09 14:31
我擦 能不能刪了這個評論,我弄明白了。 hcitool cmd 命令後的參數必須是32個 未滿填0, 前面的長度值表明實質廣播內容的長度
wowo 
2018-02-09 17:48
@Yaosir:抱歉啊,太忙了回覆太慢~~弄明白就行了,這比我告訴你意義大多了。 
至於上面的回覆,刪不刪都無所謂了~~:-)
Yaosir 
2018-02-09 18:57
@wowo:還是很感謝wowo,哎,國內像你這樣高質量又活躍的技術博客感覺真的不多啊。我最後還是搜stackoverflow弄明白的。
Yaosir 
2018-02-09 12:02
第二個寫入AD Data的命令似乎有點問題。 第一個字符ad_length應該是1f,否則最後一個00讀不進去,是無法識別的廣播內容。
wowo 
2018-02-09 17:49
@Yaosir:可參考@Yaosir兄上面的回覆~~~
Yaosir 
2018-02-07 11:48
wowo新年好!(拜個早年) 我按照你這段命令在linux上試了,但是HCI的命令好像都不能執行是爲什麼呢? HCI返回的是這樣的: 
< HCI Command: ogf 0x08, ocf 0x000a, plen 1 
  01 
> HCI Event: 0x0e plen 4 
  01 0A 20 00 
HCI EVENT返回的下面四個字符是什麼意思呢?
Michael 
2018-01-25 17:10
請教一下,在不可被掃描且知道對方MAC地址的情況下,是怎麼連接的?有什麼方法可以驗證這個流程呢?
wowo 
2018-01-25 18:37
@Michael:過程和普通的連接類似,只不過LL會過濾掉其它的MAC地址。
KIKI 
2017-12-18 15:09
蝸窩你好!非常感謝你的總結,條理清晰,也沒有複雜晦澀的文字。我是BLE方面的小白,想請教一下,我的需求是一個設備每隔一定時間向外廣播自己的位置信息,它一定距離內的所有開着藍牙的手機均可以接收到這個信息,不要求回覆響應和連接,所以選擇ADV_NONCONN_IND類型的PDU就足夠了吧?那麼接收方需要有個APP來讀取信息嗎? 
先謝謝了~
wowo 
2017-12-19 11:29
@KIKI:是的,你的問題都是設問句(已經有答案了,哈哈)。
KIKI 
2017-12-19 11:53
@wowo:謝謝蝸窩的回覆,想請教有沒有BLE方面的開發討論羣?小白有很多問題都不太清楚
wowo 
2017-12-19 14:22
@KIKI:不明白的看spec就行啦,去羣裏面討論,需要對等,否則討論不出來什麼東西的。
ljy 
2017-12-13 12:56
佩服,把知識總結得這麼詳實!
wowo 
2017-12-13 13:45
@ljy:tks:-)
LYH 
2018-03-05 10:38
@ljy:深表贊同
EE 
2017-11-19 10:40
wowo,“先簡單介紹一下HCI Command和Event的格式(具體可參考“BLUETOOTH SPECIFICATION Version 4.2 [Vol 2, Part E]” 5.4章節)。”在4.2對應的目錄爲“Vol2:Core SystemPackage[BR/EDR Controller volume]”LE的GAP怎麼到BR/EDR內容中去了,如果只學LE的話,照這樣看也得通篇學習4.2的整個文檔了,因爲BR/EDR與LE相互參雜(有些沒有目錄上的標識,就像剛纔這個知識點)這樣很難區分哪些BR/EDR可以不學,如果僅學LE還要通篇學習4.2的整個文檔這樣就玩大發了,wowo能否學習分塊上幫指點一二,先謝!
wowo 
2017-11-20 17:09
@EE:其實在spec裏面,BLE和傳統藍牙的內容分的還是比較清晰的,不應該有這個困擾。 
你提到的HCI這一層,確實是在一個章節裏介紹的,不過command和event也特意爲BLE歸類了。 
我的經驗就是,看spec的時候,把非BLE的部分直接過濾就行了,沒問題的~~~
EE 
2017-11-21 10:58
@wowo:恩好的,多謝,話說wowo的文章,對藍牙學習來說非常重要:先看wowo的文章再去看協議棧要容易的多,直接去看那整版整版的英文會讓人頭腦發脹,這是我的感受。期待更多精彩!
jiangxu 
2017-06-07 14:58
您好wowo,問個問題,ble中的廣播掃描,是個什麼過程呢,是指在不同信道接受廣播的數據麼? 
第二個問題是,ADV_SCAN_IND廣播事件,不能連接,不能掃描,那對方怎麼接收到信息呢? 
望有時間的話解答,謝謝!
wowo 
2017-06-08 08:42
@jiangxu:廣播,是指advertiser在3個廣播channel上發送數據。這種廣播數據任何設備都能收到。 
掃描,是指scanner在接收到“ADV_IND或者ADV_SCAN_IND”類型的廣播數據之後,可以向advertiser發送一個掃描請求(當然,也是在廣播channel上),advertiser在收到請求後,可以返回更多的信息。 

至於ADV_SCAN_IND,文中的原話是這樣哦:“和ADV_IND類似,但不可以被連接,可以被掃描。”。
jiangxu 
2017-06-08 09:47
@wowo:哦哦,明白了。謝謝wowo!
jiangxu 
2017-06-08 09:57
@wowo:還有一個小問題哦~就是藍牙5.0新增加了一個數據信道選擇法則,協議是在鏈路層中~請問是通過軟件實現的麼,還是硬件實現的?換句話說,協議棧有這部分的代碼麼?(我發現我剛纔發錯位置了。。。)
wowo 
2017-06-08 11:31
@jiangxu:5.0還沒有搞過啊,有空可以看看代碼,你也可以看看給大家分享一下。
ggl 
2018-05-07 17:20
@wowo:ADV_SCAN_IND:主機可以接收到廣播數據,但是從機會忽略主機的掃描請求;從機也只接受特定主機的連接請求。
1 2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章