【Silicon Labs BG22-EK4108A 蓝牙开发评测】二:蓝牙BLE之LED灯服务之读写的认识
<p>第一次评测搭建好了环境并测试了SoC - Blinky例程,这次我们进行下蓝牙BLE之LED灯服务之读写的认识</p><p> </p>
<p><span style="font-weight: bold;">蓝牙</span><span style="font-weight: bold;">BLE之LED</span><span style="font-weight: bold;">灯服务</span><span style="font-weight: bold;">之读写</span></p>
<p> 今天我们来谈谈蓝牙相关的知识,今天谈SoC - Blinky这个例子应用示例是为了让你学习如何EF32蓝牙上开发BLE应用,它是一个通过BLE的读和写控制属性功能进行通信的BLE应用的简单演示。当程序运行时,你可以通过主机控制EF32上LED的输出点亮。</p>
<p>这个应用实际上是通过一个服务“GATT层”服务被建立,那么这个服务应该包括2个特性:LED的特性和按键通知特性(下一讲谈)。如果有多个任务就可以设置多个特性。我们设置LED特性这里应该为:通过没有回应的写远程操作LED的亮灭,不发通知给集中器(主机)。</p>
<p>下面首先来介绍下几个基本的蓝牙概念:</p>
<p><span style="font-weight: bold;">1 </span><span style="font-weight: bold;">蓝牙协议</span><span style="font-weight: bold;">的分层:</span></p>
<p>蓝牙协议栈结构分为三层,其结构如下图1所示,分为应用层,主协议栈层,控制层,下面来详细进行介绍,同时结合本实例提出一些蓝牙基本概念。</p>
<p></p>
<p><span style="font-weight: bold;">1.1首先是应用层:</span></p>
<p>应用层Profiles:也就是说你建立的蓝牙应用任务,蓝牙任务实际上分为两类:</p>
<p>标准蓝牙任务规范profile(公有任务),非标准蓝牙任务规范profile(私有有任务)</p>
<p>标准蓝牙任务规范profile:指的是从蓝牙特别兴趣小组SIG的官方网站上可以看到已经发布的GATT规范列表,包括警告通知(alert notificantion),血压测量(blood pressure),心率(heart rate),电池(battery)等等,如上图所示。它们都是针对具体的低功耗蓝牙的应用实例来设计的。目前蓝牙技术联盟还在不断的制定新的规范,并且将陆续发布。详细内容大家可以参看蓝牙特别兴趣小组SIG的官方网站进行了解。在nrf52的SDK开发软件包里包含了一个文件夹,定义了这些标准应用规范,如下图2所示。</p>
<p>非标准蓝牙任务规范profile,也称为私有任务。是供应商自定义的任务,在蓝牙SIG小组内未定义的任务规范,比如本例所谈的蓝牙LED灯任务。</p>
<p>任务建立这章内容,主要就来讲解两种任务规范如何建立的,如何实现一个蓝牙应用。</p>
<p><span style="font-weight: bold;">1.2 控制器的控制层</span></p>
<p>如上图所示,实际内部分为三部分:</p>
<p>1:主机控制器(HCI),也称为设备管理器</p>
<p>设备管理器是基带中的一个功能模块,控制一般的蓝牙设备行为。它负责所有与数据无关的蓝牙系统操作,例如询问附件蓝牙设备是否存在,连接蓝牙设备,或者让本地的蓝牙设备可以被其他设备发现或者连接。</p>
<p>为了执行相应的功能,设备管理器要求通过基带的资源控制器访问传输媒介。同时,设备管理器还通过HCI命令提供本地设备行为的控制功能,例如管理设备的本地名称。存储链路密钥等。</p>
<p>2:链路层(LL):</p>
<p>链路层主要负责链路管理,链路控制。包括负责创建,维护和释放逻辑链路已经更新设备之间物理链路的相关参数。</p>
<p>3:物理层:</p>
<p>物理层模块负责从物理信道传输和接收信息数据包。在基带和物理层之间,一条控制路允许基带模块控制物理层的时隙和频率载波。同时,物理层模块向物理信道和基带发送和接收符合格式要求的数据流。</p>
<p><span style="font-weight: bold;">2主机主协议层详细说明:</span></p>
<p><span style="font-weight: bold;">2.1 通用访问规范(Generic Access Profile,GAP)</span></p>
<p>GAP是应用层能够直接访问BLE协议栈的最底层,它包括管理广播和连接事件的有关参数。GAP模块代表了所有蓝牙设备的共用基础功能,如传输,协议或者应用规范所使用的模式和访问过程。GAP的服务包括设备发现,连接方式,安全,认证,关联模型和服务发现等。<span style="font-weight: bold;">注意:</span>GAP的更多详细介绍见《Bluetooth Core Specification》(蓝牙核心规范)的第3卷C部分。</p>
<p><span style="font-weight: bold;">2.1.1 角色</span></p>
<p>为了创建和维持一个BLE连接,引入了“角色”这一概念。一个BLE设备不是集中器角色就是外围设备角色,这是根据是谁发起这个连接来确定的。集中器设备总是连接的发起者,而外围设备总是被连接者。集中器和外围设备的关系就像链路层中的主机和从机的概念。</p>
<p>除了集中器角色和外围设备角色,蓝牙核心规范还定义了观察者角色和广播者角色,观察者角色监听空中的事件(抓包器),广播者角色只是广播信息而不接收信息(ibeacon类似应用)。观察者角色和广播者角色都只广播而并不建立连接。它们在我们的这个应用中并不适用。</p>
<p><span style="font-weight: bold;">注意:</span>在一个连接的另一端的设备被称为对等设备,不管它是集中器还是外围设备。</p>
<p><span style="font-weight: bold;">2.1.2 广播</span></p>
<p>集中器能够与外围设备建立连接,外围设备必须处于广播状态,它每经过一个时间间隔发送一次广播数据包,这个时间间隔称为广播间隔,它的范围是20ms到10.24s。广播间隔影响建立连接的时间。</p>
<p>集中器发送一个连接请求来发起连接之前,必须接收到一个广播数据包,外围设备发送一个广播数据包之后一小段时间内只监听连接请求。</p>
<p>一个广播数据包最多能携带31字节的数据,它通常包含用户可读的名字、关于设备发送数据包的有关信息、用于表示此设备是否可被发现的标志等类似的标志。</p>
<p><span style="font-weight: bold;">2.1.3 扫描</span></p>
<p>扫描是集中器监听广播数据包和发送扫描请求的过程,它有2个定时参数需要特别注意:扫描窗口和扫描间隔。</p>
<p><span style="font-weight: bold;">2.1.4 发起</span></p>
<p>如果集中器想建立一个连接,当扫描监听到广播数据包后它将采用相同的过程:当要发起连接时,集中器接收到一个广播数据包之后将会发送一个连接请求。</p>
<p><span style="font-weight: bold;">2.1.5 连接</span></p>
<p>集中器和外围设备第一次交换数据定义为连接状态。在一个连接状态中,集中器将会在一个特定定义的间隔从外围设备请求数据,这个间隔称为连接间隔,它由集中器决定并应用于连接,但是外围设备可以发送连接参数更新请求给集中器。根据蓝牙核心规范,连接间隔必须在7.5ms到4s之间。</p>
<p><span style="font-weight: bold;">2.2 通用属性配置文件(Generic Attribute profile,GATT)</span></p>
<p>GATT层是传输真正数据所在的层。包括了一个数据传输和存储框架以及其基本操作。GTTA定义了两类角色:</p>
<p>服务器(server)和客户端(client),GATT角色无需和GAP角色绑定,但是可能由更高层的规范进行指定。下面来详细介绍在任务中的定义:</p>
<p><span style="font-weight: bold;">2.2.1角色</span></p>
<p>除了GAP定义了角色之外,BLE还定义了另外2种角色:GATT服务器和GATT客户端,它们完全独立于GAP的角色。提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为GATT客户端。</p>
<table style="table-layout: fixed;">
<tbody>
<tr>
<td>
<p>以SoC - Blinky应用为例,外围设备(带有LED)作为服务器,集中器作为客户端。</p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-weight: bold;">2.2.2 GATT</span><span style="font-weight: bold;">的规范</span><span style="font-weight: bold;">层</span><span style="font-weight: bold;">次</span></p>
<p>一个GATT服务器通过一个称为属性表的表格组织数据,这些数据就是用于真正发送的数据。</p>
<p><span style="font-weight: bold;">2.2.2.1 属性</span></p>
<p>一个属性包含句柄、UUID、值,句柄是属性在GATT表中的索引,在一个设备中每一个属性的句柄都是唯一的。UUID包含属性表中数据类型的信息,它是理解属性表中的值的每一个字节的意义的关键信息。在一个GATT表中可能有许多属性,这些属性能可能有相同的UUID。</p>
<p><span style="font-weight: bold;">2.2.2.2 特性</span></p>
<p>一个特性至少包含2个属性:一个属性用于声明,一个属性用于存放特性的值。</p>
<p>所有通过GATT服务传输的数据必须映射成一系列的特性,可以把特性中的这些数据看成是一个个捆绑起来的数据,每个特性就是一个自我包容而独立的数据点。例如,如果几块数据总是一起变化,那么我们可以把它们集中在一个特性里。</p>
<p>以SoC - Blinky 应用为例,外围设备(带有LED)作为服务器,集中器作为客户端。</p>
<p><span style="font-weight: bold;">2.2.2.3描述符</span></p>
<p>任何在特性中的属性不是定义为属性值就是为描述符。描述符是一个额外的属性以提供更多特性的信息,它提供一个人类可识别的特性描述的实例。</p>
<p><span style="font-weight: bold;">2.2.2.4服务</span></p>
<p>一个服务包含一个或多个特性,这些特性是逻辑上相关的集合体。一个服务配置文件文件可以包含一个或者多个服务,一个profile文件包含需要的服务的信息或者为对等设备如何交互的配置文件的选项信息。设备的GAP和GATT的角色都可能在数据的交换过程中改变,因此,这个<span style="font-weight: bold;">文件应该包含广播的种类、所使用的连接间隔、所需的安全等级等信息。</span><span style="font-weight: bold;">服务包含SIG规定的服务和私有定制服务。</span></p>
<p><span style="font-weight: bold;">2.</span><span style="font-weight: bold;">3</span><span style="font-weight: bold;">.</span><span style="font-weight: bold;">2</span><span style="font-weight: bold;"> 空中操作和性质</span></p>
<p>大部分的空中操作事件都是采用句柄来进行的,因为句柄能够唯一识别各个属性。如何使用特性依据它的性质,特性的性质包括:</p>
<p>l 写</p>
<p>l 没有回应的写</p>
<p>l 读</p>
<p>l 通知:客户端发给请求给服务器,不需要服务器回复一个响应</p>
<p>l 指示:服务器发给指示给客户端,需要客户端发一个确认给服务器</p>
<p>更多的性质在蓝牙规范中有明确的定义,但以上性质更为常用。</p>
<p><span style="font-weight: bold;">2.3.2.1 写和没有回应的写</span></p>
<p>写和没有回应的写允许GATT客户端写入一个值到GATT服务器的一个特性中。它们之间不同的地方在于没有回应的写事件没有任何应用层上的确认或回应。</p>
<p><span style="font-weight: bold;">2.3.2.2 读</span></p>
<p>读性质表明一个GATT客户端可以读取在GATT服务器中特性的值。</p>
<p><span style="font-weight: bold;">2.3.2.3 通知和指示</span></p>
<p>通知和指示性质允许GATT服务器在其某个特性改变的时候对GATT客户端进行提醒,通知和指示之间不同之处在于指示有应用层上的确认,而通知没有。</p>
<p></p>
<p>关于特性配置,EF32采用图像配置实现图形配置</p>
<p> </p>
页:
[1]