zoukankan      html  css  js  c++  java
  • 第15节_BLE协议GATT层

    学习资料:官方手册

    Vol 3: Core System Package [Host volume]

           Part G: Generic Attribute Profile (GATT)

    这篇文章格式比较好,基本上就是对GATT官方文档的翻译:

    Bluetooth GATT介绍 https://www.cnblogs.com/hzl6255/p/4158363.html 

    下面这个图是BLE协议各层跟医院的各个科室的类比图:

    跟医院类比,GATT层就是医务室,通过它可以得到各种服务──这些服务由属性组成。

    在医院里,底下的检验室提供各种检查结果,由医务室综合起来给病人提供服务。

    在BLE里,通过ATT层可以读写对端设备的属性,但是属性之间有什么联系、各个属性怎么组合起来提供服务,由上层GATT负责。

    服务,是GATT层的关键字。

    在上一节讲述ATT层时,它的属性组成有三部分:handle、type、value,其实还有第4部分:Permissions(权限)。通过ATT边是看不到Permissions的,Permissions由上层定义、使用,ATT Server使用Permissions来决定某个属性是否可读、可写等等。

    属性结构如下:

    GATT就是在ATT的基础上做两件事:如何定义服务、如何访问服务。

    一、如何定义服务

    先定义2个名词:Server、Service。Server指服务器,Service指服务,服务器可以提供服务,一个服务器可以提供多个服务。

    比如手环可以提供时间服务,心跳服务、计步服务等等。

    一个Server可以含有1个或多个Service,

    一个Service可以包含其他Service,

    一个Service含有1个或多个Characteristic(特性),

    一个Characteristic含有性质(Property)、Value;还可以含有Desciptor(描述)。

    名词解释:declaration和definition。

    declaration含义为声明,definition含义为定义。

    声明就是“咳咳咳,大家注意了,我已经把XXX做出来了”,起表明、宣示的作用;

    定义就是“大家看一看,这就是我做的XXX”,把实质的内容列出来。

    再举个例子,在C程序里,经常在头文件里declaration、声明某个函数,比如“int sum(int a, int b)”;然后在c文件里definition、定义、实现这个函数“int sum(int a, int b) { return a+b;}”。

    在BLE中也涉及declaration和definition,比如用某个属性声明这是一个Service,接下来是Service的实质内容,即定义;用某个属性声明这是一个Characteristic,接下来是Characteristic的实质内容,即定义。

    注意:这些declaration和definition,都是一个个ATT属性。

    ① Service的定义:

    一个Service定义,从它的“声明”开始,到下一个Service的声明结束;或一直持续到最大的handle值。

    所谓“声明”也就是一个属性,这个属性的type为0x2800或0x2801,表示这是一个首要服务(Primary Service)或次要服务(Secondary Service)。

    它的value用来表示“这是什么服务”,即value为某个服务的UUID。

    Permissions表示该声明即这个ATT属性是只读的,无需验证、无需授权。从这里可以知道,蓝牙设备能提供什么服务是公开的,它无法隐瞒,别的设备都可以来查询该设备提供什么服务。

    ② Characteristic的定义:

    一个Characteristic定义,从它的“声明”开始,到下一个Characteristic的声明结束,或是直到下一个Service的声明结束,或一直持续到最大的handle值。

    Characteristic = Characteristic声明 + Characteristic Value声明 + 可能的descriptor声明。

    Characteristic声明也是一个ATT属性,type为0x2803,value含有3项内容:

    a. Characteristic Properties(特性的性质):

    b. Characteristic Value Handle:表示Characteristic  Value的ATT属性的handle

    c. Characteristic UUID:表示Characteristic Value的ATT属性的UUID

     

    Characteristic Value声明也是一个ATT属性,这一属性的handle和type等于上述ATT属性的b、c两项。

    Characteristic声明、Characteristic Value声明,这2个ATT属性的形式如下:

    最精简的Service定义如下,它只含有一个Characteristic,一共3个ATT属性:

    Service = Service声明 + Characteristic声明 + Characteristic Value声明

     

    下面是一个例子(在BLE中,用“«xxx»”表示某个UUID,它实际上是一个值):

    其他的ATT属性,比如include definition、Characteristic Descriptor Declaration请看官方协议

    二、如何访问服务

    GATT层定义了11项Feature,即它可以做哪些事:

    1. Server Configuration

    2. Primary Service Discovery

    3. Relationship Discovery

    4. Characteristic Discovery

    5. Characteristic Descriptor Discovery

    6. Reading a Characteristic Value

    7. Writing a Characteristic Value

    8. Notification of a Characteristic Value

    9. Indication of a Characteristic Value

    10. Reading a Characteristic Descriptor

    11. Writing a Characteristic Descriptor

    这11项Feature,通过“Procedure”(规程)来实现,而Procedure要通过ATT层的Request、Response等等操作来传输数据。

    比如“Server Configuration”这个Feature,需要通过“Exchange MTU”这个规程来实现;具体的操作需要Clinet向Server发出“Exchange MTU Request”,而Server可能回复“Exchange MTU Response”或“Error Response”。

    Feature、Procedure和ATT层Opcode的对应关系如下图所示:

  • 相关阅读:
    pyspider安装
    阿里云服务器数据盘扩容
    笔记之Python网络数据采集
    Nginx如何隐藏index.html
    使用fiddler手机抓包
    Git基本常用命令
    27 和为S的两个数字
    26 函数形参值回传问题——C++解决多个return的一般方法
    25 面向对象设计实例——基于PCL点云库的通用工具开发
    23 Pro/E二次开发中的问题记录
  • 原文地址:https://www.cnblogs.com/-glb/p/11617694.html
Copyright © 2011-2022 走看看