博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝牙 (四) GATT profile
阅读量:4286 次
发布时间:2019-05-27

本文共 7623 字,大约阅读时间需要 25 分钟。

GATT 综述 ,是一个服务框架	程序		发现,读,写,notify,indicating,配置特性的广播.	服务和其特性依赖	app 依赖 GATT ,GATT 依赖 GAP 程序There are 11 features defined in the GATT Profile:1. Server Configuration2. Primary Service Discovery3. Relationship Discovery4. Characteristic Discovery5. Characteristic Descriptor Discovery6. Reading a Characteristic Value7. Writing a Characteristic Value8. Notification of a Characteristic Value9. Indication of a Characteristic Value10.Reading a Characteristic Descriptor11.Writing a Characteristic Descriptor
  • profile service character descriptors 的关系
GATT中最上层是Profile,Profile由一个或多个服务(Service)组成 服务(Services)、特性(Characteristics)和描述符(Descriptors)都是属性类别,因此也就有了通用属性配置文件(Generic Attribute Profile)、属性表(Attribute Table)和属性协议(Attribute Protocol)等。具体是哪一个类别的属性,由“通用唯一标识符(Universally Unique Identifier,简称UUID)”来定义。服务(Service)、特性(Characteristics)和描述符(Descriptors)也有层级之分。服务包括一项或多项特性。一项特性可能没有、拥有一个或拥有多个描述符
  • Attribute
规定数据按照一定规则存放,这个规则就是属性。属性句柄(2个字节) + 属性类型(2个字节) + 属性值(0-512个字节) + 属性权限

在这里插入图片描述

1.属性句柄(Attribute Handle)通过他可以找到对应属性,并用于区分不同服务中的相同属性。我理解类似是数组下标。2.属性类型(Attribute Type)是对某个东西取一个数字代号(用uuid来代号),比如心率计,SIG就是用0x180D这个uuid来表示这个这条属性是和心率计有关SIG将uuid进行了范围规定,下面这些uuid都来标识属性类型0x1800~0x26FF 用于服务类 UUID0x2700~0x27FF 用于标识计量单位0x2800~0x28FF 用于区分属性类型0x2900~0x29FF 用于特性描述0x2A00~0x7FFF 用于区分特性类型3.属性值(Attribute Value)属性值是一个 0~512 字节的数据,属性值是给上层应用层使用的,是用户“真正”要使用的数据,属性值可以有一下几类服务通用唯一识别码(UUID)  // 1800单位属性类型特性描述符特性类型
  • Attribute 实例,从开发看
属性句柄 是不用填充的属性类型 需要填充	一般包括 		uuid		权限 (读写 notify initicate)		长度属性值 	如果是特性声明,需要填充属性值 描述符 (包括访问控制权限(读),特征数值句柄,特征数值uuid )Service Definition 部分	Service Declaration // 由一个属性表示 // 2800 2801	Include Definitions(>=0) // 由一个属性表示 // 2802 include	Characteristic Definitions(>=0) // 由多个属性表示Characteristic Definitions 部分 - Characteristic Declaration                       : First  // 由 一个属性 表示 , 2803 - Characteristic Value declaration                 : Second // 由 一个属性 表示 , xxxx(自定义)- Characteristic Descriptor Declarations(Optional)(>=0) : Last(含多个时顺序不关紧要) // 由 一个或者多个属性 构成Characteristic Descriptor Declarations(Optional)(>=0) 部分- Characteristic Extended Properties - Characteristic User Description - Client Characteristic Configuration - Server Characteristic Configuration - Characteristic Presentation Format - Characteristic Aggregate FormatAttribute Type	UUID	Description
0x2800 Primary Service Declaration
0x2801 Secondary Service Declaration
0x2802 Include Declaration
0x2803 Characteristic Declaration
0x2900 Characteristic Extended Properties
0x2901 Characteristic User Description Descriptor
0x2902 Client Characteristic Configuration Descriptor
0x2903 Server Characteristic Configuration Descriptor
0x2904 Characteristic Format Descriptor
0x2905 Characteristic Aggregate Format Descriptor
  • Attribute 实例,从app看
    在这里插入图片描述
