Bluetooth4_3執行流程(連線發射器SN00000009)

weixin_34321977發表於2016-10-12

0,Android幫助文件

android.bluetooth

www.pinnace.cn/bluetooth/tech/1940.shtml

此示例程式碼中有錯:

在DeviceControlActivity類內:ExpandableListView.OnChildClickListener
中if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0)的|應該改成&

1,AndroidManifest.xml

2,DeviceScanActivity介面如下:

1416675-b53c4694d7193437.png
使用者操作:單擊列表SN00000009

onCreate->onCreateOptionsMenu->onResume(new mLeDeviceListAdapter),單擊掃描onOptionsItemSelected->scanLeDevice搜尋到裝置會回撥LeScanCallback介面BluetoothAdapter.LeScanCallback,單擊搜尋到的藍芽裝置列表(使用者操作)onListItemClick(把搜到的藍芽裝置的地址和名稱放入Intent中傳給下個介面DeviceControlActivity)--》3DeviceControlActivity

3,DeviceControlActivity介面如下:呼叫BluetoothLeService中的方法:

1416675-1c115962fa5d3c86.jpg
進入後的初始介面,過一會下面的列表會消失

onCreate

先取出上個介面DeviceScanActivity傳過來的藍芽裝置的地址和名稱並顯示在介面上,然後
(Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);

//上面2句執行--》非同步呼叫(1)new 1個mServiceConnection介面的物件(2)執行BluetoothLeService類裡面的
private final IBinder mBinder = new LocalBinder();

public class LocalBinder extends Binder {BluetoothLeService getService() {return BluetoothLeService.this;}}//通過呼叫mBinder.getService()可以使用mBinder物件獲得BluetoothLeService

----》執行BluetoothLeService類裡面的
public IBinder onBind(Intent intent) {return mBinder}繫結成功

----》執行DeviceControlActivity
的onServiceConnected方法onServiceConnected:(1)BluetoothLeServicem.initialize()獲取BluetoothManager和mBluetoothAdapter初始化成功再執行(2)BluetoothLeService.connect(mDeviceAddress):第1次連線時通過mBluetoothAdapter獲得BluetoothDevice,通過BluetoothDevice獲得mBluetoothGatt,以後再連直接連就可以。連線狀態由mConnectionState初始值STATE_DISCONNECTED變為STATE_CONNECTING---》會執行BluetoothLeService的回撥函式BluetoothGattCallback。onConnectionStateChange中把連線狀態放到Intent中用廣播sendBroadcast(intent)的方式告知本介面中

非同步呼叫就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。同步呼叫就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去。

bindService是非同步呼叫和Service進行繫結, 如果繫結成功, 則會呼叫ServiceConnection的onServiceConnected。在這個方法中會向Activity中傳遞一個IBinder的例項,Acitity需要儲存這個例項。在Service中需要建立一個實現IBinder的內部類(這個內部類不一定在Service中實現,但必須在Service中建立它)。在OnBind()方法中需返回一個IBinder例項,不然onServiceConnected方法不會呼叫。

//已經註冊了此廣播(onResume中registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());在的廣播接收器中根據狀態進行更新介面

onResume: registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
註冊廣播:如果藍芽服務出現下列4種狀態BluetoothLeService.ACTION_GATT_CONNECTED,ACTION_GATT_DISCONNECTED,ACTION_GATT_SERVICES_DISCOVERED,ACTION_DATA_AVAILABLE

這個廣播private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver()
就通知我做下面的事情:連上了,更新ui上的文字(選單欄中)

invalidateOptionsMenu();//Menu ItemonCreateOptionsMenu()只有在menu剛被建立時才會執行,因此要想隨時動態改變OptionMenu就要實現onPrepareOptionsMenu()方法,該方法會傳給你Menu物件,供使用 Android2.3或更低的版本會在每次Menu開啟的時候呼叫一次onPrepareOptionsMenu().  Android3.0及以上版本預設menu是開啟的,所以必須呼叫invalidateOptionsMenu()方法,然後系統將呼叫onPrepareOptionsMenu()執行update操作。

mBluetoothLeService.connect(mDeviceAddress);第1次進入此介面,重新進入此介面,單擊選單欄的選單項:Connect都會去連線此藍芽裝置,所以要寫3個地方


4,BluetoothLeService

