一、藍牙基礎知識
1.藍牙( Bluetooth )是一種無線技術標準,可實現固定設備、移動設備和樓宇個人域網之間的短距離數據交換。藍牙基于設備低成本的收發器芯片,傳輸距離近、低功耗。
?
2.微波頻段:使用2.402GGHz到2.480GHz(包含防護頻帶)的ISM波段的UHF無線電波
?
3.藍牙使用跳頻技術。將傳輸的數據切割成數據包,通過79個指定的藍牙頻道分別數據傳輸包。
每一個頻道的頻寬為1MHz。
?
4.藍牙是基于數據包、有著主從架構的協議。
一個主設備至多可和同一微微網中的七個從設備通訊。全部設備共享主設備的時鐘。
?
5.藍牙機器作為主設備的時候最多可與七個從設備連接。
從設備一般僅僅與一個主設備連接。設備之間能夠通過協議轉換角色。
?
6. 功率射程
?
類別 | 最大功率容量 | 射程范圍 (m) | |
(mW) | (dBm) | ||
1 | 100 | 20 | ~100 |
2 | 2.5 | 4 | ~10 |
3 | 1 | 0 | ~1 |
?
7.數據吞吐量
?
版本號 | 數據率 | 最大應用吞吐量 |
1.2 | 1Mbit/s | >80 kbit/s |
2.0 + EDR | 3 Mbit/s | >80 kbit/s |
3.0 + HS | 24 Mbit/s | 請參考3.0 + HS |
4.0 | 24 Mbit/s | 請參考4.0 LE |
?
7.關于射程:多數藍牙應用是為室內環境而設計的,因為墻的衰減和信號反射造成的信號衰落會使得射程遠小于藍牙產品規定的射程范圍。兩個敏感度和發射功率都較高的1類設備相連接,射程可遠高于一般水平的100m,取決于應用所須要的吞吐量。有些設備在開放的環境中的射程可以高達1km甚至更高。
?
8.最新版本號:藍牙4.2,公布于2014年12月2日(截止2016年3月22日)
?
9.每一個設備都有一個唯一的48-位的地址。
然而這些地址并不會顯示于連接請求中。
可是用戶可自行為他的藍牙設備命名(藍牙設備名稱),這一名稱就可以顯示在其它設備的掃描結果和配對設備列表中。
?
10.藍牙框架
?
?
?
11.藍牙核心系統包含主機和控制器兩部分。當中控制器包含主控制器和次控制器。
?
?
12.藍牙基本規范
在藍牙作用有四種基本規范(Profile),這些規范會被其他的規范使用。
它們是:
(1)GAP Profile: Generic Access Profile。該Profile保證不同的Bluetooth產品能夠互相發現對方并建立連接。
(2)SDAP Profile: Service Discovery Application Profile,通過該Profile,一個Bluetooth設備能夠找到其他Bluetooth設備提供的服務。以及查詢相關的信息。
(3)SPP Profile: Serial Port Profile。模擬串口通訊
(4)GOEP Profile: Generic Object Exchange Profile,通用對象交換。
這個Profile的名字有些費解。它定義的是數據的傳輸,包含同步,文件傳輸。或者推送其他的數據。能夠理解為內容無關的傳輸層協議。能夠被不論什么應用用來傳輸自定義的數據對象。
?
13.藍牙應用規范
???BR/EDR profile(Android支持)
(1)A2DP(Advanced Audio Distribution Profile)
高級音頻、立體聲規范,包含A2DP Sink和A2DP Source;
(2)AVRCP(Audio/Video Remote Control Profile)
音視頻遠程控制規范。音樂播放、暫停等。
(3)HFP(Hands-Free Profile)
免提規范,用于藍牙通話;
(4)HSP(Headset Profile)
耳機規范。用于藍牙耳機;
(5)HID(Human Interface Device Profile)
人體接口設備規范,分為HID Host和HID Device;
(6)OPP(Object Push Profile)
對象推送規范。用于傳輸文件;
(7)PAN(Personal Area Networking Profile)
個人局域網規范,藍牙網絡共享。
(8)PBAP(Phone Book Access Profile)
電話號碼簿訪問規范;
(9)MAP(Message Access Profile)
信息訪問規范;
(10)HDP(Health Device Profile)
健康設備規范,和一些健康設備進行通信;
(11)BLP(Blood Pressure Profile)
血壓規范;
(12)FMP(Find Me Profile)
找我規范;
(13)HRP(Heart Rate Profile)
心率規范;
(14)HOGP(HID Over GATT Profile)
基于GATT的HID規范。
(15)TIP(Time Profile)
時間規范。
?
?
二、硬件部分知識
1.基礎處理器
(1)AP:ApplicationProcessor應用處理器
???????? 採用ARM架構的CPU,通常負責執行OS和一些特定設置和加載開機預設。比方一個沒有電話功能的平板電腦,僅僅跑android或者win8的系統。僅僅要AP就能夠。
(2)BP:BasebandProcessor 基帶處理器
???????? 架構相對于AP簡單。處理電話、信息之類的功能。
(3)CP:coprocessor? Processor 協處理器
???????? 基帶芯片加協處理器(CP,一般是多媒體加速器),?用來通過處理主cpu的一些工作負荷來使操作提速的輔助處理器。
(4)RF:Radio Frequency射頻部分
?? ? ? ?無線信號的發射部分,如電話、藍牙、WIFI信號發射、接收。
?
2.簡單平板電腦結構框圖
?
??? AP芯片+外設+Android系統
?
3.藍牙硬件接口框圖(以UART接口芯片為例)
????????
???????? ???????? (1)UART部分:串口。主要負責傳輸數據;
???????? ???????? (2)PCM 部分:語音接口,用于通話時語音傳輸數據;
???????? ???????? (3)Power部分:電源控制。
三、軟件部分知識
1.Android Bluetooth Architecture藍牙代碼架構
?
1.1 串口驅動
Linux的內核的藍牙驅動程、Linux的內核的藍牙協議的層
?
1.2BlueZ的適配器
????????
(1)內核代碼:由驅動程序和BlueZ核心協議組成
驅動程序:實如今內核源碼kernel/driver/bluetooth中(包括Linuxkernel對各種接口的)包括:USBdriver、USB driver and Otherdriver。
Bluetooth協議:實如今內核源碼 kernel/net/bluetooth中。
包含:hci、l2cap、hid、rfcomm、sco、SDP、BNEP等協議的實現。
(2)用戶態程序及工具集:
???????? 包含應用程序接口和BlueZ工具集。
BlueZ提供函數庫以及應用程序接口。便于程序猿開發bluetooth應用程序。BlueZ utils是主要工具集,實現對bluetooth設備的初始化和控制。
1.3 藍牙相關的應用程序接口
???????? Android.buletooth包中的各個Class(藍牙在框架層的內容)
類名 | 作用 |
BluetoothAdapter | 本地藍牙設備的適配類,全部的藍牙操作都要通過該類完畢 |
BluetoothClass | 用于描寫敘述遠端設備的類型,特點等信息 |
BluetoothDevice | 藍牙設備類。代表了藍牙通訊過程中的遠端設備 |
BluetoothServerSocket | 藍牙設備服務端,類似ServerSocket |
BluetoothSocket | 藍牙設備client,類似Socket |
BluetoothClass.Device | 藍牙關于設備信息 |
BluetoothClass.Device.Major | 藍牙設備管理 |
BluetoothClass.Service | 藍牙相關服務 |
?
附:Google官方提供的藍牙代碼框架圖
?
2.Hciattach:建立串口和藍牙協議層的數據連接通道
?
3.傳輸數據流程
(1) uart口取得藍牙模塊的數據;
(2) uart口通過ldisc傳給hci_uart;
(3) hci_uart傳給在其上的h4;
(4) h4傳給hci層;
(5) hci層傳給l2cap層;
(6) l2cap層再傳給rfcomm。
?
4.BluetoothAdapter:藍牙適配器
??? 直到我們建立bluetoothSocket連接之前。都要不斷操作它。
BluetoothAdapter中的動作常量
ACTION_DISCOVERY_FINISHED | 已完畢藍牙搜索 |
ACTION_DISCOVERY_STARTED | 已經開始搜索藍牙設備 |
ACTION_LOCAL_NAME_CHANGED | 更改藍牙的名字 |
ACTION_REQUEST_DISCOVERABLE | 請求可以被搜索 |
ACTION_REQUEST_ENABLE | 請求啟動藍牙 |
ACTION_SCAN_MODE_CHANGED | 掃描模式已經改變 |
ACTION_STATE_CHANGED | 狀態已改變 |
ACTION_CONNECTION_STATE_CHANGED | ? |
?
?
5.常量介紹
?
(1)開關狀態值
藍牙關閉?: int STATE_OFF?, 值為10, 藍牙模塊處于關閉狀態;
藍牙打開中?: int STATE_TURNING_ON?, 值為11, 藍牙模塊正在打開;
藍牙開啟?: int STATE_ON?, 值為12, 藍牙模塊處于開啟狀態;
藍牙開啟中?: int STATE_TURNING_OFF?, 值為13, 藍牙模塊正在關閉;
藍牙開關狀態順序?: STATE_OFF --> STATE_TURNING_ON --> STATE_ON -->STATE_TURNING_OFF --> STATE_OFF;
?
(2)掃描狀態值
無功能狀態?: int SCAN_MODE_NONE?, 值為20, 查詢掃描和頁面掃描都失效, 該狀態下藍牙模塊既不能掃描其他設備, 也不可見;
掃描狀態?: int SCAN_MODE_CONNECTABLE?, 值為21, 查詢掃描失效, 頁面掃描有效, 該狀態下藍牙模塊能夠掃描其他設備, 從可見性來說僅僅對已配對的藍牙設備可見, 僅僅有配對的設備才干主動連接本設備;
可見狀態?: int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值為23, 查詢掃描和頁面掃描都有效;
?
查詢掃描功能?: 其他設備能夠掃描到本設備 , 指的是可見性可見;
頁面掃描功能?: 能夠主動掃描其他設備;
?
(3)藍牙操作接收的廣播
開始搜索廣播?: String ACTION_DISCOVERY_STARTED, 藍牙適配器開始搜索遠程設備, 值為"android.bluetooth.action.DISCOVERY_START",藍牙適配器開始搜索之后, 會先有12秒的查詢掃描(12s內可見), 查詢掃描后進行頁面掃描(主動搜索), 須要BLUETOOTH權限;
假設搜索到藍牙設備, 就會收到BluetoothDevice.ACTION_FOUND廣播, 能夠從Intent中獲取存放在當中的BluetoothDevice對象,intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
設備查找很消耗資源, 在查找的過程中, 不能連接遠程的藍牙設備, 已經存在的連接也要限制帶寬, 假設想要運行除查找外的其他操作, 之前最好調用cancelDiscovery();
?
搜索完畢廣播?: String ACTION_DISCOVERY_FINISHED,藍牙S適配器完畢搜索發出的廣播,?
值為"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 須要BLUETOOTH權限;
?
藍牙名稱改變廣播?: String ACTION_LOCAL_NAME_CHANGED, 本地的藍牙適配器改變了自己的名稱, 值為"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED",注意改變的是本設備名稱, 不是遠程設備的.這個廣播包括一個EXTRA_LOCAL_NAME附加域, 須要BLUETOOTH權限;
?
掃描模式變化廣播?: String ACTION_SCAN_MODE_CHANGED, 藍牙模塊掃描模式發生了變化, 值為"android.bluetooth.adapter.action.SCAN_MODE_CHANGED",該Intent對象包括了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE,兩個附加域各自是新的和舊的掃描模式, 這里能夠依據前后掃描模式的不同做出不同的操作, 須要BLUETOOTH權限;
?
開關模式變化廣播?: String ACTION_STATE_CHANGED, 藍牙模塊被打開或者關閉, 值為"android.bluetooth.adapter.action.STATE_CHANGED",該廣播的Intent中包括EXTRA_STATE和EXTRA_PREVIOUS_STATE兩個附加域, 須要BLUETOOTH權限;
?
(4)藍牙操作請求的廣播
開啟藍牙?: String ACTION_REQUEST_ENABLE, 打開藍牙, 值為"android.bluetooth.adapter.action.REQUEST_ENABLE",
Intentintent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,requestCode);
能夠在Activity中的onActivityResult()方法中處理結果, 假設藍牙模塊打開成功, 則返回結果嗎RESULT_OK; 假設藍牙模塊打開失敗, 則返回結果碼RESULT_CANCELED;
打開和關閉藍牙模塊, 都能夠通過ACTION_STATE_CHANGED廣播來監聽;
?
藍牙可見?: String ACTION_REQUEST_DISCOVERABLE, 使藍牙可見, 值為"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE",默認的可見時間為120s, 能夠在廣播中加入附加域, 設置隨意的可見時間, 附加域為EXTRA_DISCOVERABLE_DURATION, 須要BLUETOOTH權限;
能夠在Activity中的onActivityResult()方法中處理結果, 假設藍牙模塊設置可見成功, 則返回結果嗎RESULT_OK; 假設藍牙模塊設置可見失敗, 則返回結果碼RESULT_CANCELED;
IntentdiscoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,0);
startActivityForResult(discoverableIntent,resultCode)
?
(5)附加域
附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法加入附加域;
掃描模式附加域?: 這兩個附加域的值是掃描模式, 能夠為SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE,SCAN_MODE_CONNECTABLE_DISCOVERABLE;
String?EXTRA_SCAN_MODE?:值為"android.bluetooth.adapter.extra.SCAN_MODE";
String?EXTRA_PREVIOUS_SCAN_MODE?:值為"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";
?
開關狀態附加域?: 這兩個附加域的值是開關狀態, 能夠為STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON;
String?EXTRA_STATE?:值為"android.bluetooth.adapter.extra.STATE";
String?EXTRA_PREVIOUS_STATE?:值為"android.bluetooth.adapter.extra.PREVIOUS_STATE";
?
藍牙名稱附加域?: String EXTRA_LOCAL_NAME?, 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值為"android.bluetooth.adapter.extra.LOCAL_NAME";
?
可見時間附加域?: String EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE廣播的可見時長, 值為"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";
?
(6)錯誤碼
int?ERROR?,這個值用來標記錯誤 , 方便自己使用的 , 沒有實際意義。
?
6.A2DP連接的建立
A2DP_CONNECT上層代碼流程表