2540--第二天--特征值的添加和读写

来源:互联网 发布:最全生活网络理财投资 编辑:程序博客网 时间:2024/06/05 17:19

1.GATT分析

  • 1.profole:可以理解为一种规范,一个标准的通信协议,profile存在于从机中。蓝牙组织规定了一系列的标准profile,例如防丢器,心率计等。每个profile中会包括多个Service,每个Service代表从机的一种能力。
  • 2.Service:可以理解为一个服务,在ble从机中,通常有多种服务,比如电量信息服务,系统信息服务等,每个Service中又包含多个Characteristic特征值。每个具体的特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的特征值存储在从机的profile中,这样主机即也可以通过这个特征值来读取数据。
  • 3.特征值:ble通信是通过特征值来完成的,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
  • 4.UUID:刚才我们提到的服务和特征值都需要一个唯一的UUID来标识。
  • 5.GATT:这个是管理数据的,数据的收发都要经过这一层来处理
  • 6.GAP:位于gatt的下层
  • 7.ATT:可以不用考虑
  • 举例分析:现有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。当连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。
  • 关于整体的理解:这里涉及到handle,UUID等一并说完。我的理解,其实一个service就相当于一个结构体,这个profile中有很多个特征值,这些特征值也是一种数据类型,所以当一个profile只有一个service的时候,这个profile就相当于在内存中开辟了一段空间,数据的保存格式是由ATT决定的,ATT可以理解为具体的保存数据的数据类型,而gatt提供读写这些数据的接口,因此,函数中对特征值的读写都是通过Gatt完成的,profile仅仅是相当于一种定义,可以理解为profile类似于一类商品比如水果,特征值类似于具体的苹果,香蕉等,如果想要对苹果和香蕉进行操作,你要么知道它在超市中的位置即handle,或者知道他的标签UUID,通过这两种方式都可以对特征值进行操作。

2.获取当前例子per程序的特征值

在per这个例子中,使用了simpleGATTprofile,这个是自定义的profile并不是SIG规定的profile,我们只需要把这个看懂,然后官方定义的通用的profile是一样的道理。下面分析这个profile的实现原理,per中有几个profile,其中gap和gatt是必须要有的,设备信息的profile不是必须的(这个只能查看信息,不行修改,可以利用这个进行OAD的时候查看系统是否升级成功,这是后话了),要弄就弄明白!!

  • 2.1 simpleGATTprofile添加的地方
    在初始化函数中添加了这个服务,具体往里面看的话是在gatt层注册的
  SimpleProfile_AddService( GATT_ALL_SERVICES );  // Simple GATT Profile

具体来看这个函数

bStatus_t SimpleProfile_AddService( uint32 services ){  uint8 status = SUCCESS;  // Initialize Client Characteristic Configuration attributes  GATTServApp_InitCharCfg( INVALID_CONNHANDLE, simpleProfileChar4Config );  // Register with Link DB to receive link status change callback  VOID linkDB_Register( simpleProfile_HandleConnStatusCB );  //这个是和连接相关的  if ( services & SIMPLEPROFILE_SERVICE )  {    // Register GATT attribute list and CBs with GATT Server App    //向GATT注册自己的属性值,第一个参数为属性值列表,第二个参数为大小,第三个参数为属性值更改之后的回调函数,查找simpleProfileCBs的定义可知,这里有两个,一个是读属性值回调,一个是写属性值回调     status = GATTServApp_RegisterService( simpleProfileAttrTbl,                                           GATT_NUM_ATTRS( simpleProfileAttrTbl ),                                          &simpleProfileCBs );  }  return ( status );}

3.自己添加特征值

自己添加profile的例子 参考per中keyfob这个例子,同样添加特征值的原理一样

0 0
原创粉丝点击