1、  gattAttribute_t   是一个结构体数据类型,里面存放了各种类型的数据。 现在 看看 TI  是怎么描述的,如下:

 /**
* @brief GATT Attribute format.
*
* @note
* The list must start with a Service attribute followed by
* all attributes associated with this Service attribute.
*/
typedef struct attAttribute_t
{
gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs)
uint8 permissions; //!< Attribute permissions
uint16 handle; //!< Attribute handle - assigned internally by attribute server
uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in
//!< the applicable profile. The maximum length of an attribute
//!< value shall be 512 octets.
} gattAttribute_t;

 成员分析  :

      

      表1-0

上面 解释的 第一个 成员可能 不是很详细,我们 来看下 源码:

/// @brief GATT Attribute Type format.
typedef struct
{
uint8 len; //!< Length of UUID (2 or 16) 长度是 两个字节 或者 16个字节
const uint8 *uuid; //!< Pointer to UUID 指向 2个 或者 16个字节 buff 指针
} gattAttrType_t;
gattAttrType_t: Where length can be either ATT_BT_UUID_SIZE (2 bytes), or ATT_UUID_SIZE (16 bytes). The *uuid is a pointer to a
number either reserved by Bluetooth SIG (defined in gatt_uuid.c) or a custom UUID defined in the profile. 总结: 这个成员 实际含义 是 描述 服务的 类型, 服务类型 也是 UUID , 官方蓝牙组织 SIG 规定, UUID 值 0x2800 代表 主服务,UUID 值 0x2803 代表 特征值, 详细看下表

表 1-1


 2、TI  在 simple_gatt_profile.c 文件中 利用 这个gattAttribute_t 数据类型  定义了一个  数组  simpleProfileAttrTbl  ,  这个数组 暂且理解为 存放 我们自定义的 蓝牙服务 以及该服务 拥有 的 特征值 。

/*********************************************************************
* Profile Attributes - Table
*/ static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED];

