|
聲明:這篇文章是樓主beautifulzzzz學習網(wǎng)上關于藍牙的相關知識的筆記,其中比較多的受益于xubin341719的藍牙系列文章,同時還有其他網(wǎng)上作者的資料。由于有些文章只做參考或統(tǒng)計不足,如涉及版權請在下面留言~。同時我也在博客分類中新建一個藍牙通信分類,用來研究分享藍牙相關技術。
主要參考資料的來源:xubin341719[下面是該前輩的BT系列文章] 藍牙核心技術概述(一):藍牙概述
有道筆記分享鏈接:http://note.youdao.com/share/?id=950d00cefa9b7fd3c559eec349805b24&type=note
下面是摘抄筆記內容:
藍牙,是一種支持設備短距離通信(一般10m內)的無線電技術。能在包括移動電話、PDA、無線耳機、筆記本電腦、相關外設等眾多設備之間進行無線信息交換。利用“藍牙”技術,能夠有效地簡化移動通信終端設備之間的通信,也能夠成功地簡化設備與因特網(wǎng)Internet之間的通信,從而數(shù)據(jù)傳輸變得更加迅速高效,為無線通信拓寬道路。藍牙采用分散式網(wǎng)絡結構以及快跳頻和短包技術,支持點對點及點對多點通信,工作在全球通用的2.4GHz ISM(即工業(yè)、科學、醫(yī)學)頻段。其數(shù)據(jù)速率為1Mbps。采用時分雙工傳輸方案實現(xiàn)全雙工傳輸。 Bluetooth的系統(tǒng)構成 1、無線射頻單元(Radio):負責數(shù)據(jù)和語音的發(fā)送和接收,特點是短距離、低功耗。藍牙天線一般體積小、重量輕,屬于微帶天線。
2、基帶或鏈路控制單元(LinkController):進行射頻信號與數(shù)字或語音信號的相互轉化,實現(xiàn)基帶協(xié)議和其它的底層連接規(guī)程。 3、鏈路管理單元(LinkManager):負責管理藍牙設備之間的通信,實現(xiàn)鏈路的建立、驗證、鏈路配置等操作。 4、藍牙軟件協(xié)議實現(xiàn):如上圖紫色部分,這個后面我們做詳細說明。 低耗電藍牙相關規(guī)范
(二)藍牙協(xié)議組成
2.1 藍牙協(xié)議架構
藍牙協(xié)議體系中的協(xié)議按SIG的關注程度分為四層: 1.核心協(xié)議:BaseBand、LMP、L2CAP、SDP;2.電纜替代協(xié)議:RFCOMM; 3.電話傳送控制協(xié)議:TCS-Binary、AT命令集; 4.選用協(xié)議:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。 除上述協(xié)議層外,規(guī)范還定義了主機控制器接口(HCI),它為基帶控制器、連接管理器、硬件狀態(tài)和控制寄存器提供命令接口。在圖1中,HCI位于L2CAP的下層,但HCI也可位于L2CAP上層。 藍牙核心協(xié)議由SIG制定的藍牙專用協(xié)議組成。絕大部分藍牙設備都需要核心協(xié)議(加上無線部分),而其他協(xié)議則根據(jù)應用的需要而定??傊?,電纜替代協(xié)議、電話控制協(xié)議和被采用的協(xié)議在核心協(xié)議基礎上構成了面向應用的協(xié)議。 藍牙協(xié)議棧允許采用多種方法,包括 RFCOMM 和 Object Exchange (OBEX ), 在設備之間發(fā)送和接收文件。如果想發(fā)送和接收流數(shù)據(jù)(而且想采用傳統(tǒng)的串口應用程序,并給它加上藍牙支持),那么 RFCOMM 更好。反過來,如果想發(fā)送對象數(shù)據(jù)以及關于負載的上下文和元數(shù)據(jù),則 OBEX 最好。 藍牙應用程序活動圖,如下:
2.1.1 串口仿真RFCOMM介紹 找到服務,RFCOMM是通過不同的頻道(channel)來提供不同的Profile的,所以需要找到要用的服務在設備上的哪個頻道上,這是通過同一個軟件包里的sdptool來完成的,就是SDP,服務發(fā)現(xiàn)協(xié)議
2.2 藍牙profile 2.2.1 藍牙profile概述
從3.0版本開始(據(jù)說2.1也是支持的?TBD),藍牙才開始支持BluetoothProfile。BluetoothProfile是藍牙設備間數(shù)據(jù)通信的無線接口規(guī)范。想要使用藍牙無線技術,設備必須能夠翻譯特定藍牙配置文件,配置文件定義了可能的應用. 藍牙配置文件表達了一般行為,藍牙設備可以通過這些行為與其他設備進行通信.
藍牙技術定義了廣泛的配置文件,描述了許多不同類型的使用安全.按藍牙規(guī)格中提供的指導,開發(fā)商可創(chuàng)建應用程序以用來與其他符合藍牙規(guī)格的設備協(xié)同工作.在最低限度下,各配置文件規(guī)格應包含下列主題的相關信息.
① 與其他配置文件的相關性 ② 建議的用戶界面格式 ③ 配置文件使用的藍牙協(xié)議堆棧的特定部分. 為執(zhí)行其任務,每個配置文件都使用堆棧各層上的特定選項和參數(shù).若需要,也可包括必需的服務記錄概要。ProfilesAPI層則分別對Audio、Data、Control等提供了不同的模塊。目前已規(guī)范有四大類、十三種協(xié)議規(guī)格。
Bluetooth的一個很重要特性,就是所有的Bluetooth產品都無須實現(xiàn)全部的Bluetooth規(guī)范。為了更容易的保持Bluetooth設備之間的兼容,Bluetooth規(guī)范中定義了Profile。Profile定義了設備如何實現(xiàn)一種連接或者應用,你可以把Profile理解為連接層或者應用層協(xié)議。
常用的profile介紹請參考“藍牙Profile的概念和常見種類”,幾種種最基本的配置文件為:
1.通用訪問配置文件(Generic Access Profile, GAP)
GAP是所有其他配置文件的基礎,它定義了在藍牙設備間建立基帶鏈路的通用方法.除此之外,GAP還定義了下列內容:
① 必須在所有藍牙設備中實施的功能
② 發(fā)現(xiàn)和鏈接設備的通用步驟 ③ 基本用戶界面術語. GAP確保了應用程序和設備間的高度互操作性,還允許開發(fā)人員利用現(xiàn)有的定義更加容易地定義新的配置文件.GAP處理未連接的兩個設備間的發(fā)現(xiàn)和建立連接過程.此配置文件定義了一些通用的操作,這些操作可供引用GAP的配置文件,以及實施多個配置文件的設備使用.GAP確保了兩個藍牙設備可通過藍牙技術交換信息,以發(fā)現(xiàn)彼此支持的應用程序.不符合任何其他藍牙配置文件的藍牙設備必須與GAP符合以確?;镜幕ゲ僮餍院凸泊?
2.服務發(fā)現(xiàn)應用配置文件(Service Discovery Application Profile, SDAP)
SDAP描述了應用程序如何使用SDP發(fā)現(xiàn)遠程設備上的服務.由于GAP的要求,任何藍牙設備都應能夠連接至其他藍牙設備.基于此,SDAP要求任何應用程序都應當能夠發(fā)現(xiàn)它要連接的其他藍牙設備上的可用服務.此配置文件可承擔搜索已知和特定服務及一般的任務.SDAP涉及了稱為“服務發(fā)現(xiàn)用戶應用程序”的一個應用程序,這是藍牙設備查找服務所必需的.此應用程序可與向/從其他藍牙設備發(fā)送/接收服務查詢的SDP相接.SDAP依賴于GAP,并可以重新使用部分GAP.
3.串行端口配置文件(Serial Port Profile, SPP)
SPP定義了如何設置虛擬串行端口及如何連接兩個藍牙設備.SPP基于ETSI TS 07.10規(guī)格,使用RFCOMM協(xié)議提供串行商品仿真.SPP提供了以無線方式替代現(xiàn)有的RS-232串行通信應用程序和控制信號的方法.SPP為DUN,FAX,HSP和LAN配置文件提供了基礎.此配置文件可以支持最高128kb/s的數(shù)據(jù)率.SPP依賴于GAP.
4.通用對象交換配置文件(Generic Object Exchange Profile, GOEP)
GOEP可用于將對象從一個設備傳輸?shù)搅硪粋€設備.對象可以是任意的.如:圖片,文檔,名片等.此配置文件定義了兩個角色:提供拉提或推送對象位置的服務器及啟動操作的客戶端.使用GOEP的應用程序假定鏈路和信道已按GAP的定義建立.GOEP依賴于串行端口配置文件.
GOEP為使用OBEX協(xié)議的其他配置文件提供了通用藍圖,并為設備定義了客戶端和服務器角色.對于所有的OBEX事務.GOEP規(guī)定應由客戶端啟動所有事務.但是此配置文件并沒有描述應用程序就如何定義要交換的對象或如何實施交換.這些細節(jié)留給屬于GOEP的配置文件.即OPP,FTP和SYNC去完成.通常使用此配置文件的藍牙設備為筆記本電腦,PDA,手機及智能電話. 注意:藍牙1.1版本規(guī)范所有藍牙設備的最小實現(xiàn)必須支持通用訪問配置文件,服務發(fā)現(xiàn)應用配置文件和串行端口配置文件.
在兩臺電腦或者Labtop之間就可以建立這種連接,如下圖所示:
SPP是基于RFCOMM的,spp 協(xié)議處于rfcomm的上層,spp的應用需走rfcomm層。如果你使用RFCOMM能夠實現(xiàn),那么也就不需要使用SPP,而卻速度還會比SPP來做快,因為省略了采用profile的一些數(shù)據(jù)包頭等。不過,還是推薦采用SPP來做,兼容性有保證,這也是為什么藍牙本質上數(shù)據(jù)和語音的傳送卻出現(xiàn)HFP,HSP,SPP,OPP等諸多具體應用profile的原因。 2.2.2 藍牙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 ”。你可以在 找到關于一系列基于GATT的profile和service。
如上圖所示:藍牙設備可以包括多個Profile,一個Profile中有多個Service,一個Service中有多個Characteristic,一個Characteristic中包括一個value和多個Descriptor。
2.3 藍牙4.0和4.1
藍牙4.0實際是個三位一體的藍牙技術,它將傳統(tǒng)藍牙、低功耗藍牙和高速藍牙技術融合在一起,這三個規(guī)格可以組合或者單獨使用。也就是說 BLE是藍牙4.0增加的,之前沒有?(TBD)
藍牙4.0專門面向對成本和功耗都有較高要求的無線方案,其主打特性就是省電、省電、省電。極低的運行和待機功耗使得一粒紐扣電池甚至可連續(xù)工作一年之久。它有低功耗、經典、高速三種協(xié)議模式。其中:高速藍牙主攻數(shù)據(jù)交換與傳輸;經典藍牙則以信息溝通、設備連接為重點;低功耗藍牙以不需占用太多帶寬的設備連接為主。這三種協(xié)議規(guī)范能夠互相組合搭配,從而適應更廣泛的應用模式。正因為有了三種可以互相組合搭配的協(xié)議,藍牙4.0因此成為唯一一個綜合協(xié)議規(guī)范。它有著極低的運行和待機功耗。此外,低成本和跨廠商互操作性,3毫秒低延遲、AES-128加密等諸多特色,可以用于計步器、心律監(jiān)視器、智能儀表、傳感器物聯(lián)網(wǎng)等眾多領域,大大擴展藍牙技術的應用范圍。
藍牙4.1主打IOT(Internet Of Things全聯(lián)網(wǎng)),最新的藍牙4.1標準是個很有前途的技術,其智能、低功耗、高傳輸速度、連接簡單的特性將適合用在許多新興設備上。
藍牙4.1設備可以同時作為發(fā)射方和接受方,并且可以連接到多個設備上。舉個例子,智能手表可以作為發(fā)射方向手機發(fā)射身體健康指數(shù),同時作為接受方連接到藍牙耳機、手環(huán)或其他設備上。藍牙4.1使得批量數(shù)據(jù)可以以更高的速率傳輸,當然這并不意味著可以用藍牙高速傳輸流媒體視頻,這一改進的主要針對的還是剛剛興起的可穿戴設備。例如已經比較常見的健康手環(huán),其發(fā)送出的數(shù)據(jù)流并不大,通過藍牙4.1能夠更快速地將跑步、游泳、騎車過程中收集到。因為新標準加入了對IPv6專用通道聯(lián)機的支持,通過IPv6連接到網(wǎng)絡,實現(xiàn)與Wi-Fi相同的功能,解決可穿戴設備上網(wǎng)不易的問題。
藍牙4.0和藍牙4.1的比較
2.3.1 藍牙4.0低功耗(BLE)
① 低功耗藍牙Bluetooth Low Energy(BLE)是藍牙4.0增加的。(?TBD) ,蘋果系列都支持4.0.
② Android4.3(API級別18)引入內置平臺支持BLE的central角色,同時提供API和app應用程序用來發(fā)現(xiàn)設備,查詢服務,和讀/寫characteristics。與傳統(tǒng)藍牙(ClassicBluetooth)不同,藍牙低功耗(BLE)的目的是提供更顯著的低功耗。這使得Android應用程序可以和具有低功耗的要求BLE設備,如接近傳感器,心臟速率監(jiān)視器,健身設備等進行通信。 ③ BLE低功耗藍牙軟件有2個主要組成: OSAL操作系統(tǒng)抽象層和 HAL硬件抽象層,多個Task任務和事件在OSAL管理下工作,而每個任務和事件又包括3個組成:BLE 協(xié)議棧,profiles和應用程序。 BLE藍牙協(xié)議棧結構
附圖1 BLE藍牙協(xié)議棧結構圖
分為兩部分:控制器和主機。對于4.0以前的藍牙,這兩部分是分開的。所有profile(姑且稱為劇本吧,用來定義設備或組件的角色)和應用都建構在GAP或GATT之上。下面由結構圖的底層組件開始介紹。
附圖 2 BLE低功耗藍牙系統(tǒng)架構圖,圖中的Task用附圖1BLE藍牙協(xié)議棧結構圖來描述
通用屬性規(guī)范(GATT)—GATTprofile是一個通用規(guī)范用于在BLE鏈路發(fā)送和接收被稱為“屬性(attributes)”的數(shù)據(jù)片。目前所有的低功耗應用 profile都是基于GATT。 藍牙SIG定義了許多profile用于低功耗設備。Profile(配置文件)是一個規(guī)范,規(guī)范了設備如何工作在一個特定的應用場景。注意:一個設備可以實現(xiàn)多個profile。例如,一個設備可以包含一個心臟監(jiān)測儀和電池電平檢測器。
主從機連接建立過程:
2.3.2 藍牙4.0(BLE)主從通信透傳模塊
低功耗藍牙模塊主透傳協(xié)議是針對低功耗藍牙模塊從透傳協(xié)議設計的,通過本協(xié)議模塊可替代手機設備與從透傳協(xié)議模塊連接,實現(xiàn)透傳功能或直驅控制功能。此協(xié)議模塊可用作從透傳協(xié)議模塊開發(fā)過程中的輔助工具。 BLE主透傳協(xié)議模塊(以下簡稱MTTM)可以工作在透傳模式(TTM)或指令模式(CM)。 MTTM上電啟動后,處于待機模式(SBM),此時處于空閑狀態(tài),無睡眠,需要用戶通過AT指令控制模塊連接從設備。在成功與從設備建立鏈接后,MTTM會自動查找從設備的透傳通道,如果從設備屬于BLE從透傳協(xié)議模塊(以下簡稱STTM),MTTM默認進入透傳模式,否則默認進入指令模式。 透傳模式下,用戶CPU可以通過模塊的通用串口與STTM進行雙向通訊。從MTTM串口輸入的數(shù)據(jù)將轉發(fā)到STTM,并從STTM的串口輸出;從STTM輸入的數(shù)據(jù)將轉發(fā)到MTTM,并從MTTM的串口輸出,從而實現(xiàn)透明傳輸功能,用戶數(shù)據(jù)的具體含義由上層應用程序自行定義。
透傳中數(shù)據(jù)的格式也是profile,或藍牙標準profile或自定義simple profile?;窘Y構依然是: 1、profile
profile可以理解為一種規(guī)范,一個標準的通信協(xié)議,它存在于從機中。藍牙組織規(guī)定了一些標準的profile,例如 HID OVER GATT ,防丟器 ,心率計等。每個profile中會包含多個service,每個service代表從機的一種能力。
2、service
service可以理解為一個服務,在ble從機中,通過有多個服務,例如電量信息服務、系統(tǒng)信息服務等,每個service中又包含多個characteristic特征值。每個具體的characteristic特征值才是ble通信的主題。比如當前的電量是80%,所以會通過電量的characteristic特征值存在從機的profile里,這樣主機就可以通過這個characteristic來讀取80%這個數(shù)據(jù)
3、characteristic
characteristic特征值,ble主從機的通信均是通過characteristic來實現(xiàn),可以 理解為一個標簽,通過這個標簽可以獲取或者寫入想要的內容。
4、UUID
UUID,統(tǒng)一識別碼,我們剛才提到的service和characteristic,都需要一個唯一的uuid來標識
每個從機都會有一個叫做profile的東西存在,不管是上面的自定義的simpleprofile,還是標準的防丟器profile,他們都是由一些列service組成,然后每個service又包含了多個characteristic,主機和從機之間的通信,均是通過characteristic來實現(xiàn)。
實際產品中,每個藍牙4.0的設備都是通過服務和特征來展示自己的,服務和特征都是用UUID來唯一標識的。一個設備必然包含一個或多個服務,每個服務下面又包含若干個特征。特征是與外界交互的最小單位。藍牙設備硬件廠商通常都會提供他們的設備里面各個服務(service)和特征(characteristics)的功能,比如哪些是用來交互(讀寫),哪些可獲取模塊信息(只讀)等。比如說,一臺藍牙4.0設備,用特征A來描述自己的出廠信息,用特征B來與收發(fā)數(shù)據(jù)等。
?4.0中profile的存在是干嘛用的呢,只是一種組織形式存在?
服務和特征都是用UUID來唯一標識的,UUID的概念如果不清楚請自行google,國際藍牙組織為一些很典型的設備(比如測量心跳和血壓的設備)規(guī)定了標準的service UUID(特征的UUID比較多,這里就不列舉了) 4.0 BLE數(shù)據(jù)傳輸可參考下述系列:
(三)Android Bluetooth 架構1、面向庫的架構視圖
![]() 2、面向進程的架構視圖
![]() iOS 有兩個框架支持藍牙與外設連接。 一個是 ExternalAccessory。從ios3.0就開始支持,也是在iphone4s出來之前用的比較多的一種模式,但是它有個不好的地方,External Accessory需要拿到蘋果公司的MFI認證。 另一個框架則是本文要介紹的CoreBluetooth,在藍牙4.0出來之后(注意,硬件上要4s以上,系統(tǒng)要ios6以上才能支持4.0),蘋果開放了BLE通道,專門用于與BLE設備通訊(因為它的API都是基于BLE的)。這個不需要MFI,并且現(xiàn)在很多藍牙設備都支持4.0,所以也是在IOS比較推薦的一種開發(fā)方法?,F(xiàn)CoreBluetooth在的開發(fā)幾乎全部基于該框架,本節(jié)只介紹CoreBluetooth。
1,CoreBluetooth介紹 CoreBluetooth框架的核心其實是兩個東西,peripheral和central, 可以理解成外設和中心。對應他們分別有一組相關的API和類,如下圖所示:
如果你要編程的設備是手機的central,那么你大部分用到peripheral API。反之亦然,設備是peripheral,iphone手機是central,所以將大部分使用central API。使用peripheral編程的例子也有很多,比如像用一個ipad和一個iphone通訊,ipad可以認為是central,iphone端是peripheral,這種情況下在iphone端就要使用上圖右邊部分的類來開發(fā)了。 作為一個中心(central)要實現(xiàn)完整的通訊,一般要經過這樣幾個步驟: (1)建立中心角色—(2)掃描外設(discover)(通過接收從設備廣播來掃描、發(fā)現(xiàn)設備,獲得peripheral ID)— a, 如果數(shù)據(jù)中已經和某些藍牙設備綁定,可以使用BluetoothAdapter.getBondedDevices();方法獲得已經綁定的藍牙設備列表。通過指定特定的peripheral的UUID,central只會discover這個特定的設備。 b, 搜索周圍的藍牙設備受用BluetoothAdapter.startDiscovery()方法 c, 搜索到的藍牙設備都是通過廣播返回,so..。需要注冊廣播接收器來獲得已經搜索到的藍牙設備 (3)連接外設(connect)(根據(jù)peripheral ID連接指定的外設)—
(4)掃描外設中的服務和特征(discover)(一個設備里的服務和特征往往比較多,一般會在發(fā)現(xiàn)服務和特征的回調里通過service、characteristic UUID去匹配我們關心那些)— (5)與外設做數(shù)據(jù)交互(explore and interact)— (6)斷開連接(disconnect)。
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,IOS APP開發(fā) 的藍牙操縱API 手機APP要想獲得藍牙設備的一些額外的信息如電量或者操作藍牙設備,必須通過IOS API。那么IOS底層必然有某種方式來與藍牙設備交互。 那么電量通過什么來讀寫呢?自定義 service characteristic? 任何免提的藍牙耳機都可以在iOS設備的狀態(tài)欄中顯示一個用來標識他電池電量的圖標。這個特性被所有的iOS設備所支持,包括iPhone、iPod和iPad。耳機的藍牙知識通過兩個iOS藍牙HFP AT命令:HFP Command AT+XAPL
HFP命令AT+XAPL
HFP命令AT+IPHONEACCEV
(五)硬件接口
一般藍牙芯片通過UART、USB、SDIO、I2S、PcCard和主控芯片通信。如下圖所示,通過UART和主控芯片通信。
![]() 最后叮囑:大家有好的的藍牙通信的資料鏈接在下面留言分享下~多謝?(^?^*)
|
|
|