public class LocalBinder extends Binder {

BluetoothLeService getService() {

return BluetoothLeService.this;}}

private final IBinder mBinder = new LocalBinder();

onBind:return mBinder;通過此mBinder找到此BluetoothLeService

呼叫 bindService 會啟動 Service,Service.onBind如果返回null,不會連線上 Service,因此 ServiceConnection.onServiceConnected 不會被呼叫,但你任然需要使用 unbindService 函式斷開它,這樣 Service 才會停止。

Intent intent = new Intent(MainActivity.this,BindService.class),bindService(intent, conn, Context.BIND_AUTO_CREATE);->新建了BindService物件->新建了MyBinder物件->onBind()函式  -----傳遞MyBinder物件------->onServiceConnected()--> 通過傳遞的Binder物件獲取剛剛和Binder物件對應的BindService 物件  -->呼叫Service中定義的方法。

5,手機藍芽狀態的改變

呼叫mBluetoothLeService.connect(mDeviceAddress);手機和發射器的狀態由未連線-->已連線,執行BluetoothLeService的回撥函式onConnectionStateChange:--->broadcastUpdate(ACTION_GATT_CONNECTED)-->sendBroadcast(new Intent(ACTION_GATT_CONNECTED));-->執行DeviceControlActivity的BroadcastReceiver--->介面的選單欄上顯示

關閉藍芽同上面流程

6,手機和發射器藍芽連線上以後就會發現Services,BluetoothGattCallback的方法onServicesDiscovered就會執行,同上

public void  onServicesDiscovered (BluetoothGatt gatt, int status)

Callback invoked when the list of remote services, characteristics and descriptors for the remote device have been updated, ie new services have been discovered.

--》DeviceControlActivitydisplayGattServices中(mBluetoothLeService.getSupportedGattServices());

引數:BluetoothLeService中的方法getSupportedGattServices()獲得BluetoothGatt
支援的所有Service

此方法可以獲取該發射器支援的所有Service和每個Service下面的Characteristic如下圖:

1416675-5e4baf976f4df2e4.jpg
每個Service下面的Characteristic

7,單擊上圖中的Characteristic UUID--->執行DeviceControlActivity:ExpandableListView.OnChildClickListener:

8,characteristic讀的流程

BluetoothGatt.
readCharacteristic(BluetoothGattCharacteristic characteristic)-->非同步呼叫BluetoothGattCallback.onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)

1416675-c38a8bdc18a54c12.jpg
綠色部分為紅色部分的characteristic讀到的資料

service:1800,1801,180a,fff0

(1)service:1800--》1800指00001800-0000-1000-8000-00805f9b34fb,下面一樣

characteristic 2a00資料:CGM Sensor

                                       43  47  4D  20  53  65  6E  73  6F  72

characteristic 2a01資料:00  00

characteristic 2a02資料:00

characteristic 2a03資料:00

characteristic 2a04資料:P?? 

                                       50 00 A0 00 00 00 E8 03

(2)service:1801--》

characteristic 2a05資料:No data

(3)service:180a--》Device informaton Service

characteristic 2a23資料:7o<??

                                       37  6F  3C  00  00  98  80  00

characteristic 2a24資料:Model Number

                                      4D 6F  64  65  6C  20  4E  75  6D  62  65  72

characteristic 2a25資料:Serial  Number

53 65  72  69  61  6C  20  4E  75  6D  62  65  72

characteristic 2a26資料:Firmware Revision

46 69  72  6D  77  61  72  65  20  52  65  76  69  73  69  6F 6E

characteristic 2a27資料:Hardware  Revision

48 61  72  64  77  61  72  65  20  52  65  76  69  73  69  6F 6E

characteristic 2a28資料:Software  Revision

53 6F  66  74  77  61  72  65  20  52  65  76  69  73  69  6F 6E

Manufacture Name String 2a29資料:Manufacture Name

4D  61  6E  75  66  61  63  74  75  72  65  72  20  4E  61  6D  65

characteristic 2a2a資料:?expriamental

FE 00  65  78  70  65  72  69  6D  65  6E  74  61  6C

characteristic 2a50資料:

01  0D  00  00  00  10  01

(4)service:fff0--》

characteristic fff1資料:No data

characteristic fff2資料:No data

9,characteristic寫的流程

同上

10,android4.3.1連線總是會斷掉,是由於發射器的配置導致的

相關文章