前言:
露臉 0_o 一直想開始寫一些文章,一直沒有機會寫,猶猶豫豫了好久,現在為大家帶來關於藍芽互動的文章,一方面為了提公升自己的能力,積累一點經驗,一方面也是希望分享自己所遇到的一些問題以及解決方法能給正在面臨這些問題的夥伴們帶來一些幫助。
概述:
在如今共享的時代,共享單車已經達到了乙個很龐大的數量,大到一線城市,小到二線三線城市,而共享單車的核心就是車鎖,車鎖開鎖模式又有藍芽,gprs等,在我開發專案的基礎下,我先總結了下藍芽4.0開發使用的一些東西分享一下,下面先看互動流程.
具體知道流程之後我們直接進入藍芽功能的一些運用與互動
藍芽許可權
允許搜尋發現附近裝置以及配對
允許連線到已配對的藍芽裝置
申請完許可權之後,我們先熟悉幾個藍芽開發主要使用類
bluetoothadapter
bluetoothadapter代表了移動裝置的本地的藍芽介面卡, 通過該藍芽介面卡可以對藍芽進行基本操作, 例如 : 啟動裝置發現(startdiscovery), 獲取已配對裝置(getboundeddevices), 通過mac藍芽位址獲取藍芽裝置(getremotedevice), 從其它裝置建立乙個監聽連線(listenusingrfcommwithservicerecord);
獲取該介面卡物件
> bluetoothadapter bluetoothadapter = bluetoothadapter.getdefaultadapter();
bluetoothmanager
bluetoothmanager在android4.3以上支援(api level 18),高階管理者用於獲得bluetoothadapter的例項並進行整體藍芽管理, 使用getsystemservice(string)建立乙個bluetoothmanager bluetooth_service,然後呼叫getadapter()來獲得thebluetoothadapter。或者,你可以呼叫靜態輔助getdefaultadapter()。
獲取該介面卡物件
>bluetoothmanager mbluetoothmanager =
(bluetoothmanager) getcontext().getsystemservice(context.bluetooth_service);
bluetoothadapter bluetoothadapter = mbluetoothmanager .getadapter();
在了解一些主要使用類之後我們開始藍芽4.0的開發的工作.
判斷藍芽的開啟與關閉
bluetoothmanager mbluetoothmanager =
(bluetoothmanager)
getcontext()
.getsystemservice
(context.bluetooth_service)
; bluetoothadapter bluetoothadapter = mbluetoothmanager .
getadapter()
;//如果bluetoothadapter == null,說明裝置不支援藍芽
if(bluetoothadapter.
isenabled()
)else
掃瞄搜尋附近裝置searchrequest request =
newsearchrequest.builder()
.searchbluetoothledevice
(3000,3
)// 先掃ble裝置3次,每次3s
.searchbluetoothclassicdevice
(5000
)// 再掃經典藍芽5s
.searchbluetoothledevice
(2000
)// 再掃ble裝置2s
.build()
; bluetoothclient.
search
(request,
newsearchresponse()
@override
public
void
ondevicefounded
(searchresult device)
}@override
public
void
onsearchstopped()
@override
public
void
onsearchcanceled()
});
連線裝置
bleconnectoptions options =
newbleconnectoptions.builder()
.setconnectretry(3
)// 連線如果失敗重試3次
.setconnecttimeout
(30000
)// 連線超時30s
.setservicediscoverretry(3
)// 發現服務如果失敗重試3次
.setservicediscovertimeout
(20000
)// 發現服務超時20s
.build()
; bluetoothclient.
connect
(device.
getaddress()
,new
bleconnectresponse()
}});
藍芽協議的通訊
我們在與藍芽通訊的時候,傳送或者接受指令,我們都需要service uuid,該 service 下的 characteristic,(uuid是「universally unique identifier」的縮寫,通用唯一識別碼的意思。對於藍芽裝置,每個服務都有乙個與它對應的uuid(唯一的)。)我們可以簡單看乙個,
0788888e-8535-b5a0-7140-a11112495cba 操作型別write 向硬體寫指令
0788888e-8535-b5a0-7140-a11112495cb8 操作型別notify 硬體返回的資訊
現在我們可以開始通過uuid來進行正常的傳送指令和接收指令,在傳送指令通訊之前我們先註冊藍芽通知.
//註冊通知使用serviceuuid和如圖notifity型別的characteristicuuid
bluetoothclient.
notify
(mac, serviceuuid, characteruuid2,
newblenotifyresponse()
@override
public
void
onresponse
(int code)}}
);
8 len 0x08
9-16 data 裝置識別 key,8 位元組
17 crc crc 之前資料經過加密後的 crc16 校驗值
18 我們根據以上拼接乙個byte陣列,(中途會有一些加密方式比如crc校驗,異或等)然後傳送給藍芽裝置
//傳送指令使用serviceuuid和如圖write型別的characteristicuuid
bluetoothclient.
write
(mac, serviceuuid, characteruuid1, data,
newblewriteresponse()
}});
我們還有可能會需要知道一些藍芽的連線狀況,此時我們可以註冊乙個藍芽連線的監聽
bluetoothclient.
registerconnectstatuslistener
(mac,
newbleconnectstatuslistener()
else
if(status == status_disconnected)}}
);
至此藍芽通訊就結束了,當然在ibluetoothclient 介面中 我們還有一些藍芽的功能,比如斷開連線,停止搜尋,取消註冊一些通知和監聽,傳送無返回型別指令,讀取指令資訊等等,其他藍芽通訊裝置大部分都是這種型別,我們可以舉一反三.
public
inte***ce
ibluetoothclient
Android 藍芽4 0踩坑 掃瞄不到裝置
藍芽開啟之後啟動掃瞄。用2.0 bluetoothadapter.startdiscovery 這個方法可以發現藍芽裝置。但是使用低功耗藍芽的api bluetoothlescanner bluetoothlescanner bluetoothadapter.getbluetoothlescanne...
Android藍芽BLE4 0踩過的坑
一直都負責專案的藍芽模組,期間踩過很多坑,說出來跟大家分享一下。1.從簡單的開始,首先是許可權的問題,在android6.0以上,部分機型需要開啟定位許可權,部分機型需要同時開啟gps。所以使用藍芽之前,你可以動態申請定位許可權,或者直接將targetsdkversion設定為23以下。2.藍芽剛開...
藍芽BLE4 0透傳 智慧型穿戴應用
隨著技術改革公升級和消費觀念公升級,智慧型穿戴產品從過去單一功能向多功能化發展,同時具有更便攜 實用的特點。加入骨感測 人臉識別 地理定位等各種感測器,可以多方位多角度獲取資料資訊。甚至接入語音 體感等人機介面,實現更方便更靈活的互動體驗。智慧型穿戴產品採用的互聯方式主要有nfc wifi 藍芽。n...