由于还没有看具体的代码,难免会有理解错误的地方,本着共同学习的态度和大家交流探讨;
在BLE中;GATT是焦点;
在链路层(LL),可以把设备分为主机和从机,从机广播,主机发起连接;
在GAP层, 可以把设备分为中心设备和外围设备;
在GATT层, 可以把设备分为服务端和客户端;
我们需要记住一点就是,这些划分相互是不受影响的;
在说GATT之前先说下ATT;
ATT的Client/Server架构:
服务设备提供数据,客户端使用这些数据;服务端通过操作属性的方式,提供数据访问服务设备的服务/客户角色,不依赖于GAP层中心设备/外围设备角色,和LL层的master/slave角色定义。一个设备可能同时做为一个客户端和服务端,而两个设备上的属性不会相互影响。
ATT的Attribute Table Example (属性表示例)
Handle :属性在列表中的地址
Type :说明代表什么数据,可以是BluetoothSIG分配或者客户自定义的UUID(统一识别码,具有唯一性和通用性)
Permissions :权限,定义了client是否可以访问属性的值,以及特定的访问方式。
GATT的Client/Server架构:
GATT指定了profile数据交换所在的结构。
除了数据的封装方式不同,client/server和Attribute协议结构相同,数据封装在“Services”里,用“Characteristic”(特征)表示。
GATT的Services 中的Characteristic结构和ATT的Attribute 协议结构相同
GATT的Profile 层次结构:
为了实现用户的应用,profile通常有一个或者多个“Services”组成。
一个service或许包含某个特征值“characteristicvalues”(例如,在一个温度采集设备中,通常会包含一个温度的特征值)。
每一个特征值必须有占用一个特征声明结构,其中包括他的其他特性,它是服务端和客户端共享的读写空间,这个特征值可以包含一个可选的描述(descriptor字串),来指示这个特征值的含义。
GATT 的Characteristic Declaration(声明):
Handle 40 是一个特征值的声明,用0x2803来指示,这个0x2803 同样也是Bluetooth SIG的相关数据手册定义的,作为GATT
Characteristic Declaration的UUID
特征值的属性值包含5个字节的长度10:29:00:E1:FF
*0xFFE1,表明特征值的属类型(0xFFE1:客户自定义特征值的UUID)
*0x0029,是这个值所保存的位置handle(0x0029=41)
*0x10,表明这个特征值的操作权限0x10:notifyonly
GATT 的Characteristic Configuration:
另外作为特征值声明,可以有一个可选的描述信息。
这个例子中,handle 42包含了特征值的配置信息,0x2902,这个值同样也是BluetoothSIG的相关数据手册定义的,作为GATT Client Characteristic Configuration的UUID。
这个配置值有读写权限,意味着,GATT客户端可以改变这个值。如果把这个值(通知开关使能)从0x0000 Notificationoff改为 0x0001 notificationon,GATT服务器将开始发送这个特征值的通知到GATT客户端。
GATT Service Example:(这个是重点)
△Handle句柄 ——属性在表中的地址,每个属性有唯一的句柄。
△type 类型 ——表示数据代表的事务,通常是蓝牙技术联盟规定的或由用户自定义UUID。
△权限 ——对顶了GATT客户端设备对属性的访问权限,包括是否能访问和怎样访问。
首选我们来看一下GATT属性表中有一些特殊的属性类型,其值是由蓝牙技术联盟(SIG)定义:
△GATT_PRIMARY_SERVICE_UUID ——表示新服务的起始和提供的服务类型;
△GATT_CHARACTER_UUID ——称为“特征声明”紧随其后的是GATT特征值;
△GATT_CLIENT_CHAR_CFG_UUID ——这一属性代表特征描述符,它与属性表中它前面最近的特征值有关,他允许 GATT客户端设备使能特征值通知。
△GATT_CHAR_USER_DESC_UUID ——这一属性代表特征值描述符,他与属性表中他前面最近的句柄处的特征值相 关,包含一个ASCCI字符串,是对相关的特征的描述。
在Handle为40的一行中,这个是特征声明;它的特征值的属性值包含5个字节的长度10:29:00:E1:FF
*0xFFE1,表明特征值的属类型(0xFFE1:客户自定义特征值的UUID)
*0x0029,是这个值所保存的位置handle(0x0029=41)
*0x10,表明这个特征值的操作权限0x10:notifyonly
个人感觉这个地方类似于C语言中的变量的定义:这个一行就相当于定义了一个整型变量a;
int a;0xFFE1就相当于a;0x0029类似于a在内存中的地址;
在Handle为41的一行中,其特征值就相当于a的值;这也是用户自定义的有效数据;
在Handle为42的一行中,这个是特征描述符,
在Handle为43的一行中,0x2800表示又一个新服务的起始