藍牙,是一種支持設備短距離通訊(通常10m內)的無線電技術。能在包括移動電話、PDA、無線耳機、筆記本電腦、相關外設等衆多設備之間進行無線信息交換。利用「藍牙」技術,可以有效地簡化移動通訊終端設備之間的通訊,也可以成功地簡化設備與因特網Internet之間的通訊,從而數據傳輸變得更加迅速高效,爲無線通訊拓寬道路。藍牙採用分散式網絡結構以及快跳頻和短包技術,支持點對點及點對多點通訊,工做在全球通用的2.4GHz ISM(即工業、科學、醫學)頻段。其數據速率爲1Mbps。採用時分雙工傳輸方案實現全雙工傳輸。html
藍牙協議體系中的協議按SIG的關注程度分爲四層:android
1.核心協議:BaseBand、LMP、L2CAP、SDP;除上述協議層外,規範還定義了主機控制器接口(HCI),它爲基帶控制器、鏈接管理器、硬件狀態和控制寄存器提供命令接口。在圖1中,HCI位於L2CAP的下層,但HCI也可位於L2CAP上層。ios
藍牙核心協議由SIG制定的藍牙專用協議組成。絕大部分藍牙設備都須要核心協議(加上無線部分),而其餘協議則根據應用的須要而定。總之,電纜替代協議、電話控制協議和被採用的協議在覈心協議基礎上構成了面向應用的協議。 編程
藍牙協議棧容許採用多種方法,包括 RFCOMM 和 Object Exchange (OBEX ), 在設備之間發送和接收文件。若是想發送和接收流數據(並且想採用傳統的串口應用程序,並給它加上藍牙支持),那麼 RFCOMM 更好。反過來,若是想發送對象數據以及關於負載的上下文和元數據,則 OBEX 最好。緩存
藍牙應用程序活動圖,以下:安全
2.1.1 串口仿真RFCOMM介紹服務器
找到服務,RFCOMM是經過不一樣的頻道(channel)來提供不一樣的Profile的,因此須要找到要用的服務在設備上的哪一個頻道上,這是經過同一個軟件包裏的sdptool來完成的,就是SDP,服務發現協議 架構
2.2 藍牙profileapp
從3.0版本開始(聽說2.1也是支持的?TBD),藍牙纔開始支持BluetoothProfile。BluetoothProfile是藍牙設備間數據通訊的無線接口規範。想要使用藍牙無線技術,設備必須可以翻譯特定藍牙配置文件,配置文件定義了可能的應用.
SPP是基於RFCOMM的,spp 協議處於rfcomm的上層,spp的應用需走rfcomm層。若是你使用RFCOMM可以實現,那麼也就不須要使用SPP,而卻速度還會比SPP來作快,由於省略了採用profile的一些數據包頭等。不過,仍是推薦採用SPP來作,兼容性有保證,這也是爲何藍牙本質上數據和語音的傳送卻出現HFP,HSP,SPP,OPP等諸多具體應用profile的緣由。
每一個attribute屬性被UUID(通用惟一標識符)惟一標識 ,UUID是標準128-bit格式的ID用來惟一標識信息。attributes 被 ATT 格式化characteristics和services形式進行傳送。
特徵(Characteristics)— 一個characteristics包含一個單獨的value值和0 –n個用來描述characteristic 值(value)的descriptors。一個characteristics能夠被認爲是一種類型的,相似於一個類。
描述符(descriptor)—descriptor是被定義的attributes,用來描述一個characteristic的值。例如,一個descriptor能夠指定一我的類可讀的描述中,在可接受的範圍裏characteristic值,或者是測量單位,用來明確characteristic的值。
服務(service)—service是characteristic的集合。例如,你能夠有一個所謂的「Heart RateMonitor」service,其中包括characteristic,如「heart rate measurement 」。你能夠在 bluetooth.org找到關於一系列基於GATT的profile和service。
如上圖所示:藍牙設備能夠包括多個Profile,一個Profile中有多個Service,一個Service中有多個Characteristic,一個Characteristic中包括一個value和多個Descriptor。
通用屬性規範(GATT)—GATTprofile是一個通用規範用於在BLE鏈路發送和接收被稱爲「屬性(attributes)」的數據片。目前全部的低功耗應用 profile都是基於GATT。
藍牙SIG定義了許多profile用於低功耗設備。Profile(配置文件)是一個規範,規範了設備如何工做在一個特定的應用場景。注意:一個設備能夠實現多個profile。例如,一個設備能夠包含一個心臟監測儀和電池電平檢測器。
主從機鏈接創建過程:
低功耗藍牙模塊主透傳協議是針對低功耗藍牙模塊從透傳協議設計的,經過本協議模塊可替代手機設備與從透傳協議模塊鏈接,實現透傳功能或直驅控制功能。此協議模塊可用做從透傳協議模塊開發過程當中的輔助工具。
BLE主透傳協議模塊(如下簡稱MTTM)能夠工做在透傳模式(TTM)或指令模式(CM)。
MTTM上電啓動後,處於待機模式(SBM),此時處於空閒狀態,無睡眠,須要用戶經過AT指令控制模塊鏈接從設備。在成功與從設備創建連接後,MTTM會自動查找從設備的透傳通道,若是從設備屬於BLE從透傳協議模塊(如下簡稱STTM),MTTM默認進入透傳模式,不然默認進入指令模式。
透傳模式下,用戶CPU能夠經過模塊的通用串口與STTM進行雙向通信。從MTTM串口輸入的數據將轉發到STTM,並從STTM的串口輸出;從STTM輸入的數據將轉發到MTTM,並從MTTM的串口輸出,從而實現透明傳輸功能,用戶數據的具體含義由上層應用程序自行定義。
透傳中數據的格式也是profile,或藍牙標準profile或自定義simple profile。基本結構依然是:
服務和特徵都是用UUID來惟一標識的,UUID的概念若是不清楚請自行google,國際藍牙組織爲一些很典型的設備(好比測量心跳和血壓的設備)規定了標準的service UUID(特徵的UUID比較多,這裏就不列舉了)
iOS 有兩個框架支持藍牙與外設鏈接。
一個是 ExternalAccessory。從ios3.0就開始支持,也是在iphone4s出來以前用的比較多的一種模式,可是它有個很差的地方,External Accessory須要拿到蘋果公司的MFI認證。
另外一個框架則是本文要介紹的CoreBluetooth,在藍牙4.0出來以後(注意,硬件上要4s以上,系統要ios6以上才能支持4.0),蘋果開放了BLE通道,專門用於與BLE設備通信(由於它的API都是基於BLE的)。這個不須要MFI,而且如今不少藍牙設備都支持4.0,因此也是在IOS比較推薦的一種開發方法。現CoreBluetooth在的開發幾乎所有基於該框架,本節只介紹CoreBluetooth。
1,CoreBluetooth介紹
CoreBluetooth框架的核心實際上是兩個東西,peripheral和central, 能夠理解成外設和中心。對應他們分別有一組相關的API和類,以下圖所示:
若是你要編程的設備是手機的central,那麼你大部分用到peripheral API。反之亦然,設備是peripheral,iphone手機是central,因此將大部分使用central API。使用peripheral編程的例子也有不少,好比像用一個ipad和一個iphone通信,ipad能夠認爲是central,iphone端是peripheral,這種狀況下在iphone端就要使用上圖右邊部分的類來開發了。
做爲一箇中心(central)要實現完整的通信,通常要通過這樣幾個步驟:
(1)創建中心角色—
2, 設備ID描述DID
每一個與蘋果設備兼容的藍牙接入都必須:支持藍牙設備ID描述,1.3版本或者更高;使用藍牙SIG分配的Assigned Numbers文檔中的公司標識做爲他的Vendor ID值,也就是VID,若是生產商沒有藍牙SIG公司標識,那麼藍牙HID描述接入可能會使用USB Implementers Forum分配的VID;使用他的VID值來標識最終的產品生產商;使用版本值來惟一標識軟件的版本;使用ProductID值惟一標識產品。Device ID描述使得蘋果產品可以識別遠程的藍牙接入,該信息能夠用來在與遠程接入交互的時候鏈接藍牙描述間的交替互操做。所以Device ID中的信息記錄很是重要。
理想狀況下,這兩個設備應該有不一樣的產品ID。可是,當他們擁有徹底相同的硬件、軟件和特性的時候擁有相同的ProductID也是能夠容許的。若是他們有任何的不一樣,就都應該有不一樣的Product ID。
3,IOS的藍牙低功耗
藍牙4.0標準引入了藍牙低功耗,一種針對有限電池資源的藍牙接入的無線技術。若是支持藍牙低功耗的話,接入點須要支持下面的這些特性。(這裏更多的是藍牙芯片商要作的事情)
角色
藍牙接入須要實現藍牙4.0標準中定義的外圍角色
廣告通道
藍牙接入須要在全部三個廣告通道中針對每一個廣告事件進行廣告
廣告PDU
藍牙接入須要使用以下廣告PDU中的一個:ADV_IND;ADV_NOCONN_IND;ADV_SCAN_IND。其中ADV_DIRECT_IND不推薦使用。
廣告數據
由藍牙接入發送的廣告信息應該至少包含藍牙4.0標準中包含的以下信息:Flags;TX Power Level;Local Name;Services。若是須要下降電量消耗或者並非全部的廣告數據都適合放入到廣告PDU中的時候,接入點可能將Local Name和TX Power Level數據方知道SCAN_RSP PDU中。須要注意的是根據它的狀態,蘋果產品可能不會老是執行激活掃描。主要的服務應該老是放在廣告PDU中進行廣告。次要的服務不該該進行廣告。對於接入點不重要的服務信息可能會由於廣告PDU中的空間不足而被忽略。廣告數據和SCAN_RSP PDU中的掃描響應數據應該遵循藍牙4.0標準中的格式。
廣告間隔
藍牙接入的廣告間隔應該慎重考慮,由於他會影響到發現和鏈接的性能。對於低功耗的接入,電池資源也應該被考慮在內。爲了可以被蘋果產品發現,藍牙接入應該首先使用推薦的廣告間隔20ms,並持續至少30秒。若是在這30秒內沒有被發現,那麼接入點可能會選擇節省電池電量而後增長廣告間隔,蘋果推薦使用以下依次延長的事件間隔來發現藍牙接入點:645 ms;768 ms;961 ms;1065 ms;1294 ms
鏈接參數
藍牙接入負責用來LE鏈接的鏈接參數。接入點須要請求合適的鏈接參數來在合適的時候發送一個L2CAP鏈接參數跟新請求。若是他沒有符合以下規則,那麼鏈接參數請求可能會被拒絕:Interval Max * (Slave Latency + 1) ≤ 2 seconds;Interval Min ≥ 20 ms;Interval Min + 20 ms ≤ Interval Max;Slave Latency ≤ 4;connSupervisionTimeout ≤ 6 seconds以及Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout。蘋果設備不會讀取或者使用Peripheral Preferred Connection Parameters特性中的參數。
隱私
藍牙接入應該在任何狀況下都可以知足Resovable Private Address。由於私隱方面的考慮,蘋果設備將會使用藍牙4.0標準中定義的隨機設備地址。
受權
藍牙接入不須要請求特殊的受權,如配對、認證或加密等來發現服務和特性。只有在獲取特性值或者描述值的時候可能會須要特殊的受權。9
配對
藍牙接入不該該請求配對。若是處於安全考慮,接入點須要與Central創建綁定關係,外圍可使用Insufficient Authentication錯誤碼在必要的時候拒絕ATT請求。所以蘋果設備可能會須要按照既定的安流程程來執行過程。配對可能會須要基於蘋果產品的用戶認證。
服務
通用接入描述服務:藍牙接入應該實現按照藍牙標準4.0中的Device Name特性
通用屬性描述服務:只有當接入有能力在生命週期內更改他的服務的時候,該接入點才須要實現Service Changed特性。蘋果產品可使用Service Changed服務特性來決定它是否可使用以前讀取的或者緩存的來自設備的信息。
設備信息服務:藍牙接入應該實現設備信息服務。服務的UUID不該該包含在廣告數據當中。以下的特性須要被支持:Manufacturer Name String;Model Number String;Firmware Revision String;Software Revision String
4,IOS APP開發 的藍牙操縱API
手機APP要想得到藍牙設備的一些額外的信息如電量或者操做藍牙設備,必須經過IOS API。那麼IOS底層必然有某種方式來與藍牙設備交互。 那麼電量經過什麼來讀寫呢?自定義 service characteristic?
任何免提的藍牙耳機均可以在iOS設備的狀態欄中顯示一個用來標識他電池電量的圖標。這個特性被全部的iOS設備所支持,包括iPhone、iPod和iPad。耳機的藍牙知識經過兩個iOS藍牙HFP AT命令:HFP Command AT+XAPL
最後叮囑:你們有好的的藍牙通訊的資料連接在下面留言分享下~多謝♪(^∇^*)