Android 蓝牙开发(2)——低功耗蓝牙
低功耗蓝牙官方文档
本文章是参考官网,然后加入自己实践中的理解完成!没有看上一篇的读者,可以先阅读一下前一篇,这是一个系列。
官网地址:https://developer.android.com/guide/topics/connectivity/bluetooth-le
Android 4.3 (API 18 )引入了低功耗蓝牙,应用可以查询周围设备、查询设备的服务、传输信息。
关键术语和概念
通用属性配置文件(GATT Generic Attribute Profile)
GATT 配置文件是一种传输数据规范,用于在 BLE 链路上发送和接受被称为属性的短数据的通用规范。目前所有低功耗应用配置文件基本都是基于 GATT
Bluetooth SIG (蓝牙技术联盟)
是为低功耗设备定义了许多配置文件。配置文件是设备在特定应用程序中的工作方式的规范。设备可以实现多个配置文件。例如,设备可以包含心率监测器和电池水平检测器。
定义规范的
属性协议(ATT Attribute Protocol)
GATT 是建立在属性协议(ATT)之上的。也被称为 GATT/ATT 。ATT 经过优化,可在 BLE 设备上使用。为此,它使用了尽可能少的字节。每个属性由通用唯一标识符(UUID)来唯一标识。ATT 传输的属性被格式化为 特征 和 服务
特征
特征包含单个值和描述特征值的 0 ~ n 个描述符。特征值可以被称为类型。类似于类。(是在和 BLE 设备进行通信的时候主要的操作内容)
描述符
是用来定义特征值的已定义属性。用来描述特征值的。例如:描述符可以指定人类可读的描述,特征值的可接受范围或者特征值特定的度量单位
服务
服务中包含一系列的特征值。例如,我们可以使用名为 “心率监测器”的服务,其中包括"心率测量"等特征。可以在 bluetooh.org 上找到基于 GATT 的现有配置文件的服务的列表。
角色和责任
Android 设备和 BLE 设备交互时应用的角色和职责
- 中央与外围设备。
- GATT 服务器和 GATT 客户端。确定了两个设备建立连接后如何进行相互通信
BLE 权限
应用在使用蓝牙设备的时候必须要声明蓝牙权限 BLUETOOTH
需要这个权限才可以进行蓝牙通信,例如:请求连接、接受连接、和传输数据。
如果还需要发现或者操作蓝牙设置,则需要声明 BLUETOOTH_ADMIN
权限。使用这个权限的前提是要有 BLUETOOTH
权限。
如果要声明我们的应用仅适用于支持 BLE 的设备,需要清单文件中做如下声明
<uses-feature android:name = "android.hardware.bluetooth_le" android:required = true />
如果我们希望我们的应用程序在不支持 BLE 的设备上也可以运行的时候,只需要将 true 修改成 false 就可以了。
还可以在代码中作出判断
if(!getPackageManager().hasSystemFeature(PackgeManger.FEATURE_BLUETOOTH_LE)){
// 不支持 BLE 设备
}
BLE 通常和位置有关系,因此还需要声明位置权限 ACCESS_COARSE_LOCATION
或者 ACCESS_FINE_LOCATION
没有这些权限扫描将不会返回任何结果。
设置 BLE
获得 BluetoothAdapter
BluetoothAdapter 代表设备自己的蓝牙适配器,整个系统只有一个蓝牙适配器,我们的应用程序可以使用此对象与其交互。
这里的获取方法是通过 BluetoothManager 来获取的
BluetoothManager bluetoothManger = getSystemSerive(Context.BULETOOTH_SERVIcE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
启用蓝牙设备
其实这些和普通蓝牙的启动都是一样的。
isEnable()
查看当前是否启用了蓝牙通过 BluetoothAdapter.ACTION_REQUEST_ENABLE 来启动
查找 BLE 设备
这一点和发现普通的蓝牙设备是不一样的
// 通过 Adapter 的 startLeScan(callBack); 方法来开启扫描
// 如果我们有指定的蓝牙设备可以使用
sartLeScan(UUID[],BluetoothAdapter.LeScanCallBakc) 通过 UUID 来指定 BLe
// 这个方法已经过时了,官方文档最新支持的扫描蓝牙的方法是通过一个专门的对象 BluetoothLeScanner 用来开启扫描低功耗蓝牙
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
// 这个方法可以有参数,用来过滤要扫描的低功耗蓝牙的,具体的后面讲
scanner.startScan();只能单独扫描普通蓝牙设备或者 BLE 设备,没有方法同时执行
连接到 GATT 服务器
与 BLE 设备通信,第一步就是要连接到它,就是连接到该设备的 GATT 服务。使用方法 connectGatt()
有三个参数:Context 对象 autoConnect (表示是否在可用的时候自己连接到 BLE 设备) 还有一个回调,所有的交互都在这个回调里面完成。
调用这个方法会返回一个 BluetoothGatt
对象,通过这个对象进行和 BLE 设备的交互。交互的结果会在回调方法中触发。
public class BluetoothLeService extends Service{
private final static String TAG = BluetoothLeService.class.getSimpleName();
private BluetoothManger bluetoothManger;
private BluetoothAdapter bluetoothAdapter;
private String bluetoothDeviceAddress;
private BluetoothGatt bluetoothGatt;
private int connectionState = STATE_DISCONNECTED;
private static final int STATE_DISCONNECTED = 0;
private static final int STATE_CONNETING = 1;
private static final int STATE_CONNECTED = 2;
public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
public final satic String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
public final static String EXTRA_DATA = "com.example.bluetooth.le.EXTRA_DATA";
public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.formString(SampleGattAttributes.HEART_RATE_MEASURMENT);
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
// 你的中央设备连接上 ble 设备后,会回调这个这方法。
@Override
public viod onConnectionStateChange(BluetoothGatt gatt,int status,int newState){
String intenAction;
if(newState == BluetoothProfile.STATE_CONNECTED){
intentaction = ACTION_GATT_CONNECTED;
connectionState = STATE_CONNECTED;
broadcastUpdate(intentAction);
// 连接上后,紧接着就是要寻找里面 Service
bluetoothGatt.discoverServices();
}else if(newState = BluetoothProfile.STATE_STATE_DISCONNECTED{
intentAction = ACTION_GATT_DISCONNECTED;
connectionState = STATE_DISCONNECTED;
broadcastUpdate(intentAction);
}
}
@Override
// service 发现后就会触发这个方法,然后你就需要找到你和 ble 约定好的 service
public void onServicesDiscovered(BluetoothGatt gatt,int status){
if(status == BluetoothGatt.GATT_SUCCESS){
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
}
}
public void onCharacteristicREad(。。。){
}
.......
}
}
当触发特定的回调的时候,会调用适当的 broadcastUpdate() 辅助方法并向其传递操作。具体的数据解析格式是根据配置文件规范执行的(是你和你的BLE 设备共同约定好的规范)
大体的过程中:开启连接,然后会触发对应的连接回调,然后发现服务,触发发现服务回调,获取服务内部的特征值,对其读写命令(和 BLE 共同约束的规范)。就是这么一个过程,很简单。
读 BLE 属性
一旦我们的 Android 设备连接到了 GATT 服务器并发现了服务,我们就可以在支持的位置读取或者写入属性了。
完成后要记得关闭设备 bluetoothGatt.close();
关于蓝牙框架的一个库:https://github.com/Alex-Jerry/Android-BLE
Android 蓝牙开发(2)——低功耗蓝牙的更多相关文章
- 【原创】Android 5.0 BLE低功耗蓝牙从设备应用
如果各位觉得有用,转载+个出处. 现如今安卓的低功耗蓝牙应用十分普遍了,智能手环.手表遍地都是,基本都是利用BLE通信来交互数据.BLE基本在安卓.IOS两大终端设备上都有很好支持,所以有很好发展前景 ...
- Android 低功耗蓝牙BLE 开发注意事项
基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. ...
- Android蓝牙开发
Android蓝牙开发 近期做蓝牙小车,须要Android端来控制小车的运动.以此文记录开发过程. 使用HC-06无线蓝牙串口透传模块.对于其它的蓝牙设备本文相同适用. 蓝牙开发的流程: 获取本地蓝牙 ...
- Android低功耗蓝牙(BLE)使用详解
代码地址如下:http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设备 ...
- 浅谈Bluetooth蓝牙开发
前言:项目用到蓝牙开发,具体蓝牙获取硬件传感器中的数据. 因为没有蓝牙开发的相关经验,决定先了解一些蓝牙开发的知识,再去看之前同事写的蓝牙相关代码. ------------------------- ...
- iOS 蓝牙开发资料记录
一.蓝牙基础认识: 1.iOS蓝牙开发: iOS蓝牙开发:蓝牙连接和数据读写 iOS蓝牙后台运行 iOS关于app连接已配对设备的问题(ancs协议的锅) iOS蓝牙空中 ...
- BLE——低功耗蓝牙(Bluetooth Low Energy)
1.简介 以下蓝牙协议特指低功耗蓝牙协议. 蓝牙协议是由SIG制定并维护的通信协议,蓝牙协议栈是蓝牙协议的具体实现. 各厂商都根据蓝牙协议实现了自己的一套函数库——蓝牙协议栈,所以不同厂商的蓝牙协议栈 ...
- Android低功耗蓝牙(BLE)开发的一点感受
最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 : -- 官方文档 : https://develope ...
- 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释
转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体 ...
随机推荐
- opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书
问题1:根据源代码时,我发现的时候去敲门.不正确实施效果.哪里是不正确?没有源代码glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现最后的下一次抽奖提供 ...
- matlab 求解 Ax=B 时所用算法
x = A\B; x = mldivide(A, B); matlab 在这里的求解与严格的数学意义是不同的, 如果 A 接近奇异,matlab 仍会给出合理的结果,但也会提示警告信息: 如果 A 为 ...
- ubuntu如何修改terminal终端的主机名(修改/etc/hostname文件)
有时候安装完Ubuntu系统后,打开命令终端,终端显示的主机名格式比较难看,例如 我最近买的国内某云的VPS. xxx@VM-1560-ubuntu$ xxx@VM-1560-ubuntu$ 对于有洁 ...
- 手把手教你开发Nginx模块
前面的哪些话 关于Nginx模块开发的博客资料,网上很多,很多.但是,每篇博客都只提要点,无法"step by step"照着做,对于初次接触Nginx开发的同学,只能像只盲目的蚂 ...
- WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource.Binding 前/后台加载,重新绑定) 2013.6.7更新 1.xmlns Mapping URI的格式是 clr-namespace:&l ...
- miniui autocomplete支持放大镜按钮(data-grid)
<style type="text/css"> html body .searchbox .mini-buttonedit-close { background:url ...
- Android零基础入门第21节:ToggleButton和Switch使用大全
原文:Android零基础入门第21节:ToggleButton和Switch使用大全 上期学习了CheckBox和RadioButton,那么本期来学习Button的另外两个子控件ToggleBut ...
- C# 如何使用 Sql Server Compact 数据库
Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...
- 关于VS编译DevExpress默认产生几个多余的语言包的问题解决
原文 关于VS编译DevExpress默认产生几个多余的语言包的问题解决 VS15开始对于非系统的Dll都会默认复制到本地,即bin\debug下面,复制dll到本地好处在于发布的时候不用再去寻找相关 ...
- win7 64 下安装MyGeneration 遇到的问题解决方法
win7 64 下安装MyGeneration 遇到的问题 ---------------------------MyGeneration 1.3 Setup-------------------- ...