那 这个 数组 放了 什么 东西 那 , 我 们 来 分析 分析 。

  • 这个 数组 的 第一个  元素  如下:(按照 上面 gattAttribute_t 结构体 中文 解释 分析 ,看下面注释)
  // Simple Profile Service,1 1
{
{ ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type 值是0x2800,即属性类型是 主服务类型, 更多类型看 上面的 表1-1*/
GATT_PERMIT_READ, /* permissions,权限为可读权限,意思是:允许GATT客户端在设置权限的情况下读取此服务 */
, /* handle 默认为0,因为这个句柄是协议栈自动分配的,不可以自定义,因此默认初始化为0*/
(uint8 *)&simpleProfileService /* pValue: 是一个 gattAttrType_t 类型的值,即 {2,0xFFF0} */
},

总结:  该 元素是 一个 主服务类型, 服务的 UUID 的值 是 0xFFF0 ,该服务 具有 可读权限

UUID :   具有以下几种含义

  1. 服务或者特征值的 唯一ID
  2. 用于 区分 是 服务 还是特征值 还是 …………具体 看 上面的  表 1-1
  • 这个数组的 第二个  元素如下:(注:我 的是这个 ,其他的我删除了,同个类型的 没啥 差别)
    // Characteristic 5 Declaration
{
{ ATT_BT_UUID_SIZE, characterUUID }, /* type,属性类型 是特征值类型,详看 表1-1 */
GATT_PERMIT_READ,             /* 可读 */        
,
&simpleProfileChar5Props        /* 这个 查看定义是 uint8 simpleProfileChar5Props = GATT_PROP_WRITE; 应该理解为 特征值 具有可写的属性 */
},

  总结  :  这里 有 歧义,   GATT_PERMIT_READ 这个描述的 是  数组 这个元素 具有的 权限 是 可读 或者 可写(详见表1-0),    simpleProfileChar5Props 这个变量 描述 的 是  该数组元素 代表的特征值 具有  可写 的属性 (详见表1-2) ,一个是权限 一个  是 属性。

    这个 元素  可以理解为 :  描述 特征值 uuid 为 0XFFF1 具有 写入的属性,即 手机APP 可以 往这个 特征值写入数据。

表 1-2

  • 该数组 第三个 元素 是 如
// Characteristic Value 5
{
{ ATT_BT_UUID_SIZE, simpleProfilechar5UUID }, /* 该类型设置为自定义的simpleProfilechar1 UUID(0xFFF5)。 */
GATT_PERMIT_WRITE,  /* 属性表中特征值的属性必须与特征值声明中的属性匹配,这里的意思是: 改特征值 具有 可以 写的权限 , 要和 第二元素 中 的uint8 simpleProfileChar5Props = GATT_PROP_WRITE 可写的 属性 必须保持一致,否则就会造成系统混乱 */
     ,
    simpleProfileChar5 },

总结 :

/* 属性表中特征值的属性必须与特征值声明中的属性匹配,这里的意思是: 改特征值 具有 可以 写的权限 , 要和 第二元素  中 的uint8 simpleProfileChar5Props = GATT_PROP_WRITE 可写的 属性 必须保持一致,否则就会造成系统混乱 */

如果某个service是一个蓝牙联盟定义的标准服务,也可以称其为profile,比如HID/心率计/体温计/血糖仪等,都是标准蓝牙服务,因此都有相应的profile规格书。

由于一个service可以包含多个characteristic,characteristic declaration就是每个characteristic的分界符,解析时一旦遇到characteristic declaration,就可以认为接下来又是一个新的characteristic了,同时characteristic declaration还将包含value的读写属性等。Characteristic value就是数据的值了,这个比较好理解就不再说了。Characteristic descriptor就是数据的额外信息,比如温度的单位是什么,数据是用小数表示还是百分比表示等之类的数据描述信息。CCCD是一种特殊的characteristic descriptor,一般而言,都是client来访问server的characteristic,我们把这种操作称为读或者写。另外,server可以直接把自己的characteristic的值告诉client,我们称其为notify或者indicate,跟read操作相比,只有需要传输数据的时候或者说只有当数据有效时,server才开始notify或者indicate数据到client,因此这种操作方式可以大大节省server的功耗。有时候client不想监听characteristic notify或者indicate过来的数据,那么就可以使用CCCD来关闭characteristic的notify或者indicate功能;如果client又需要监听characteristic的notify或者indicate,那么它可以重新使能CCCD来打开相关操作。总结一下,当characteristic具有notify或者indicate操作功能时,那么必须为其添加相应CCCD,以方便client来使能或者禁止notify或者indicate功能。



gattAttribute_t 含义 中文解释的更多相关文章

  1. SkyWalking6.2.0版本UI参数、告警参数、指标含义中文解释

    一.告警规则相关参数 二.SkyWalking UI相关参数CPM:每分钟请求调用的次数SLA: 服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保 ...

  2. Linux常用命令英文全称与中文解释Linux系统

    Linux常用命令英文全称与中文解释Linux系统(转)   Linux常用命令英文全称与中文解释Linux系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Pri ...

  3. LoadRunner函数大全之中文解释

    LoadRunner函数大全之中文解释

  4. LoadRunner 函数大全之中文解释

    LoadRunner 函数大全之中文解释 // sapgui_table_set_column_selected 模拟用户 // 单击表中的列标题. int sapgui_table_set_colu ...

  5. Linux常用命令英文全称与中文解释 (pwd、su、df、du等)

    https://blog.csdn.net/qq_40334837/article/details/83819735 Linux常用命令英文全称与中文解释 apt: Advanced Packagin ...

  6. 自然语言分析工具Hanlp依存文法分析python使用总结(附带依存关系英文简写的中文解释)

    最近在做一个应用依存文法分析来提取文本中各种关系的词语的任务.例如:text=‘新中国在马克思的思想和恩格斯的理论阔步向前’: 我需要提取这个text中的并列的两个关系,从文中分析可知,“马克思的思想 ...

  7. mongodb 学习之——mongod --help 中文解释

    中文解释如下: -------------------------------------------------------------------------------- --quiet # 安 ...

  8. Redis命令大全&中文解释&在线测试命令工具&在线中文文档

    在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...

  9. CC_UNUSED_PARAM 宏含义的解释

    #define CC_UNUSED_PARAM(unusedparam) (void)unusedparam 这个宏完全没有执行任何命令,这样写的原因主要是历史遗留原因,ojb-c不存在纯虚函数并且传 ...

随机推荐

  1. JS计算字符串长度(兼容后端PHP)

    /*** 计算字符串长度* 参数是要计算的字符串* 返回值当前字符串的长度*/function charactersLen (words) { let tempMapWordNum = {} let ...

  2. 当div元素内的内容超出其宽度时,自动隐藏超出的内容

    word-break:keep-all;/* 不换行 */ white-space:nowrap;/* 不换行 */ overflow:hidden;/* 内容超出宽度时隐藏超出部分的内容 */ te ...

  3. 前端AMD、CMD和commonJs-前端知识

    前端AMD和CMD是在模块化的基础上产生并且得到大幅度的引用的. AMD 即Asynchronous Module Definition(点击链接可以查看AMD面试题),中文名是异步模块定义的意思.它 ...

  4. SLAM会被深度学习方法取代吗?

    日益感觉到自己对深度学习的理解比较肤浅,这段且当做是以前的认识. 上上周去围观了泡泡机器人和AR酱联合举办的论坛.在圆桌阶段,章国峰老师提了一个问题:SLAM会被深度学习方法取代吗?这是一个很有趣的话 ...

  5. maven 生命周期、生命周期阶段、插件、目标

    生命周期maven的生命周期是抽象的,它本身不做任何实际的工作.实际的工作都由插件来完成.生命周期好比接口,插件好比实现类.maven 有三个独立的生命周期,clean.default.site. 生 ...

  6. Python Socket实现简单web服务器

    #!/usr/bin/python env # coding:utf-8 import socket ip_port = ('127.0.0.1', 80) back_log = 10 buffer_ ...

  7. 命令模式-实现undo和redo

    这次实验主要是实现多次redo和undo,即程序的撤回和恢复,这里只实现加法的撤回和恢复. 程序的撤回和恢复就是由所使用的软件来记录操作步骤,可以将数据恢复到某个操作状态. 撤回这个指令很常见,Win ...

  8. error MSB3552: Resource file "**/*.resx" cannot be found. [/ConsoleApp1.csproj]

    问题场景: 练习在docker下操作netcore,镜像为centos7,安装完netcore sdk 2.2后,执行操作: dotnet new consoledotnet run 出现报错: /u ...

  9. nodejs+redis使用

    安装 linux安装及配置之前写过了http://www.cnblogs.com/zycbloger/p/6226682.html windows安装 下载地址:https://github.com/ ...

  10. 阿里云ECS服务器环境搭建 ubuntu 16.04 图形界面的安装

    https://blog.csdn.net/zwq912318834/article/details/80528374