BLE簡介和Android BLE編程

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   ar   color   os   

一.BLE和BT區別

其實我知道許多程式員不太喜歡閱讀除了代碼以外的文檔,因為有時這些過於冗長的文檔對編程並沒有更多的好處,有了協議,介面,demo差不多很多人就能寫出很好品質的代碼了。但其實更深入的編程是少了閱讀的,閱讀文檔可以解決很多編程中遇到的困難,比如在大資料大流量情況下,很多正常的程式會表現出不可靠的一面,這已經不是夠編程能解決的了,硬體的配置,伺服器頻寬,使用的資料庫,調用的介面都有可能是瓶頸。比如BLE,同樣的藍芽,但卻有著本質區別,一個表現就是不是所有藍牙裝置都支援BLE,編程如果不考慮這個問題,程式出錯就會迷茫。再比如串連到BLE或者藍芽上的裝置是有數量限制的,如果不知道這個限制,在串連不上時,也會六神無主。

BLE在智家置中和行動裝置中的應用方興未艾,做深入的研究推廣到更多的應用上,還是有意義的。

1藍芽的曆史:藍芽的創始公司是愛立信。1994年愛立信開始對小範圍無線通訊技術進行研發,在1997年,愛立信的研究激發了其他公司的濃厚興趣,於是1998年2月,一些跨國大公司包括諾基亞、蘋果、三星組成的一個特殊興趣小組(SIG),他們共同的目標是建立一個全球性的小範圍無線通訊技術,該項技術就是藍芽。

 

2.BLE 是Bluetooth Low Energy的縮寫,又叫藍芽4.0,區別於藍芽3.0和之前的技術。BLE前身是NOKIA開發的Wibree技術,主要用於實現移動智能終端與周邊配件之間的持續串連,是功耗極低的短距離無線通訊技術,並且有效傳輸距離被提升到了100米以上,同時只需要一顆紐扣電池就可以工作數年之久。
 
3. BLE是在藍芽技術的基礎上發展起來的,既同於藍芽,又區別於傳統藍芽。BLE裝置分單模和雙模兩種,雙模簡稱BR,商標為Bluetooth Smart Ready,單模簡稱BLE或者LE,商標為Bluetooth Smart。Android是在4.3後才支援BLE,這可以解釋不是所有藍芽手機都支援BLE,而且支援BLE的藍芽手機一般是雙模的。
 
4.雙模相容傳統藍芽,可以和傳統藍芽通訊,也可以和BLE通訊,常用在手機上,android4.3和IOS4.0之後版本都支援BR,也就是雙模裝置。單模只能和BR和單模的裝置通訊,不能和傳統藍芽通訊,由於功耗低,待機長,所以常用在手環的智慧型裝置上。這可以解釋手機上的BLE與手環等裝置上的BLE的區別。
 
5不是所有手機都支援BLE,因為BLE不僅僅依靠軟體實現,同時需要硬體支援,於是有很多手機不能聯結智能手環等裝置。Android4.3手機上安裝的是雙模BR,因此相容藍芽3.0之前的技術,既能與BLE裝置通訊,也能與傳統藍芽通訊,比較耗電,能夠像傳統裝置一樣高速傳輸。大部分智能手環使用的單工BLE,不支援傳統藍芽,不能與之連接和通訊,低功耗低速率裝置。
 

二.BLE(低功耗藍芽)的用途

應用特點:小包傳輸,手機擴充,低功耗

☆ 2.4G 藍芽低功耗系統

☆ 消費類電子產品

☆ 秱勱電話外圍擴充裝置

☆ 運勱和休閑裝置

☆ 健康醫學用品 (血壓計,體溫計 …)

☆ 汽車電子裝置

☆ 人機介面裝置 (鍵盤,滑鼠,遙控器 …)

☆ USB Dongle

 

三藍芽的工作原理

1 藍芽通訊的主從關係

藍芽技術規定每一對裝置之間進行藍芽通訊時,必須一個為主角色,另一為從角色,才能進行通訊,通訊時,必須由主端進行尋找,發起配對,建鏈成功後,雙方即可收發資料。理論上,一個藍芽主端裝置,可同時與7個藍芽從端裝置進行通訊。一個具備藍芽通訊功能的裝置,可以在兩個角色間切換,平時工作在從模式,等待其它主裝置來串連,需要時,轉換為主模式,向其它裝置發起呼叫。一個藍牙裝置以主模式發起呼叫時,需要知道對方的藍芽地址,配對密碼等資訊,配對完成後,可直接發起呼叫。這可以解釋為什麼有時無法串連藍芽,有可能是串連的藍牙裝置過多。

2藍芽的呼叫過程

