標籤:移動 oid top 輔助 頻道 關閉 port file ini
一、藍芽基礎知識
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上層代碼流程表
Android Bluetooth模組學習筆記