目录
HCI log 分析: GATT discover service flow
GATT 是ble 的另一个 基本协议,总结了gatt 一些定义,最后通过一份hci log,说明一下GATT在实际应用中如何运作。
两年前初次接触ble 就是从GATT spec 开始入手学习,工作中更多的是下沉到bludroid stack 维护工作中,GATT基础知识通过整理blog,加深了自己的理解。凭着自己的工作经验,总结了GATT部分核心内容,可能仍有些许遗漏。
欢迎有兴趣的朋友留言,有描述不清或者有错误的地方,也欢迎指正
GATT OverView
Gatt 是在ATT基础上的封装,定义了一些服务发现的框架。
整体框架图如上, GATT DataBase主要分为三个部分,service,include,characteristic,首先围绕这三个分别作介绍
service 定义
类型: 服务有两种类型,primary service 和secondary service,
primary service可以被其他service 所包含,可以通过discover 流程发现。
secondary service只能被primary service 或者其他secondary service 所包含,不能独立存在。
一个服务的类型,会在申明中注明。
组成:gatt 数据框架都是有一个或者多个service 并列组成的。
用户通过定义不同的service,实现不同的功能。
一系列ATT数据组成一个group,表示一个service。
所有的service都必须满足相同的数据要求,具体分为三个部分
1. 服务申明(必须)service
2. 包含其他服务(可选)
3. 必须的特征和可选择的特征、
红色部分为一个服务必须包含的部分,蓝色为可选择的部分。
服务申明: 每个定义的service第一条就是服务申明, 因此以服务申明可以分隔开所有不同的服务。
服务声明的数据结构,ATT类型(仅有两种)+ ATT value(服务的具体类型,比如电量服务,GAP服务等等)
服务声明为read only,不可以被修改,有server 端在自定义数据表格的时候确定。
申明之后,紧跟include 和 characteristic部分。
include 定义
include 是解释服务之间的关系,secondary service只能被primary service 或者其他secondary service 所包含,不能独立存在。
include 是service 中可选择的部分,不强制要求必须有这一部分。
同服务一个样,include 也是从declaration 开始。
一条ATT仅包含一个include 信息。
include 申明格式:
ATT value: 包含的服务handle 是该服务对应的申明, service UUID 是指该服务的类型
通过include 申明,可以查到包含服务的 开始handle和结束handle,及服务类型 三个信息
该申明也是read only,不可以被修改
characteristic 定义
特征必须要有申明和值申明,可能含有特征描述申明。
同服务一样,相邻的所有特征都是通过申明ATT 间隔开的。一个特征的结束handle 一定是下一个特征的申明handle
特征申明:
同服务申明格式一致,指出实际value对应的handle,及类型(uuid),方便解析
每一个申明都有属性,决定value 可以被操作的方法。
特征属性详解: