BLE 应用解释

来源:互联网 发布:centos opensuse 编辑:程序博客网 时间:2024/06/10 09:45

本人接触蓝牙不久,研究BLE的时间不足半月,曾看到有网友指出BLE 走SPP协议,也有的说是走GATT协议,也有人认为是GATT+SPP......我觉得这是个人理解的不同,都有各自的道理!在此本人也只是根据CSR的BLE的电池电量服务及相关数据资料说说GATT协议,不正确的地方,大神勿喷,还请多多指教!
 一、GATT的概念:
  Generic Attribute Profile (GATT)
  通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。

  Attribute Protocol (ATT)
  GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。

  Characteristic
  Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。

  Descriptor
  对Characteristic的描述,例如范围、计量单位等。

  Service
  Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement"的Characteristic。

 二、GATT的角色和职责:
  Android设备与BLE设备交互有两组角色:

  中心设备和外围设备(Central vs. peripheral);
  GATT server vs. GATT client.

  Central vs. peripheral:
  中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。

  GATT server vs. GATT client:
  这两种角色取决于BLE连接成功后,两个设备间通信的方式。

  举例说明:
  现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角 色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。

  当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。

三、权限及feature:  和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:
  
  


  除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
  


  按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:

  // 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();
  }





四、Android连接GATT Server:  两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
  连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:

  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);


  函数成功,返回BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。

  BluetoothGatt常规用到的几个操作示例:

  connect() :连接远程设备。
  discoverServices() : 搜索连接设备所支持的service。
  disconnect():断开与远程设备的GATT连接。
  close():关闭GATT Client端。
  readCharacteristic(characteristic) :读取指定的characteristic。
  setCharacteristicNotification(characteristic, enabled) :设置当指定characteristic值变化时,发出通知。
  getServices() :获取远程设备所支持的services。

  等等。

  注:
  1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
  2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与 onCharacteristicRead回调,setCharacteristicNotification与 onCharacteristicChanged回调等。
- 本文出自蓝牙音箱网,原文地址:http://www.btspeaker.cn/thread-5560-1-1.html
0 0