第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的对应关系如下图所示:
第15节_BLE协议GATT层的更多相关文章
- 第16节_BLE协议GAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...
- 第14节_BLE协议ATT层
下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...
- 第13节-BLE协议L2CAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...
- 第03节-BLE协议各层数据格式概述
本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- 第10节-BLE协议链路层(LL)
本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...
- 第12节-BLE协议HCI层的数据格式
学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...
- 第11节-BLE协议HCI层的硬件接口
本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...
- 【Lucene3.6.2入门系列】第15节_SolrJ高亮
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...
随机推荐
- Python常见异常及常用单词翻译
Python常见异常及常用单词意思 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportE ...
- pytest-2:allure 的安装、使用
版本对应: python3.4==>allure-pytest2.7.0 python3.6==>allure0pytest2.8.6 环境安装: 1.先安装好对应的python,准备好p ...
- K-消亡的质数-(简单数学)
https://ac.nowcoder.com/acm/contest/3346/K 题意:判断一个素数p是不是某两个数的立方差. 刚看到这道题一时半会都没有什么思路,看了题解恍然大悟,太久没碰数学或 ...
- 2019 SDN上机第五次作业
1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 实现将接收到的数据包发送到所有端口 控制器设定交换机 ...
- 编译安装nmap
官方编译文档 参考 安装对应的库,并编译安装.
- [日常] NOI2019 退役记
这次要彻底退役了 开个坑先 Day -2 出发坐车去gz 好像和上次去雅礼的车是同一趟于是大家都以为和上次一样是 \(10:40\) 开车, 于是提前2h大概八点多就去坐公交了 到了之后取票, 发现票 ...
- Note | 论文写作笔记
目录 1. 规范 2. 语法 3. 其他 4. 好图好表 5. 好表达 我们的工作很重要 我们的工作有意义 我们的工作细节 我们怎么组织这篇文章 最终效果出类拔萃 怎么解释我们的成功 写完逐条核对吧. ...
- 支付宝AopSdk在dotnet core下的实现
随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...
- java.sql.SQLException: Could not establish connection to 192.168.8.111:10000/default: java.net.ConnectException: Connection refused: connect at org.apache.hadoop.hive.jdbc.HiveConnection.<init>(HiveC
java.sql.SQLException: Could not establish connection to 192.168.8.111:10000/default: java.net.Conne ...
- python 中in 的 用法
1. 作用为 成员运算符 在字符串内操作,如果字符串包含相关字符 则返回True,如果不包含则返回False 当然处理不单单是只有单个字符,多个连续的字符也是可以处理的 # 单个字符 a= ...