低功耗蓝牙(BLE)官方文档翻译

本文介绍了Android低功耗蓝牙(BLE)的使用,包括BLE Stack和GATT堆栈的概念,关键术语如GATT、ATT、特征和描述符。详细阐述了BLE在Android设备中的角色和责任,权限需求,以及如何启动BLE、搜索设备、连接GATT服务端、读取和接收属性通知,最后讲解了关闭客户端App的正确方式。
摘要由CSDN通过智能技术生成

翻译之间先看几张BLE Stack图:

BLE Stack:

BLE stack

BLE GATT stack:

这里写图片描述
这里写图片描述

低功耗蓝牙(Bluetooth Low Energy)

Android4.3(API 18)引入BLE低功耗蓝牙,并且提供了相应的API供应用程序搜索蓝牙设备,查询服务,读写特性.与经典蓝牙相比,BLE的显著特点是低功耗, 使得android应用可以和具有低功耗要求的蓝牙设备进行通讯,如传感器,心率检测器,健身设备等等.

关键术语和概念(Key Terms and Concerpt)
  • Generic Attribute Profile(GATT): 通用属性协议
    GATT配置文件是一个通用的规范, 用于在BLE链路上发送和接收被称为”属性”的数据块.目前所有的BLE应用都是基于GATT.

    • 蓝牙SIG规定了许多低功耗设备的配置文件.配置文件就是设备如何在特定应用中运转的规格说明.注意一个设备可以实现多个配置文件,例如:一个设备可以包含心率监测器和电量检测器.
  • Attribute Protocol(ATT) 属性协议
    GATT是建立在ATT协议的基础上的.ATT对在BLE设备上运行做了优化,为此他使用了尽可能少的字节,每个属性都通过一个唯一的统一标识符(UUID)来标识,每个String类型的UUID使用是128bit标准格式,属性通过ATT被格式化为characteristics 和services

  • Characteristic 特性
    一个CXharacteristic包含一个单一变量和0-n个用来描述characteristic变量的descriptor,characteristic可以被认为是一个类型, 类似于类.

  • Descriptor 描述
    Descriptor用来描述characteristic变量的属性.例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位.

  • Service 服务
    service是characteristic的集合.例如,你可能有一个叫Heart rate minitord的service,他包含了很多characteristic,如 heart rate measurement等等.可在bluetooth.org找到一个目前支持基于AGTT的配置文件和服务列表

角色和责任(Roles & Responsiblity)
  • 一下是android设备和BLE设备交互时的角色和责任
    • 中央 vs 外设: 使用与BLE连接本身.中央设备扫描,寻找广播,外围设备发出广播
    • GATT服务端 vs GATT客户端: 决定了两个设备在建立连接后如何交互
  • 为了方便理解,想象你有一个用于活动跟踪BLE设备,手机支持中央角色,后动跟踪器支持外围活动(为了建立BLE连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通讯.
  • 当手机和运动跟踪器建立连接后,他们开始向另一方传输GATT数据.哪一方作为服务器取决于他们传输数据的种类.例如,如果运动跟踪器想向手机报告传感器数据,运动跟踪器就是服务器.如果运动跟踪器更新来自手机的数据,手机作为服务器.
BLE权限(BLE Permissions)
  • 为了在应用中使用Bluetooth特性,必须要声明BLUETOOTH权限.你需要这个权限区执行任何蓝牙通讯,例如请求连接,接收连接,传输数据.
  • 如果你想要App应用初始化设备搜索或者手动操作蓝牙设置,你必须声明BLUETOOTH_ADMIN权限.注意:如何要使用BLUETOOTH权限,比先声明BLUETOOTH权限.
  • 在manifest.xml文件中声明权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  • 如果你想要声明你的APP应用仅仅支持具有BLE功能的设备,请声明下面权限:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
  • 然而,如果想要你的APP对不支持BLE的设备也有效,必须引入该元素在manifest文件中,但是required=false.在运行时可以通过PackagerManager.hasSystemFeature()来判断BLE是否可用.
// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {        Toast.makeText(this,R.string.ble_not_supported,Toast.LENGTH_SHORT).show();
  finish();
}
启动BLE(Setting up BLE)
  • 在使用BLE通讯前,请确认你的APP是否支持BLE,并且要保证蓝牙已打开(enable).注意:如果<uses-feature....>设定为false,此处检查是必须的.
  • 如果APP不支持BLE,那就不能使用BLE任何特性.如果支持BLE,但是没有打开蓝牙,你可以请求在不退出应用打开蓝牙.这样,蓝牙就是通过BluetoothAdapter分2步启动.

  • 1.获得BluetoothAdapter:

    BluetoothAdapter在任何Bluetooth Activity中都是必备的.BluetoothAdapter代表了设备本身的适配器.整个系统有一个适配器,你的应用可以BluetoothAdapter和整个应用交互.下面代码显示了如何获取BluetoothAdapter

    此方法使用getSystemService()来获得一个BluetoothMangager的实例, BluetoothManager实例能够用来获取一个BluetoothAdapter的一个实例.在andriod4.3引入BluetoothManager.

// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
  • 2.打开蓝牙设备:

    下一步,你必须保证Bluetooth是开启的.调用isEnable()可以检查当前蓝牙是否开启.如果返回false,表示蓝牙为开启.下面代码用于检测蓝牙是否开启,如果没有,会显示一个错误信息让用户去开启蓝牙.

        private BluetoothAdapter mBluetoothAdapter;
        ...
        // Ensures Bluetooth is available on the device and it is enabled. If not,
        // displays a dialog requesting user permission to enable Bluetooth.
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
搜索BLE设备(Finding BLE Device)
  • 使用startLeScan()搜索BLE设备,此方法将BluetoothAdapter.LeScanCallback作为一个参数,你必须实现该回调接口,因为接口决定着扫描结果是怎么样返回的.扫描很耗电,应当遵守如下准则:
    • 找到设备立即关掉扫描功能
    • 不要反复扫描,并且设置扫描时间限制,先前可用的设备可能现在已经移出扫描范围,继续扫描可能耗干电池.
  • 下面代码是如何开启和关闭扫描:
        //Activity for scanning and displaying available BLE devices.
        public class DeviceScanActivity extends ListActivity {
   
            private BluetoothAdapter mBluetoothAdapter;
            private boolean mScanning;
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值