前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bluetooth4_3运行流程(连接发射器SN00000009)

Bluetooth4_3运行流程(连接发射器SN00000009)

作者头像
用户1733354
发布2018-05-22 15:10:50
8840
发布2018-05-22 15:10:50
举报

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界面如下:

用户操作:单击列表SN00000009

onCreate->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下面的Characteristic

7,单击上图中的Characteristic UUID--->执行DeviceControlActivity:ExpandableListView.OnChildClickListener:

8,characteristic读的流程

BluetoothGatt. readCharacteristic(BluetoothGattCharacteristic characteristic)-->异步调用BluetoothGattCallback.onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)

绿色部分为红色部分的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连接总是会断掉,是由于发射器的配置导致的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.10.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档