属性句柄(Attribute Handle)  属性类型(Attribute Type) 							属性值(Attribute Value) 	属性许可(Attribute Permissions)service:   	无 							0x2800(用于区分服务类型,首要服务)						0x1800(服务通用唯一识别码,GAP)service: 	无 							0x2800(用于区分服务类型,首要服务) 					0x1801(服务通用唯一识别码,GATT)character: 	无							0x2A00(用于区分特性类型,Device Name)					"Apple Watch"(特性类型,Device Name 的 value)character: 	无							0x2A05(用于区分特性类型,Service Changed)				自定义character: 	无							0xXXXX(自己建立的uuid)(用于区分特性类型,Unknow Service)	自定义Descriptors:无							0x2902(用于区分描述类型,Client Characteristic Configuration,可以通过这个Descriptors 来 notify和 indicate)		"Notifications and indications disabled"(特性类型,enable 或者 disable)Descriptors:无							0x2900(用于区分描述类型,Characteristic Extended Properties,可以根据这个 Descriptors 来 在 notify 和 indicate 的同时实现 write)		"Reliable Write enabled"Descriptors:无							0x2901(用于区分描述类型,Characteristic User Description)		"Telink SPP:module->phone"标准 service1800 Generic Access	标准 characcter	2A00 Device Name	2A01 Appearance	标准 service1801 Generic Access	标准 characcter	2A05 Service Changed标准 service180F Battery Service	标准 characcter	2A19 Battery Level	标准 service1805 Current Time Service	标准 characcter	2A2B Current Time	2A0F Local Time information	标准 service180A Device Information	标准 characcter	2A29 Manufacturer Name String	2A24 Model Number String
  • character 与 service 的实例 (开发中应该新建几个service?)
profile 描述一个或多个设备,在每个设备上有一个或多个服务的规格。可以看到他可以包含多个 Service,大部分 Service 其实都是 BLE 本身自带的,一般都是 SDK 定义好了的,我们不需要修改和操作的,我们要用的 Service 可能一个工程里面只有一个。 举个例子:一个血压计设备,他可能只有一个我们需要操作、修改的 Service,就是读取血压数值然后发送给 APP。 再举个例子:一个带心率功能的计步器,有两个功能,一个是计步,还有一个是测量心率,那么这个设备可能就有两个 Service 需要我们操作、修改。这些新增的服务都属于 profile .在图中还能看到一个 Service 可能包含多个 Characteristic,这就是一个服务所包含的特征值。怎么理解特征值呢,还举那个血压计的例子吧: 上面说过血压计只有一个 Service(代表他只有这个服务的一系列值),就是读取血压数值然后发送给 APP,但是这一个 Service (一般一个值对应一个charatcer)可能包含多个 Characteristic也就是说一个血压计的设备有一个服务,一个服务就是一个功能,但是这个功能可能包含了好几个变量,这个 Characteristic 可以暂时理解为变量。所以说 BLE 之间的数据交换是通过 Characteristic 做到的。具体怎么定义 Characteristic  要 根据 需求来定
  • 特性里面的东西
特性包括多个部分,如类型、值、一些属性和权限等。特性一般包括三个要素:声明、数值和描述。	前两者都是必须的。	作为通信交互,一个特性必须要告诉对方声明(存储长度和访问控制)、定义(具体赋值)。	在某些特性(如notify或者indicate)里面,特性还需要告知对方附加的配置属性(提供订阅等)。		特性声明必须作为服务属性之后的第一条属性,而数值必须紧随其后。		无论是服务还是特性,它们都是一条条属性;	特性的各个要素也是一条条属性。	只不过,不同的服务是独立的;而一个服务如果有多个特性,那么不同的特性也是独立的;一个特性包含的多条属性则是关联的。类型(Type) 	在上面已经解释过了,就是表明属性具体特性类别的UUID值	uuid 由 Handle、UUID(属性类型)、Value(属性值) 组成.	这张图由三个部分组成,分别是 Handle、UUID(属性类型)、Value(属性值)。我们先来说 UUID,UUID 是通用唯一识别码。这里表示的是属性类型。举个例子,在 BLE 协议中定义了 0x2800 这个 UUID,它代表了一个这个属性的类型是 Service;0x2803 这个 UUID,表示这个属性的类型是一个 Characteristic。		那我们看到 UUID 有很多都重复出现了,那怎么区别他们呢?那就要靠前面的 Handle 了,这个 Handle 是不能重复的,就是一个属性在属性列表中的位置,所以可以当做地址来理解。两个属性的 UUID 可能是相同的,但是 Handle 永远不可能相同。值(Value) 	就是相关状态数据项的值。属性(Properties) 	属性定义了其他设备如何通过蓝牙运用特性,这些特性主要关于各项操作,如读取(READ)、  写入(WRITE)或通知(NOTIFY)。		读取特性就是通过蓝牙链路将当前的值从属性表传输至相连的设备。		写入是允许互连设备改变状态表中的值。		通知是当相关特性值改变或由定时器进行周期性控制时,设备可以发送至相连设备的		一种特定的信息类型。有些特性并不支持所有操作。通过特性的属性可以了解其支持的操作。		有时设备的编程允许其在处理操作时(如在属性表中读写值)能够以特定的方式作出回应,这样就能实现更多功能,而不是简单的通过连接来传输数据。例如,改变特性的值也可能改变设备从加速器上读取样本数据的频率。权限(Permissions)  	权限与安全相关,并进一步描述了在对特性进行读写访问之前必须确保的安全条件。描述符(DESCRIPTORS)  	描述符含有元数据,这些元数据可以放大描述符所属特性的相关细节,或实现涉及这一 属性的运行配置。	例如,可通过名为“客户端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD)”的特定描述符来开启或关闭通知(NOTIFY)信息。配置文件(PROFILE)    	蓝牙配置文件是包括所有必需信息的规格,包括设备功能,服务、属性及描述符的访问方式,以及安全准则、并行限制等。
  • 特性字段与封包的关系
