Bluetooth4_3运行流程(连接发射器SN00000009
0,Android帮助文档
www.pinnace.cn/bluetooth/tech/1940.shtml
此示例代码中有错:
在DeviceControlActivity类内:ExpandableListView.OnChildClickListener
中if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0)的|应该改成&
1,AndroidManifest.xml
2,DeviceScanActivity界面如下:
用户操作:单击列表SN00000009onCreate->onCreateOptionsMenu->onResume(new mLeDeviceListAdapter),单击扫描onOptionsItemSelected->scanLeDevice搜索到设备会回调LeScanCallback接口BluetoothAdapter.LeScanCallback,单击搜索到的蓝牙设备列表(用户操作)onListItemClick(把搜到的蓝牙设备的地址和名称放入Intent中传给下个界面DeviceControlActivity)--》3DeviceControlActivity
3,DeviceControlActivity界面如下:调用BluetoothLeService中的方法:
进入后的初始界面,过一会下面的列表会消失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如下图:
每个Service下面的Characteristic7,单击上图中的Characteristic UUID--->执行DeviceControlActivity:ExpandableListView.OnChildClickListener:
8,characteristic读的流程
BluetoothGatt.
readCharacteristic(BluetoothGattCharacteristic characteristic)-->异步调用BluetoothGattCallback.onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
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连接总是会断掉,是由于发射器的配置导致的