藍芽主端裝置發起呼叫,首先是尋找,找出周圍處於可被尋找的藍牙裝置。主端裝置找到從端藍牙裝置後,與從端藍牙裝置進行配對,此時需要輸入從端裝置的數字 PIN 碼,也有裝置不需要輸入數字 PIN 碼。配對完成後,從端藍牙裝置會記錄主端裝置的信任資訊,此時主端即可向從端裝置發起呼叫,已配對的裝置在下次呼叫時,不再需要重新配對。已配對的裝置,做為從端的藍芽耳機也可以發起建鏈請求,但做資料通訊的藍芽模組一般不發起呼叫。鏈路建立成功後,主從兩端之間即可進行雙向的資料或語音通訊。在通訊狀態下,主端和從端裝置都可以發起斷鏈,斷開藍芽鏈路。

3 藍芽一對一的串口資料轉送應用

藍芽資料轉送應用中,一對一串口資料通訊是最常見的應用之一,藍牙裝置在出廠前即提前設好兩個藍牙裝置之間的配對資訊,主端預存有從端裝置的數字 PIN 碼、地址等,兩端裝置加電即自動建鏈,透明串口傳輸,無需外圍電路幹預。一對一應用中從端裝置可以設為兩種類型,一是靜默狀態,即只能與指定的主端通訊,不被別的藍牙裝置尋找;二是開發狀態,既可被指定主端尋找,也可以被別的藍牙裝置尋找建鏈。

 

四.Android與BLE

1.關鍵概念:

Generic Attribute Profile (GATT)

通過BLE串連,讀寫屬性類小資料的Profile通用規範。現在所有的BLE應用Profile都是基於GATT的。

 

Attribute Protocol (ATT)

GATT是基於ATTProtocol的。ATT針對BLE裝置做了專門的最佳化,具體就是在傳輸過程中使用盡量少的資料。每個屬性都有一個唯一的UUID,屬性將以characteristics and services的形式傳輸。

 

Characteristic

Characteristic可以理解為一個資料類型,它包括一個value和0至多個對次value的描述(Descriptor)。

 

Descriptor

對Characteristic的描述,例如範圍、計量單位等。

 

Service

Characteristic的集合。例如一個service叫做“Heart Rate Monitor”,它可能包含多個Characteristics,其中可能包含一個叫做“heart ratemeasurement"的Characteristic。一個手環可能

 

2.角色和職責:

Android裝置與BLE裝置互動有兩組角色:

 

中心裝置和外圍裝置(Central vs. peripheral);

GATT server vs. GATT client.

 

Central vs. peripheral:

中心裝置和外圍裝置的概念針對的是BLE串連本身。Central角色負責scan advertisement。而peripheral角色負責make advertisement。

 

GATT server vs. GATT client:

這兩種角色取決於BLE串連成功後,兩個裝置間通訊的方式。

 

舉例說明:

現 有一個活動追蹤的BLE裝置和一個支援BLE的Android裝置。Android裝置支援Central角色,而BLE裝置支援peripheral角色。建立一個BLE串連需要這兩個角色都存在,都僅支援Central角色或者都僅支援peripheral角色則無法建立串連。

 

當 串連建立後,它們之間就需要傳輸GATT資料。誰做server,誰做client,則取決於具體資料轉送的情況。例如,如果活動追蹤的BLE裝置需要向 Android裝置傳輸sensor資料,則活動追蹤器自然成為了server端;而如果活動追蹤器需要從Android裝置擷取更新資訊,則 Android裝置作為server端可能更合適。

 

 

3許可權及feature:

和經典藍芽一樣,應用使用藍芽,需要聲明BLUETOOTH許可權,如果需要掃描裝置或者操作藍芽設定,則還需要BLUETOOTH_ADMIN許可權:

<uses-permissionandroid:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

 

除了藍芽許可權外,如果需要BLE feature則還需要聲明uses-feature:

<uses-featureandroid:name="android.hardware.bluetooth_le"android:required="true"/>

 

按時required為true時,則應用只能在支援BLE的Android裝置上安裝運行;required為false時,Android裝置均可正常安裝運行,需要在代碼運行時判斷裝置是否支援BLE feature:

 

// 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)){
    Toast.makeText(this, R.string.ble_not_supported,Toast.LENGTH_SHORT).show();
    finish();
}

4、啟動藍芽:

在使用藍芽BLE之前,需要確認Android裝置是否支援BLE feature(required為false時),另外要需要確認藍芽是否開啟。 

如果發現不支援BLE,則不能使用BLE相關的功能。如果支援BLE,但是藍芽沒開啟,則需要開啟藍芽。

 

開啟藍芽的步驟:

 

1、擷取BluetoothAdapter

 

BluetoothAdapter是Android系統中所有藍芽操作都需要的,它對應本地Android裝置的藍芽模組,在整個系統中BluetoothAdapter是單例的。當你擷取到它的樣本之後,就能進行相關的藍芽操作了。

 

