本章将介绍BLE不同层的协议,包括各层的组件及其概念。 2.1 一般访问规范(Generic Access Profile,GAP) GAP应用层可以直接访问BLE在协议栈的底部,它包括管理广播和连接事件的参数。
注意:GAP详见《Bluetooth Core Specification》第三卷C部分(蓝牙核心规范)。
2.1.1 角色 创造和维持一个BLE连接,引入了“角色”这一概念。一个BLE设备要么是集中器角色,要么是外围设备角色,这取决于谁启动了这个连接。集中设备总是连接发起人,而外围设备总是连接发起人。集中器和外围设备之间的关系就像链路层中主机和机器的概念。
在LED Button在应用例程中使用S110 SoftDevice烧录到nRF51822作为外围设备,计算机或手机作为集中器。
蓝牙核心规范除了集中器角色和外围设备角色外,还定义了观察者角色和广播者角色,观察者角色监控空中事件,广播者角色只广播信息而不接收信息。观察者角色和广播者角色只广播而不建立联系。它们不适用于我们的应用程序。
注:无论是集中器还是外围设备,连接另一端的设备都称为对等设备。
2.1.2 广播 集中器可以与外围设备连接,外围设备必须处于广播状态。它每隔一段时间发送一个广播数据包,称为广播间隔,其范围为20ms到10.24s。广播间隔影响建立连接的时间。
在集中器发送连接请求启动连接之前,必须收到广播数据包,外围设备发送广播数据包后连接请求。
一个广播数据包最多可以携带31字节的数据,通常包含类似的标志,如用户可读名称、关于设备发送数据包的信息以及用于表示设备是否可以找到的标志。
当集中器收到广播数据包时,它可能会发送更多的数据包请求,称为扫描请求。如果设置为主动扫描,外围设备将发送扫描响应作为对集中器请求的响应,扫描响应最多可携带31字节。
广播,包括扫描请求和扫描响应,出现在远离WLAN使用的2.4G以防止频段以外的三个频率被使用WiFi干扰。
2.1.3 扫描 扫描是集中器监控广播数据包和发送扫描请求的过程,有两个定时参数需要特别注意:扫描窗口和扫描间隔。
对于每个扫描间隔,集中器的扫描时间等于一个扫描窗口,这意味着如果扫描窗口等于扫描间隔,集中器将连续扫描。扫描窗口与扫描间隔之比为扫描空间比。
2.1.4 发起 如果集中器想要建立一个连接,当扫描和监控广播数据包时,它将采用相同的过程:当需要启动连接时,集中器将在收到广播数据包后发送连接请求。
2.1.5 连接 集中器和外围设备之间的第一次交换数据被定义为连接状态。在连接状态下,集中器将从外围设备请求数据的特定定定义间隔,称为连接间隔,由集中器决定并应用于连接,但外围设备可以向集中器发送连接参数更新请求。根据蓝牙的核心规范,连接间隔必须为7.5ms到4s之间。
如果外围设备在一个时间帧内没有响应集中器的数据包,则称为连接监督超时,则认为连接丢失。
多个数据包可以在每个连接间隔中传输,以获得更高的数据吞吐量,每个数据包最多可以携带20个字节的应用数据。但如果电流消耗是关键,外围设备没有数据发送,可以选择忽略一定数量的连接间隔,称为从机延迟(slave latency)。
在连接中,除了广播通道外,设备间还在频带的所有通道中通信。当然,对于应用层来说,这是完全透明的。
2.2 一般属性配置文件(Generic Attribute profile,GATT) GATT层是传输真实数据的层。
2.2
2.2.1角色 除了GAP除了定义角色,BLE还定义了另外两个角色:GATT服务器和GATT它们完全独立于客户端GAP角色。提供数据的设备称为GATT服务器,访问GATT获取数据的服务器设备称为GATT客户端。
以LED Button例如,外围设备(带有LED和按键)作为服务器,集中器作为客户端。
注:设备可同时用作服务器和客户端。
2.2.2 GATT层 一个GATT服务器通过表格组织数据,称为属性表,用于真实发送数据。
2.2.2.1 属性 一个属性包含句柄、UUID、值,句柄是属性GATT在一个设备中,每个属性的句柄都是唯一的。UUID它包含属性表中的数据类型信息,是理解属性表中每个字节值意义的关键信息。GATT表中可能有许多属性,可能具有相同的属性UUID。
2.2.2.2 特性 一个特性至少包含两个属性:一个属性用于声明,一个属性用于存储特性值。
所有通过GATT服务传输的数据必须映射成一系列特征,可以将特征中的数据视为捆绑数据,每个特征都是自我包容和独立的数据点。例如,如果几个数据总是一起变化,我们可以将其集中在一个特征中。
以LED Button例如,外围设备(带有LED和按钮)作为服务器,集中器作为客户端。
在LED Button服务中,LED与按钮无关,它们可以独立改变, 因此,它们可以成为独立的特征,所以我们用一个特征来表示当前按钮的状态,用另一个特征来表示当前的状态LED的状态。
2.2.2.3描述符 特征中的任何属性要么定义为属性值,要么定义为描述符。描述符是提供更多特征信息的额外属性,提供人类可识别特征描述的例子。
然而,有一个特殊的描述符值得特别提及:客户端特征配置描述符(Client Characteristic Configuration Descriptor,CCCD),此描述符额外增加了任何支持通知或指示功能的特性,见第15页第2号.2.五节空中操作与性质。
在CCCD1使能通知功能,2使能指示功能,0同时禁止通知和指示功能。
在S110 SoftDevice在协议栈中,协议栈将自动添加该类型的描述符,以使通知功能或指示功能的任何功能。
2.2.2.4服务 服务包含一个或多个特征,这些特征在逻辑上与集合有关。
GATT该服务一般包括具有特定传感器读取和设置、人机接口输入输出等相关功能的几块。该组织在服务中既实用又有效,因为它使逻辑和用户数据之间的边界更加清晰,也有助于重用不同应用程序之间的代码。GATT基于蓝牙技术联盟(SIG)官方设计,SIG根据他们的规范设计自己的建议profile。
对于LED Button应用程序程序,因为不关心它们的重用,所以LED服务中放置了特性和按键特性。
2.2.2.5 profile(数据配置文件) 一个profile文件可以包含一个或者多个服务,一个profile文件包含所需的服务信息或如何为对等设备交互配置文件的选项信息。GAP和GATT在数据交换过程中,角色可能会发生变化。因此,本文件应包括广播类型、所使用的连接间隔、所需的安全等级等信息。
需要注意的是一个profile中的属性表不能包含另一个属性表。
在LED BUTTON示例中的profile不是标准描述profile。
2.2.3 标准定制服务和特点 蓝牙技术联盟(SIG)已经定义了一些profile、根据协议栈的服务、特点和特点GATT层定义的属性。然而,部分应用只在协议栈中实现BLE服务,那就意味着,只要协议栈支持GATT,建立一个应用程序所需要的应用程序是可能的profile和服务。
既然可以在应用程序中支持profile并且服务,那么就可以在这个应用中建立定制的服务。
对于LED BUTTON例如,蓝牙技术联盟不包括这个应用程序,因此它建立了包括两个定制特征在内的定制服务。
2.2.4UUID 在第10页2.2.2节“GATT层中定义的所有属性都有一个UUID值,UUID它是世界上唯一一个用来识别不同特征的128位数字。
2.2.4.1 蓝牙技术联盟 UUID 制定了两种不同的蓝牙核心规范UUID,一是基础UUID,一是取代基础UUID的16位UUID。
所有蓝牙技术联盟的定义UUID共享一个基本的UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
进一步简化基础UUID,每个蓝牙技术联盟定义的属性只有16位UUID,替代上述基础UUID的‘x部分。例如,心率测量特性为0X2A37作为它的16位UUID,所以它完整的128位UUID为:
0x00002A37-0000-1000-8000-00805F9B34FB
虽然蓝牙技术联盟使用相同的基础UUID,但是16位的UUID足以识别蓝牙技术联盟定义的各种属性。
蓝牙技术联盟使用的基本技术UUID任何定制属性、服务和特性都不能使用。对于定制属性,必须使用其他完整的128位UUID。
2.2.4.2 特定供应商UUID SoftDevice 根据蓝牙技术联盟的定义UUID定义类似的方法UUID:首先增加一个特定的基础UUID,再定义一个16位UUID(类似于别名),然后加载在基本上UUID以上。这种使用为所有定制属性定义了共享的基础UUD的方式使得应用变为更加简单,至少在同一服务中更是如此。
使用软件nRFgo Studio非常容易产生一个新的基本UUID,见第29页第4.4.3节“服务初始化”。
例如,在LED BUTTON示例中,采用0x0000xxxx-1212-EFDE-1523-785FEABCD123作为基本UUID。
蓝牙核心规范没有任何规则或是建议如何对加入基本UUID的16位UUID进行分配,因此你可以按照你的意图来任意分配。
例如,在LED BUTTON示例中,0x1523作为服务的UUID,0x1524作为LED特性的UUID,0x1525作为按键状态特性的UUID。
2.2.5 空中操作和性质 大部分的空中操作事件都是采用句柄来进行的,因为句柄能够唯一识别各个属性。如何使用特性依据它的性质,特性的性质包括:
l 写
l 没有回应的写
l 读
l 通知
l 指示
更多的性质在蓝牙规范中有明确的定义,但以上性质更为常用。
2.2.5
2.2.5.1 写和没有回应的写 写和没有回应的写允许GATT客户端写入一个值到GATT服务器的一个特性中。它们之间不同的地方在于没有回应的写事件没有任何应用层上的确认或回应。
2.2.5.2 读 读性质表明一个GATT客户端可以读取在GATT服务器中特性的值。
2.2.5.3 通知和指示 通知和指示性质允许GATT服务器在其某个特性改变的时候对GATT客户端进行提醒,通知和指示之间不同之处在于指示有应用层上的确认,而通知没有。 --------------------- 作者:fanqh6 来源:CSDN 原文:https://blog.csdn.net/ge23456789/article/details/49329977 版权声明:本文为博主原创文章,转载请附上博文链接!