1、藍牙基礎知識android
1.藍牙( Bluetooth )是一種無線技術標準,可實現固定設備、移動設備和樓宇我的域網之間的短距離數據交換。藍牙基於設備低成本的收發器芯片,傳輸距離近、低功耗。程序員
2.微波頻段:使用2.402GGHz到2.480GHz(包括防禦頻帶)的ISM波段的UHF無線電波網絡
3.藍牙使用跳頻技術,將傳輸的數據分割成數據包,經過79個指定的藍牙頻道分別傳輸數據包。每一個頻道的頻寬爲1MHz。架構
4.藍牙是基於數據包、有着主從架構的協議。一個主設備至多可和同一微微網中的七個從設備通信。全部設備共享主設備的時鐘。框架
5.藍牙機器做爲主設備的時候最多可與七個從設備鏈接。從設備通常只與一個主設備鏈接。設備之間能夠經過協議轉換角色。ide
6. 功率射程函數
7.關於射程:多數藍牙應用是爲室內環境而設計的,因爲牆的衰減和信號反射形成的信號衰落會使得射程遠小於藍牙產品規定的射程範圍。兩個敏感度和發射功率都較高的1類設備相鏈接,射程可遠高於通常水平的100m,取決於應用所須要的吞吐量。有些設備在開放的環境中的射程可以高達1km甚至更高。工具
8.最新版本:藍牙4.2,發佈於2014年12月2日(截止2016年3月22日)設計
9.每一個設備都有一個惟一的48-位的地址。然而這些地址並不會顯示於鏈接請求中。可是用戶可自行爲他的藍牙設備命名(藍牙設備名稱),這一名稱便可顯示在其餘設備的掃描結果和配對設備列表中。3d
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)
時間規範。
2、硬件部分知識
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部分:電源控制。
3、軟件部分知識
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(藍牙在框架層的內容)
附: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中的動做常量
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上層代碼流程表