找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 8006|回复: 5

[其他] BLE协议详解

[复制链接]
连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
发表于 2015-5-11 16:28:24 | 显示全部楼层 |阅读模式

马上注册,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册  

×

    本人接触蓝牙不久,研究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权限:
  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>


  除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
  <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>


  按时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回调等。




评分

参与人数 2金币 +55 收起 理由
52bluetooth + 50 支持原创
Fantasy + 5

查看全部评分

楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
连续签到天数:1天
签到总天数:380天
签到总奖励:6129金币
发表于 2015-5-11 16:57:47 | 显示全部楼层
太棒了!!!
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:643天
签到总奖励:11192金币
发表于 2015-5-11 22:30:34 | 显示全部楼层
顶一下的说
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:38天
签到总奖励:286金币
发表于 2015-5-12 16:44:55 | 显示全部楼层
这个帖子太好了,顶
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:214天
签到总奖励:1390金币
发表于 2015-12-30 16:34:46 | 显示全部楼层
顶顶更健康
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:110天
签到总奖励:3400金币
发表于 2017-6-8 15:57:03 | 显示全部楼层
顶一下!!!!!!
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-29 19:31 , Processed in 0.171094 second(s), 20 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表