对开发者来说,很简单,他只需要调用send(0x53)GATT层定义数据的类型和分组,方便起见,我们用0x0013表示电量这种数据类型,这样GATT层把数据打包成130053(小端模式!)ATT层用来选择具体的通信命令,比如读/写/notify/indicate等,这里选择notify命令0x1B,这样数据包变成了:1B130053

nrf connect app

nrf connect下箭头按下 : 读上箭头按下 : 写上下箭头此时状态 : notify and indication 关闭上下箭头打叉此时状态 : indication 开三下箭头此时状态 :  notify and indication 关三下箭头打叉此时状态 :  notify enable 开notification无需client端确认,就好像小明妈妈跟小明发了一条信息说该吃饭了,小明收到了可以有动作也可以忽略。indication是需要client端确认,举个例子小明妈妈跟小明打电话,小明务必点击接听,听妈妈跟他说该吃饭了,整个过程才完结。当 notify 或者 indication 为开的情况下, 当value 改变(通过定时器,通过host端主动修改), ble 会主动上报改变过的 value.

标准服务

可以通过GATT层定义自己的Profile1800和1801服务UUID为TI蓝牙协议栈的GATT层服务。GATT ServicesGATT Characteristics

UUID

/** * WARNINGS: The 16-bit UUIDs are assigned by the Bluetooth SIG and published in the Bluetooth Assigned Numbers page. Do not change these values. Changing them will cause Bluetooth interoperability issues. *//** * GATT Services */ #define GAP_SERVICE_UUID             0x00001800 // Generic Access Profile 通用接入规范 #define GATT_SERVICE_UUID            0x00001801 // Generic Attribute Profile 通用属性规范
  • Characteristics
/** * GATT Characteristics */ #define DEVICE_NAME_UUID              0x00002A00 // Device Name 设备名称 #define APPEARANCE_UUID               0x00002A01 // Appearance 外貌特征 #define PERI_PRIVACY_FLAG_UUID        0x00002A02 // Peripheral Privacy Flag 外围设备隐蔽标志 #define PECONNECT_ADDR_UUID           0x00002A03 // Peconnection Address 连接地址 #define PERI_CONN_PARAM_UUID          0x00002A04 // Peripheral Preferred Connection Parameters 外围设备首选连接参数  #define SERVICE_CHANGED_UUID          0x00002A05 // Service Changed 服务改变

转载地址:http://jligi.baihongyu.com/

你可能感兴趣的文章
Android 开机启动过程
查看>>
View 的事件分发机制(一)
查看>>
Android 面试题整理(一)
查看>>
Android 项目中打印Log的优化
查看>>
Github 客户端安装失败解决办法
查看>>
android studio:###Error:Dependency :common:unspecified on project resource resolves to an APK
查看>>
异常统一处理的一些思路
查看>>
Android studio中快速try catch的快捷键
查看>>
Dialog 和 Toast
查看>>
队列在Http请求中的一点理解
查看>>
好想在你身边
查看>>
写给还在迷茫中挣扎的你
查看>>
在迷茫中执着前行
查看>>
笔记本连接无线但不能上网,网速极慢
查看>>
小蜗牛,慢慢爬
查看>>
Java关键字 -- Super
查看>>
Java -- 入口函数浅析
查看>>
EventBus 的简单使用
查看>>
Banner 浅析
查看>>
Android Crash框架Recovery
查看>>