低功耗蓝牙官方文档

本文章是参考官网,然后加入自己实践中的理解完成!没有看上一篇的读者,可以先阅读一下前一篇,这是一个系列。

官网地址: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

  1. 获得 BluetoothAdapter

    BluetoothAdapter 代表设备自己的蓝牙适配器,整个系统只有一个蓝牙适配器,我们的应用程序可以使用此对象与其交互。

    这里的获取方法是通过 BluetoothManager 来获取的

    BluetoothManager bluetoothManger = getSystemSerive(Context.BULETOOTH_SERVIcE);
    BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
  2. 启用蓝牙设备

    其实这些和普通蓝牙的启动都是一样的。

    isEnable() 查看当前是否启用了蓝牙

    通过 BluetoothAdapter.ACTION_REQUEST_ENABLE 来启动

  3. 查找 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)——低功耗蓝牙的更多相关文章

  1. 【原创】Android 5.0 BLE低功耗蓝牙从设备应用

    如果各位觉得有用,转载+个出处. 现如今安卓的低功耗蓝牙应用十分普遍了,智能手环.手表遍地都是,基本都是利用BLE通信来交互数据.BLE基本在安卓.IOS两大终端设备上都有很好支持,所以有很好发展前景 ...

  2. Android 低功耗蓝牙BLE 开发注意事项

    基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. ...

  3. Android蓝牙开发

    Android蓝牙开发 近期做蓝牙小车,须要Android端来控制小车的运动.以此文记录开发过程. 使用HC-06无线蓝牙串口透传模块.对于其它的蓝牙设备本文相同适用. 蓝牙开发的流程: 获取本地蓝牙 ...

  4. Android低功耗蓝牙(BLE)使用详解

    代码地址如下:http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设备 ...

  5. 浅谈Bluetooth蓝牙开发

    前言:项目用到蓝牙开发,具体蓝牙获取硬件传感器中的数据. 因为没有蓝牙开发的相关经验,决定先了解一些蓝牙开发的知识,再去看之前同事写的蓝牙相关代码. ------------------------- ...

  6. iOS 蓝牙开发资料记录

    一.蓝牙基础认识:   1.iOS蓝牙开发:  iOS蓝牙开发:蓝牙连接和数据读写   iOS蓝牙后台运行  iOS关于app连接已配对设备的问题(ancs协议的锅)          iOS蓝牙空中 ...

  7. BLE——低功耗蓝牙(Bluetooth Low Energy)

    1.简介 以下蓝牙协议特指低功耗蓝牙协议. 蓝牙协议是由SIG制定并维护的通信协议,蓝牙协议栈是蓝牙协议的具体实现. 各厂商都根据蓝牙协议实现了自己的一套函数库——蓝牙协议栈,所以不同厂商的蓝牙协议栈 ...

  8. Android低功耗蓝牙(BLE)开发的一点感受

    最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...

  9. 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)

    转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 :  -- 官方文档 : https://develope ...

  10. 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体 ...

随机推荐

  1. 自动备份Mysql数据库脚本

    [root@bogon ~]# cat auto_backup_mysql.sh #!/bin/bash #auto backup mysql db #by authors wugk #define ...

  2. dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题

    如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...

  3. iOS开发之应用首次启动显示用户引导

    这个功能的重点就是在如何判断应用是第一次启动的. 其实很简单 我们只需要在一个类里面写好用户引导页面  基本上都是使用UIScrollView 来实现, 新建一个继承于UIViewController ...

  4. Expression Blend实例动画-大坝水位升高演示

    原文:Expression Blend实例动画-大坝水位升高演示 Expression Blend是个很强大的东西,用它可以完成很多不好做的动画效果. 动画的主要元素: 时间线(Timeline) : ...

  5. 利用WIX制作安装包(3)

    原文 利用WIX制作安装包(3) 利用WIX安装服务非常简单.只需要短短几句话就可以.当我们创建好一个Windows服务之后.我们在项目中创建一个Service.wxs 文件来安装服务,并且编辑代码如 ...

  6. WPF 遍历 控件

    比较简单的方式是 在设计一个画面时 先添加一个grid 或其他的布局控件 确保要遍历的控件都在这个Grid中时就可以这么写 foreach (UIElement uie in Grid.Childre ...

  7. 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器

    原文:照片美妆---基于Haar特征的Adaboost级联人脸检测分类器 本文转载自张雨石http://blog.csdn.net/stdcoutzyx/article/details/3484223 ...

  8. GIS基础软件及操作(一)

    原文  GIS基础软件及操作(一) 练习一.浏览地理数据 使用 ArcGIS浏览地理数据 第1步 启动 ArcMap 启动ArcMap.执行菜单命令:开始>>所有程序>> Ar ...

  9. 用python & bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本

    2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh"!inclu ...

  10. Linux ACL对某一些文件有管理权限

    某些系统账号希望对某一些文件有管理权限,有三种方法: 1 加入属主所在的同一个组中,这等于扩大了访问其他文件的权限了. 2 加入other中,这样权限放开的更大了. 3 给文件的sudo权限. 4 采 ...