Android BLE 藍牙低功耗教程,中央和周邊的實現

Android4.3 規范瞭BLE的API,但是直到目前的4.4,還有些功能不完善。

在BLE協議中,有兩個角色,周邊(Periphery)和中央(Central);周邊是數據提供者,中央是數據使用/處理者;在iOS SDK裡面,可以把一個iOS設備作為一個周邊,也可以作為一個中央;但是在Android SDK裡面,直到目前最新的Android4.4.2,Android手機隻能作為中央來使用和處理數據;那數據從哪兒來?從BLE設備來,現在的很多可穿戴設備都是用BLE來提供數據的。

一個中央可以同時連接多個周邊,但是一個周邊某一時刻隻能連接一個中央。

大概瞭解瞭概念後,看看Android BLE SDK的四個關鍵類(class):

a) BluetoothGattServer作為周邊來提供數據;BluetoothGattServerCallback返回周邊的狀態。

b) BluetoothGatt作為中央來使用和處理數據;BluetoothGattCallback返回中央的狀態和周邊提供的數據。

因為我們討論的是Android的BLE SDK,下面所有的BluetoothGattServer代表周邊,BluetoothGatt代表中央。

一.創建一個周邊(雖然目前周邊API在Android手機上不工作,但還是看看)

a)先看看周邊用到的class,藍色橢圓

b)說明:vcD4KPHA+w7/Su7j21tyx30JsdWV0b290aEdhdHRTZXJ2ZXKjrLD8uqy24Lj2t/7O8VNlcnZpY2WjrMO/0ru49lNlcnZpY2Ww/LqstuC49szY1fdDaGFyYWN0ZXJpc3RpY6GjPC9wPgo8cD4xLm5ld9K7uPbM2NX3o7pjaGFyYWN0ZXIgPSBuZXcgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljKDxicj4KVVVJRC5mcm9tU3RyaW5nKGNoYXJhY3RlcmlzdGljVVVJRCksPGJyPgpCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMuUFJPUEVSVFlfTk9USUZZLDxicj4KQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljLlBFUk1JU1NJT05fUkVBRCk7PC9wPgo8cD4yLm5ld9K7uPa3/s7xo7pzZXJ2aWNlID0gbmV3IEJsdWV0b290aEdhdHRTZXJ2aWNlKFVVSUQuZnJvbVN0cmluZyhzZXJ2aWNlVVVJRCksPGJyPgpCbHVldG9vdGhHYXR0U2VydmljZS5TRVJWSUNFX1RZUEVfUFJJTUFSWSk7PC9wPgo8cD4zLrDRzNjV98ztvNO1vbf+zvGjunNlcnZpY2UuYWRkQ2hhcmFjdGVyaXN0aWMoY2hhcmFjdGVyKTs8L3A+CjxwPjQuu/HIoUJsdWV0b290aE1hbmFnZXKjum1hbmFnZXIgPSAoQmx1ZXRvb3RoTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkJMVUVUT09USF9TRVJWSUNFKTs8L3A+CjxwPjUuu/HIoS+08r+q1tyx36O6Qmx1ZXRvb3RoR2F0dFNlcnZlciBzZXJ2ZXIgPSBtYW5hZ2VyLm9wZW5HYXR0U2VydmVyKHRoaXMsPGJyPgpuZXcgQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrKCl7Li4ufSk7IDwvcD4KPHA+Ni6w0XNlcnZpY2XM7bzTtb3W3LHfo7pzZXJ2ZXIuYWRkU2VydmljZShzZXJ2aWNlKTs8L3A+CjxwPjcuv6rKvLnjsqVzZXJ2aWNlo7pHb29nbGW7ucO709C547KlU2VydmljZbXEQVBJo6y1yLDJo6GjoaOho6Gjocv50tTEv8ewztLDx7u5srvE3MjD0ru49kFuZHJvaWTK1rv61/fOqtbcsd/AtMzhuanK/b7doaM8L3A+CjxwPjxicj4KPC9wPgo8cD48c3Ryb25nPrb+LrS0vajSu7j21tDR6zwvc3Ryb25nPqOo1eK0zrK7u+HIw8TjyqfN+6Osv8nS1LPJuaa0tL2osqLH0sGsvdO1vdbcsd+1xKOpPC9wPgo8cD5ho6nPyL+0v7TW0NHr08O1vbXEY2xhc3OjrMC2yavN1tSyPC9wPgo8cD48aW1nIHNyYz0=”/uploadfile/Collfiles/20140321/20140321125639214.jpg” alt=””>

b)說明:

為瞭拿到中央BluetoothGatt,可要爬山涉水十八彎:

1.先拿到BluetoothManager:bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

2.再拿到BluetoothAdapt:btAdapter = bluetoothManager.getAdapter();

3.開始掃描:btAdapter.startLeScan( BluetoothAdapter.LeScanCallback);

4.從LeScanCallback中得到BluetoothDevice:public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {…..}

5.用BluetoothDevice得到BluetoothGatt:gatt = device.connectGatt(this, true, gattCallback);

終於拿到中央BluetoothGatt瞭,它有一堆方法(查API吧),調用這些方法,你就可以通過BluetoothGattCallback和周邊BluetoothGattServer交互瞭。

三.吐槽:

BluetoothAdapter.LeScanCallback是接口,但是BluetoothGattServerCallback和BluetoothGattCallback是抽象類,這兩個抽象類讓人很不爽,不知道google為什麼要把他們搞成抽象類,完全可以搞成接口的嘛,或者又有抽象類又有接口也行啊,就像Runable和Thread一樣多好。這兩個抽象類對於有代碼潔癖的人簡直就是一種折磨,在方法參數裡面new,還要實現父類方法,是在受不瞭。

Demo工程下載地址:https://download.csdn.net/detail/jimoduwu/7072515

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *