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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十一天 Web商城实战一【悟空教程】

public class BaseServlet extends HttpServlet {

2054
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十三天 Web商城实战三【悟空教程】

<a href="${pageContext.request.contextPath}/OrderServlet?method=findByUid">我的订单<...

1831
来自专栏PHP实战技术

ThinkPHP->pathinfo模式(Linux下nginx的配置说明)

小伙伴在使用ThinkPHP搭建自己或者公司项目的时候,url模式设置成为兼容模式,也就是URL_MODEL的值为3的时候是不是也遇到过Lnmp的环境不支持pa...

29110
来自专栏DeveWork

Mac OS X巧用AppleScript 制作网络位置切换自动化脚本(自动配置PAC 文件)

事情是这样的,自带的Macbook Air 在实习单位入的是办公网,办公网走自动代理(需要配置PAC 文件)。同时回来宿舍或家里需要民用的宽带网络。切换的时候出...

5495
来自专栏草根专栏

从头编写 asp.net core 2.0 web api 基础框架 (3)

Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-...

4987
来自专栏影子

springboot添加多数据源连接池并配置Mybatis

5033
来自专栏大内老A

Windows安全认证是如何进行的?[Kerberos篇]

最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证、非对称加密、数字证书、数字签名、TLS/SSL、WS-Security等。如果时...

2357
来自专栏Kubernetes

原 深入分析Kubernetes Sche

2054
来自专栏FreeBuf

远程RPC溢出EXP编写实战之MS06-040

0x01 前言 MS06-040算是个比较老的洞了,在当年影响十分之广,基本上Microsoft大部分操作系统都受到了影响,威力不亚于17年爆出的”永恒之蓝”漏...

30610
来自专栏Jerry的SAP技术分享

通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩

kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果。

1483

扫码关注云+社区

领取腾讯云代金券