認識BLE
BLE 是Bluetooth Low Energy 的縮寫,又叫藍牙4.0,區別于藍牙3.0和之前的技術。BLE前身是NOKIA開發的Wibree技術,主要用于實現移動智能終端與周邊配件之間的持續連接,是功耗極低的短距離無線通信技術,并且有效傳輸距離被提升到了100米以上,同時只需要一顆紐扣電池就可以工作數年之久。
認識單雙模
BLE是在藍牙技術的基礎上發展起來的,既同于藍牙,又區別于傳統藍牙。BLE設備分單模和雙模兩種,雙模簡稱BR,商標為Bluetooth Smart Ready,單模簡稱BLE或者LE,商標為Bluetooth Smart。Android是在4.3后才支持BLE,這可以解釋不是所有藍牙手機都支持BLE,而且支持BLE的藍牙手機一般是雙模的。
單雙模用途
雙模兼容傳統藍牙,可以和傳統藍牙通信,也可以和BLE通信,常用在手機上,android4.3和IOS4.0之后版本都支持BR,也就是雙模設備。單模只能和BR和單模的設備通信,不能和傳統藍牙通信,由于功耗低,待機長,所以常用在手環的智能設備上。這可以解釋手機上的BLE與手環等設備上的BLE的區別。
支持
不是所有手機都支持BLE,因為BLE不僅僅依靠軟件實現,同時需要硬件支持,于是有很多手機不能聯接智能手環等設備。Android4.3手機上安裝的是雙模BR,因此兼容藍牙3.0之前的技術,既能與BLE設備通信,也能與傳統藍牙通信,比較耗電,能夠像傳統設備一樣高速傳輸。大部分智能手環使用的單工BLE,不支持傳統藍牙,不能與之聯結和通信,低功耗低速率設備。
https://www.bluetooth.com/ https://developer.android.google.cn/guide/topics/connectivity/bluetooth-le.html
特征 BLE(Bluetooth Low Energy),藍牙4.0核心PRofile,主要特點是快速搜索,快速連接,超低功耗保持連接和數據傳輸,缺點:數據傳輸速率低,由于其具有低功耗特點,所以經常用在可穿戴設備之中。
數據傳輸 (1)Generic Attribute Profile (GATT)
通過BLE連接,讀寫屬性類小數據的Profile通用規范?,F在所有的BLE應用Profile都是基于GATT的。
(2)Attribute Protocol (ATT)
GATT是基于ATT Protocol的。ATT針對BLE設備做了專門的優化,具體就是在傳輸過程中使用盡量少的數據。每個屬性都有一個唯一的UUID,屬性將以characteristics and services的形式傳輸。
(3)Characteristic
Characteristic可以理解為一個數據類型,它包括一個value和0至多個對次value的描述(Descriptor)。
(4)Descriptor
對Characteristic的描述,例如范圍、計量單位等。
(5)Service
Characteristic的集合。例如一個service叫做“Heart Rate Monitor”,它可能包含多個Characteristics,其中可能包含一個叫做“heart rate measurement”的Characteristic。
圖說關系
如下圖所示,一個Service
包含一個或多個Characteristic
; 一個Characteristic
包含一個或多個Descriptor
;
中心設備和外圍設備(Central vs. peripheral)
中心設備和外圍設備的概念針對的是BLE連接本身。相關內容移步:
Android - BlueTooth BLE 之 Central 與 Peripheral 理解
GATT server vs. GATT client:
這兩種角色取決于BLE連接成功后,兩個設備間通信的方式。例如:當 連接建立后,它們之間就需要傳輸GATT數據。誰做server
,誰做client
,則取決于具體數據傳輸的情況;哪一方發送數據,那么它就是server
端。
在BLE支持上,Android 從 4.3 (API 18 )才可以使用(android.bluetooth
),在Android 5.0 (API 21)版本中,新添加了android.bluetooth.le
包,方便開發BLE,新增 使用Scaner進行掃描藍牙設備 與 Advertiser 相關 外圍設備(Peripheral)開發包。
后面我將實現API實現 BLE設備掃描((4.3~5.0與5.0以上)兩種方式),連接,數據傳輸,最后將實現兼容性處理,封裝為BleTooth 庫,以便使用,后將使用手機作為外圍,來體驗使用android.bluetooth.le
包下 Advertiser
相關內容。
Android 5.0 及其之后,需要定位權限; Android 6.0定位權限需要申請,在這里不實現;簡單方法:將build.gradle 中 targetSdkVersion 修改為 22
Android 5.0 之后權限配置 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.access_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>配置 FeatureAndroid 5.0及其以上配置 :
<uses-feature android:name="android.bluetooth.le" android:required="true"/>5.0以下 配置:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>required 為true 時,應用將只能安裝在支持BLE的設備上; 一般設置為false,這樣都可以安裝,就顯得友好,不過這樣做的話,需要進行代碼判斷:
// Use this check to determine whether BLE is supportedon the device. Then// you can selectively disable BLE-related features.if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){ // 不支持BLE設備 finish();}判斷藍牙是否打開通過BluetoothAdapter實現判斷
private void checkBlueToothDevice() { BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter(); if (defaultAdapter == null) { //不支持藍牙 } else { if (!defaultAdapter.isEnabled()) { //藍牙沒有打開 } } }廣播監聽實現系統藍牙狀態(打開,關閉) //onCreate()中注冊廣播 private void registerBlueToothReceiver() { IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(blueToothReceiver, filter); } //onDestory() 中解注冊廣播 private void unRegisterBlueToothReceiver() { unregisterReceiver(blueToothReceiver); } //狀態監聽廣播 private BroadcastReceiver blueToothReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case BluetoothAdapter.ACTION_STATE_CHANGED: int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0); switch (blueState) { case BluetoothAdapter.STATE_TURNING_ON: break; case BluetoothAdapter.STATE_ON: break; case BluetoothAdapter.STATE_TURNING_OFF: break; case BluetoothAdapter.STATE_OFF: showDialog("請先打開藍牙,才可以使用!", 2); break; } break; } } };新(這)的(是)一年(句),加(費)油(話)!
新聞熱點
疑難解答