擷取BluetoothAdapter程式碼範例如下:

// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

 

註:這裡通過getSystemService擷取BluetoothManager,再通過BluetoothManager擷取BluetoothAdapter。BluetoothManager在Android4.3以上支援(API level 18)。

 

2、判斷是否支援藍芽,並開啟藍芽

 

擷取到BluetoothAdapter之後,還需要判斷是否支援藍芽,以及藍芽是否開啟。

如果沒開啟,需要讓使用者開啟藍芽:

private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

 

 

5、搜尋BLE裝置:

通過調用BluetoothAdapter的startLeScan()搜尋BLE裝置。調用此方法時需要傳入 BluetoothAdapter.LeScanCallback參數。

因此你需要實現 BluetoothAdapter.LeScanCallback介面,BLE裝置的搜尋結果將通過這個callback返回。

 

由於搜尋需要盡量減少功耗,因此在實際使用時需要注意:

 

1、當找到對應的裝置後,立即停止掃描;

2、不要迴圈搜尋裝置,為每次搜尋設定適合的時間限制。避免裝置不在可用範圍的時候持續不停掃描,消耗電量。


搜尋的範例程式碼如下:

/** * Activity for scanning and displaying available BLE devices. */public class DeviceScanActivity extends ListActivity {    private BluetoothAdapter mBluetoothAdapter;    private boolean mScanning;    private Handler mHandler;    // Stops scanning after 10 seconds.    private static final long SCAN_PERIOD = 10000;    ...    private void scanLeDevice(final boolean enable) {        if (enable) {            // Stops scanning after a pre-defined scan period.            mHandler.postDelayed(new Runnable() {                @Override                public void run() {                    mScanning = false;                    mBluetoothAdapter.stopLeScan(mLeScanCallback);                }            }, SCAN_PERIOD);            mScanning = true;            mBluetoothAdapter.startLeScan(mLeScanCallback);        } else {            mScanning = false;            mBluetoothAdapter.stopLeScan(mLeScanCallback);        }            }}

如果你只需要搜尋指定UUID的外設,你可以調用 startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。

其中UUID數組指定你的應用程式所支援的GATT Services的UUID。

 

 

BluetoothAdapter.LeScanCallback的實現樣本如下:

private LeDeviceListAdapter mLeDeviceListAdapter;...// Device scan callback.private BluetoothAdapter.LeScanCallback mLeScanCallback =        new BluetoothAdapter.LeScanCallback() {    @Override    public void onLeScan(final BluetoothDevice device, int rssi,            byte[] scanRecord) {        runOnUiThread(new Runnable() {           @Override           public void run() {               mLeDeviceListAdapter.addDevice(device);               mLeDeviceListAdapter.notifyDataSetChanged();           }       });   }};

注意:搜尋時,你只能搜尋傳統藍牙裝置或者BLE裝置,兩者完全獨立,不可同時被搜尋。

 

 

6、串連GATTServer:

兩個裝置通過BLE通訊,首先需要建立GATT串連。這裡我們講的是Android裝置作為client端,串連GATT Server。

串連GATT Server,你需要調用BluetoothDevice的connectGatt()方法。此函數帶三個參數:Context、autoConnect(boolean)和BluetoothGattCallback對象。調用樣本:

 

mBluetoothGatt = device.connectGatt(this, false,mGattCallback);

 

函數成功,返回BluetoothGatt對象,它是GATT profile的封裝。通過這個對象,我們就能進行GATT Client端的相關操作。BluetoothGattCallback用於傳遞一些串連狀態及結果。

 

BluetoothGatt常規用到的幾個操作樣本:

 

connect() :串連遠程裝置。

discoverServices() : 搜尋串連裝置所支援的service。

disconnect():斷開與遠程裝置的GATT串連。

close():關閉GATTClient端。

readCharacteristic(characteristic) :讀取指定的characteristic。

setCharacteristicNotification(characteristic, enabled):設定當指定characteristic值變化時,發出通知。

getServices() :擷取遠程裝置所支援的services。

 

等等。

 

註:

1、某些函數調用之間存在先後關係。例如首先需要connect上才能discoverServices。

2、 一些函數調用是非同步,需要得到的值不會立即返回,而會在BluetoothGattCallback的回呼函數中返回。例如 discoverServices與onServicesDiscovered回調,readCharacteristic與 onCharacteristicRead回調,setCharacteristicNotification與onCharacteristicChanged回調等。

 

 

 

 

 

http://www.blogjava.net/zh-weir/archive/2013/12/09/407373.html

http://blog.csdn.net/mov2012/article/details/16368441

百度文檔:

BLE入門教程.pdf

BLE_和經典藍芽Android編程說明.pdf


BLE簡介和Android BLE編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.