1. 程式人生 > >個人進階之路——安卓藍芽模組

個人進階之路——安卓藍芽模組

今天學習一下專案中的藍芽的基礎知識
Android系統包含了對藍芽網路協議棧的支援,使得安卓裝置能無線連線其他藍芽裝置交換資料。
應用程式框架提供訪問藍芽功能的APIs,使得應用程式能夠通過無線連線其他藍芽裝置,實現點對點,或者點對多點的無線互動
通過使用藍芽APIs,應用程式能實現如下功能:
1、掃描其他藍芽裝置
2、查詢本地藍芽介面卡,用於匹配藍芽裝置
3、建立RFCOOM通道
4、通過服務發現連線其他裝置
5、資料通訊
5、管理多個連線

Android平臺的藍芽系統基於BlueZ實現,通過Linux中完整的藍芽協議棧開源實現
Bluez被廣泛應用於各種Linux版本中,植入到其他晶片中使用、
Linux2.6核心包含完整的Bluez協議棧,在Android 系統中已經移植並嵌入進入Bluez 的使用者空間實現和更新
藍芽,Bluetooth,短距離無線電技術。
在Android系統中已經移植除了Kernel支援外,還需要使用者空間的Bluez的支援

Android平臺中藍芽模組的基本層次結構
【藍芽應用】 【平臺API】
【本地框架】bluetooth包 【Android系統】
【本地系統】JNL,適配層,Bluez庫 【Android系統】
【藍芽裝置】 【硬體和驅動】

Android平臺中藍芽系統從上到下主要包括Java框架中的BlueTooth類,Android適配庫,Bluez庫,驅動程式和協議
(1)Bluez庫,提供對使用者空間藍芽的支援,包括主機控制協議HCI以及其他眾多核心實現協議介面
實現所有藍芽應用模式Profile
(2)藍芽的JNI部分
(3)Java框架層藍芽的服務部分負責管理並且使用底層本地服務,並封裝成系統服務。
bluetooth部分中包含了各個藍芽平臺的API部分,以供應用程式層使用
(4)BlueTooth的適配庫
用於生成庫libbluedroid.so以及相關工具和庫,能夠實現對藍芽裝置的管理(電池管理)

分析藍芽模組的原始碼
初始化藍芽晶片,通過BlueZ工具hciattach進行的,
hciatach命令主要用於初始化藍芽裝置,
其中引數type決定初始化的裝置型號,
可以使用hciattach -l 來列出所有所支援的裝置型號
並不是所有的引數對所有的裝置都是適用的,有些裝置會忽略一些引數設定。(忽略bdaddr引數)
hciatach命令內部的工作步驟是:
1、開啟指定的tty裝置
2、做一些通用設定(如flow)
3、設定波特率為initial_speed,
4、根據type呼叫各自的初始化程式碼
5、將波特率重新設定為speed。
呼叫hciatach命令時,要根據實際情況,設定好intial_speed和speed
typeBCSP,初始化程式碼時,完成BCSP協議的同步操作,並不對藍芽晶片做任何的pskey的設定

藍芽服務
一般不需要使用者自定定義,只需要初始化指令碼檔案init.c的預設內容即可

管理藍芽電池
可以呼叫rfkill介面來控制電源管理,實現了該介面則無需再次進行配置,
如果在檔案init.rc中已經實現了hciattach服務,說明在libbluedroid中已經實現了對其的呼叫,以及操作藍芽的初始化

和藍芽相關類
BlueToothServer類
藍芽系統和Socket套接字密切相關,藍芽端的監聽介面和TCP埠類似
都是使用了Socket和ServerSocket類,在伺服器端,使用BluetoothSocket類去初始化並管理一個外接連線
最通常使用的藍芽埠是RFCOMM,被API支援的型別。
RFCOMM,一種面向連線,通過藍芽模組進行的資料流傳輸方式,串列埠規範SPP

使用方法BluetoothDevice.createRfcommSocketServiceRecord(),然後呼叫connect()方法,去嘗試一個面向遠端裝置的連線
R:建立一個BluetoothSocket去連線一個已知裝置
該呼叫將被阻塞,指導一個連線已經建或者該改連結失效

為了建立一個BluetoothSocket作為服務端(主機),每當該埠連線成功後,無論它初始化為客戶端,或者被接受作為伺服器端,都通過方法getInputStream()和getOutputStream()來開啟IO流,從而獲得各自的InputStream和OutputStream物件。

BluetoothSocket類是線性安全的, close方法總會馬上放棄外界操作並關閉伺服器埠