AndroidBLE与终端通信五GoogleAPIBLE40低功耗蓝牙文档解读之案例初探课案.docx
- 文档编号:2924741
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:13
- 大小:103.20KB
AndroidBLE与终端通信五GoogleAPIBLE40低功耗蓝牙文档解读之案例初探课案.docx
《AndroidBLE与终端通信五GoogleAPIBLE40低功耗蓝牙文档解读之案例初探课案.docx》由会员分享,可在线阅读,更多相关《AndroidBLE与终端通信五GoogleAPIBLE40低功耗蓝牙文档解读之案例初探课案.docx(13页珍藏版)》请在冰豆网上搜索。
AndroidBLE与终端通信五GoogleAPIBLE40低功耗蓝牙文档解读之案例初探课案
AndroidBLE与终端通信(五)——GoogleAPIBLE4.0低功耗蓝牙文档解读之案例初探
一.概述
我们直接翻译
GenericAttributeProfile(GATT)—GATT配置文件是一个通用规范,用于在BLE链路上发送和接收被称为“属性”的数据块。
目前所有的BLE应用都基于GATT。
蓝牙SIG规定了许多低功耗设备的配置文件。
配置文件是设备如何在特定的应用程序中工作的规格说明。
注意一个设备可以实现多个配置文件。
例如,一个设备可能包括心率监测仪和电量检测。
AttributeProtocol(ATT)—GATT在ATT协议基础上建立,也被称为GATT/ATT。
ATT对在BLE设备上运行进行了优化,为此,它使用了尽可能少的字节。
每个属性通过一个唯一的的统一标识符(UUID)来标识,每个String类型UUID使用128bit标准格式。
属性通过ATT被格式化为characteristics和services。
Characteristic一个characteristic包括一个单一变量和0-n个用来描述characteristic变量的descriptor,characteristic可以被认为是一个类型,类似于类。
DescriptorDescriptor用来描述characteristic变量的属性。
例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位。
Serviceservice是characteristic的集合。
例如,你可能有一个叫“HeartRateMonitor(心率监测仪)”的service,它包括了很多characteristics,如“heartratemeasurement(心率测量)”等。
你可以在bluetooth.org找到一个目前支持的基于GATT的配置文件和服务列表。
二.角色和责任
这里有两个概念
中央VS外围设备。
适用于BLE连接本身。
中央设备扫描,寻找广播;外围设备发出广播。
GATT服务端VSGATT客户端。
决定了两个设备在建立连接后如何互相交流。
为了方便理解,想象你有一个Android手机和一个用于活动跟踪BLE设备,手机支持中央角色,活动跟踪器支持外围(为了建立BLE连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通信)。
当手机和运动追踪器建立连接后,他们开始向另一方传输GATT数据。
哪一方作为服务器取决于他们传输数据的种类。
例如,如果运动追踪器想向手机报告传感器数据,运动追踪器是服务端。
如果运动追踪器更新来自手机的数据,手机会作为服务端。
在这份文档的例子中,androidapp(运行在android设备上)作为GATT客户端。
app从gatt服务端获得数据,gatt服务端即支持HeartRateProfile(心率配置)的BLE心率监测仪。
但是你可以自己设计androidapp去扮演GATT服务端角色。
也就是自定义
三.案例
好的,Google文档中,也举了一个例子说明,我们要使用BLE的时候,必须有要加上两个权限
--蓝牙权限-->
name="android.permission.BLUETOOTH"/> name="android.permission.BLUETOOTH_ADMIN"/> 这其实你要使用蓝牙这个硬件都是要加上这个权限的,但是这里Google又声明了一点 如果n你想声明你的软件只为具有BLE的设备提供服务的话,你应该要在清单文件中加入 --只为BLE提供服务--> android: name="android.hardware.bluetooth_le" android: required="true"/> 如果改为false的话,那其他蓝牙也是可以使用的,我们创建一个工程——BLETest 和传统蓝牙一样,我们添加完权限之后就要去判断这个设备是否支持BLE //判断是否支持BLE设备 if(! getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){ Toast.makeText(this,"此设备不支持BLE",Toast.LENGTH_SHORT).show(); finish(); } 这步操作也只是你设置为false的时候才是必须的,因为你如果你设置为true,那你只给BLE服务,那这个判断也就是多余的了,紧接着,我们还需要去判断蓝牙是否开启,如果没有开启,我们就去开启他,这次虽然也是用BluetoothAdapter去获取,但是这里用了一个新的类BluetoothManager,先初始化 //初始化蓝牙适配器 BluetoothManagerbluetoothManager=(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter=bluetoothManager.getAdapter(); 然后再去开启 //打开蓝牙 if(mBluetoothAdapter==null||! mBluetoothAdapter.isEnabled()){ IntentenableBtIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT); } 这里的REQUEST_ENABLE_BT也就是一个回调的标志,无须理会 publicstaticfinalintREQUEST_ENABLE_BT=0; 写了这个之后,当我们蓝牙没有开启的时候就会去友好的提示用户开启了 我们现在准备工作都有了之后我们就可以直接去搜索设备了,BLE的api和普通蓝牙的API还是有一定的区别的,就是有回调了,使用起来挺方便的,但是搜索是很费电的,所以切记要小心使用,最好是找到设备之后就停止扫描或者设置扫描时间,不然你就苦逼了 //搜索设备 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) privatevoidscanLeDevice(finalbooleanenable){ if(enable){ //经过预定扫描期后停止扫描 mHandler.postDelayed(newRunnable(){ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @Override publicvoidrun(){ mScanning=false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } },SCAN_PERIOD); mScanning=true; mBluetoothAdapter.startLeScan(mLeScanCallback); }else{ mScanning=false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } } 这样,当我们接收到搜索设备的回调时便可以直接添加在Adapter上,要注意,所演示的也是Google提供的Demo //搜索设备的回调 privateBluetoothAdapter.LeScanCallbackmLeScanCallback= newBluetoothAdapter.LeScanCallback(){ @Override publicvoidonLeScan(finalBluetoothDevicedevice,intrssi,byte[]scanRecord){ runOnUiThread(newRunnable(){ @Override publicvoidrun(){ mLeDeviceListAdapter.addDevice(device); mLeDeviceListAdapter.notifyDataSetChanged(); } }); } }; 连接GATT服务端 这仅仅是第一步,我们要让BLE拥有强大的能力,就需要连接他的GATT服务端 /** *1.上下文 *2.自动连接 *3.BluetoothGattCallback回调 */ mBluetoothGatt=device.connectGatt(this,false,mGattCallback); 连接到GATT服务端时,由BLE设备做主机,并返回一个BluetoothGatt实例,然后你可以使用这个实例来进行GATT客户端操作。 请求方(软件)是GATT客户端。 BluetoothGattCallback用于传递结果给用户,例如连接状态,以及任何进一步GATT客户端操作。 在这个例子中,这个BLEAPP提供了一个activity(DeviceControlActivity)来连接,显示数据,显示该设备支持的GATTservices和characteristics。 根据用户的输入,这个activity与BluetoothLeService通信,通过AndroidBLEAPI实现与BLE设备交互。 packagecom.lgl.bletest; importandroid.bluetooth.BluetoothAdapter; importandroid.bluetooth.BluetoothClass; importandroid.bluetooth.BluetoothGatt; importandroid.bluetooth.BluetoothGattCallback; importandroid.bluetooth.BluetoothGattCharacteristic; importandroid.bluetooth.BluetoothManager; importandroid.bluetooth.BluetoothProfile; importandroid.util.Log; importjava.util.UUID; /** *CreatedbyLGLon2016/5/13. */ publicclassBluetoothLeServiceextendsBluetoothClass.Service{ privateBluetoothManagermBluetoothManager;//蓝牙管理器 privateBluetoothAdaptermBluetoothAdapter;//蓝牙适配器 privateStringmBluetoothDeviceAddress;//蓝牙设备地址 privateBluetoothGattmBluetoothGatt; privateintmConnectionState
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidBLE 终端 通信 GoogleAPIBLE40 功耗 蓝牙 文档 解读 案例 初探
![提示](https://static.bdocx.com/images/bang_tan.gif)
链接地址:https://www.bdocx.com/doc/2924741.html