前面的兩篇文章,主要是在 Android 官網關於藍牙介紹的基礎上加上本身的理解完成的。主要針對的是 Android 開發中的一些 API 的使用。
第一篇文章 Android 藍牙開發(1) 主要是介紹了普通的藍牙在 Android 開發中的運用。
第二篇文章 Android 藍牙開發(2) 主要是介紹了低功耗藍牙的開發。
這篇文章主要介紹的是藍牙的歷史和一些關於藍牙的通用知識,還有廣播包的知識。要想完全瞭解藍牙開發,這些基礎的知識也是須要的,就像網絡協議同樣,這些都是基礎的內容。咱們的 API 的調用都是以這個爲基礎的,瞭解這些,開發過程當中遇到問題,才能夠知道什麼怎麼一回事。java
下篇文章主要講的就是實際開發中的一些坑。安全
藍牙技術最初是由愛立信創制的。技術始於愛立信公司 1994 方案,它是研究在移動電話和其餘配件間進行低功耗、低成本無線通訊鏈接的方法。發明者但願爲設備間的通信創造一組統一規則(標準化協議)用來解決用戶間相互不兼容的移動電子設備。網絡
1998 年 5 月 20 日,索尼以立信、國際商業機器、英特爾、諾基亞及東芝公司等業界龍頭創立「特別興趣小組」(Special Interest Group SIG),即藍牙技術聯盟的前身,目標是開發一個成本低、效益高、能夠在短距離範圍內隨意無線鏈接的藍牙技術標準。負責藍牙規範的制定和推廣的國際組織。併發
1998年推出了 0.7 規格,1999 年推出了 0.八、0.9等等。1999 年 7 月正式公佈 1.0 版本,使用 2.4GHz頻譜,最高資料傳輸速度 1Mbps。2001 年的 1.1 版本正式列入 IEEE 標準。設計
藍牙其實就是一種近距離無線通訊技術。3d
低功耗藍牙 BLErest
全稱是 Bluetooth Low Energy 簡稱 BLE 。最大的特色就是低功耗,有些 BLE 設備一個鈕釦電池可使用一兩年。這對於如今的穿戴設備以及各類物聯網傳感器來講是一個很大的突破。同時它的傳輸的數據就不多。code
在 Android 4.3 的時候開始支持低功耗藍牙。僅僅支持中心模式,就是隻能夠鏈接其餘藍牙外設。到了 2014 年 Android 5.0 開始也支持周邊模式。blog
圖片來自網絡接口
從下到上分別爲:控制器(Controller)-->主機(host)-->應用(Application)
控制器:協議棧的底層的實現,直接和硬件相關,由芯片廠商實現,包括物理層、鏈路層、主機控制接口。
主機:協議棧的上層實現是硬件的抽象,與具體的硬件廠商沒有關係。
應用層:使用主機層提供的 API 開發的應用。
詳細介紹各個層的含義:
PHY(Physical Layer)物理層,藍牙是工做在 2.4GHz 附近,這是工業、科學、醫療 ISM 的頻段,免許可證。WIFI 也是工做在同一個頻段。藍牙把頻段切分爲 40 個通道,其中 3 個廣播通道,37 個數據通道,按照一個規律跳頻通訊。
LL(Linker Layer)鏈路層,用於控制設備的射頻狀態,設備將處於五種狀態之一:等待、廣告、掃描、初始化、鏈接。廣播設備不須要創建鏈接就能夠發送數據,而掃描設備接受廣播設備發送的數據;發起鏈接的設備經過發送鏈接請求來回應廣播設備,若是廣播設備接受請求,那麼廣播設備與發起鏈接的設備將會進入鏈接狀態。發起鏈接的設備稱爲主機,接受鏈接請求的設備稱爲從機。
HCI(Host Controller Interface):主機和控制器就是經過這個接口來進行通信的,通信的介質就是 HCI 命令。這層在協議棧中是可選的,一些小型終端可能沒有,可是 Android 設備上確定有,這層是藍牙上層和芯片的交互必經之路,對於藍牙硬件開發者,這裏的 log 可以很好的幫助解決問題。
HOST 部分要複雜。有鏈路控制和適配層(L2CAP),安全管理(SM)等。重點看屬性協議層,也就是 ATT。它是整個 BLE 通訊的基礎。ATT負責數據封裝,向外暴露爲 「屬性」,提供「屬性」的爲服務端,獲取「屬性」的爲客戶端。ATT 是專門爲 BLE 低功耗藍牙而設計的傳輸協議,結構簡單,傳輸數據短。
GATT(Generic Attribute Profile):全稱叫作通用屬性配置文件,是基於 ATT 作的進一步的邏輯封裝,定義數據的交互方式和含義,APP 開發就是用的這一層。GATT 定義了三個很是重要的概念:服務(Service)、特徵(Characteristic)、描述(Descripter)。他們的關係以下圖
一個 Service 能夠包含若干個 Characteristic,一個 Characteristic 能夠包含屬性(properties)和值(value),還能夠包含多個 descripter
。Characteristic 實際上具備讀、寫、通知等權限。咱們在對一個 BLE 設備發起鏈接成功之後,對他進行讀寫操做,其實就是對 Characteristic 的操做。圖中的 Profile 是一組服務的集合,這些服務組個起來就造成了一個特定的使用場景了,裏面的服務是嵌入式工做人員能夠添加的。BLE 藍牙使用 UUID 來區分 Service、Characteristic 、Descripter。
BLE 應用能夠分爲兩大類:基於非鏈接的和基於鏈接的
基於非鏈接的:
意思就是外設和周邊設備不發生鏈接,主要靠掃描到的廣播來獲取信息。發送廣播的一方叫作 broadcaster
監聽廣播的一方叫作 oberver
在 GAP 層有對應的角色定義。
網絡拓撲圖:
這種方式就是廣播設備不斷的向外發送廣播(含有特定的信息),而後觀察者接受到廣播按照二者之間約定好的協議進行解析拿到有用的信息。例如:iBeacon,經過這種設備咱們能夠實現室內定位。
其實這些設備的角色能夠即便廣播者又是觀察者。接收到廣播後做出了處理,而後又發送廣播。這樣就造成了雙向的網絡,相似於因特網,這就是藍牙 Mesh 組網。
廣播數據包格式:
每一個廣播數據包由 31 byte 組成。分爲有效數據和無效數據兩部分。
例子:
E/TAG:scandata:02011A05FFAC0134560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
這裏是掃描的數據包(轉換成了 16 進制,兩個表明一個字節),第一個字節是 02 表示後面的兩個字節是數據部分,而後第二個字節是 01 表示了數據的類型。後面一個字節就是真正的數據了。這個廣播數據單元就分析完了。下面就是另外一個數據單元了。依次類推,關於數據類型的解釋,官網有。
這是數據類型對應的含義表。
基於鏈接的:
就是兩個設備創建 GATT 鏈接,須要雙方進行通訊。這裏的兩個角色是,外設設備(Peripheral)和中心設備(通常是手機)Centeral。
網絡拓撲圖:
一箇中心設備可鏈接多個外設,可是一個外設只能鏈接一箇中心(外設鏈接成功後就會中止對外廣播,別人就發現不了它了)。其中一箇中心設備的鏈接外設的數量也是有限的。