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


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格式 說明
Advertising ADV_IND AdvA(6 octets) 
AdvData(0~31 octets)

connectable undirected advertising event,

用於常規的廣播,可攜帶不超過31bytes的廣播數據,可被連接,可被掃描: 
AdvA,6bytes的廣播者地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
AdvData,廣播數據。

  ADV_DIRECT_IND AdvA(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_IND AdvA(6 octets) 
AdvData(0~31 octets)
和ADV_IND類似,但不可以被連接,不可以被掃描。
  ADV_SCAN_IND AdvA(6 octets) 
AdvData(0~31 octets)
和ADV_IND類似,但不可以被連接,可以被掃描。
Scanning SCAN_REQ ScanA(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_RSP AdvA(6 octets) 
ScanRspData(0~31 octets)
廣播者收到SCAN_REQ請求后,通過該PDU響應,把更多的數據傳送給接受者。 
AdvA,6bytes的廣播者地址,並由PDU Header的TxAdd bit決定地址的類型(0 public,1 random); 
ScanRspData,scan的應答數據。
Initiating CONNECT_REQ InitA (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 Channel RF Center Frequency Advertising Channel Index
0 2402MHz 37
12 2426MHz 38
39 2480MHz 39

 

與此同時,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 Length Parameter1 Parameter2

 

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 Length Parameter1 Parameter2

具體意義不再詳細描述。

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. 總結

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM