那么协议栈是什么呢?协议栈是指网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议.
使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL等),运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等),物理层.–奇怪的网站
协议栈(英语:Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。–百度百科
从蓝牙mesh的网络拓扑中得知,一个蓝牙mesh设备分为配网前和配网后,配网前我们称为未配网设备,配网后成为已配网设备(手动狗头 ,事实上大家都称他为节点(node).
从未配网到节点这个过程我们成为配网流程,配网流程使用的是一套mesh协议栈,称作配网协议。
上图是配网协议的结构图
图中显而易见结构被分为3层。
首先最底下的是承载层(bearer)
承载层定义网络消息如何在节点之间传输。定义了两种承担者,广告承担者和关贸总协定承担者。将来可能会定义更多的承担者。
基本是以BLE广播、GATT连接实现的数据交互
GATT:
GATT 的全名是 Generic Attribute Profile(姑且翻译成:普通属性协议)。
BLE技术是基于GATT进行通信的,GATT是一种属性传输协议,简单的讲可以认为是一种属性传输的应用层协议。
GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。
详细介绍 GATT 之前,需要了解 GAP(Generic Access Profile),它在用来控制设备连接和广播。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如 Beacon (信标)设备就只是向外广播,不支持连接,小米手环等设备就可以与中心设备连接。
GAP:
· 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
· 中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。
它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service, Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用 16 bit ID 作为每一项的索引。
GATT 连接,必需先经过 GAP 协议。蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。我们在 Android 开发中,可以直接使用设备的 MAC 地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过 GAP。
GATT 连接是独占的、私有的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播。
一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设。GAP 通信是单向的。如果你要让两个设备外设能通信,就只能通过中心设备中转。
一、GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应。
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。
二、
GATT C/S
对GATT有了初步的了解,我们知道GATT是一种典型的C/S模式,既然是C/S那么我们就有必要对Server和client进行区分。
** GATT server ** vs. ** GATT client **。这两种角色存在的阶段则是建立连接之后,根据对话地位的不同进行区分的,很容易理解的是,保有数据的那一方我们称之为GATT server,访问数据的那一方我们称之为GATT client。
这和我们之前提到的设备角色是不同层面的概念,有必要加以区分,我们还是用一个简单的例子进行说明:
以手机和手表的例子来进行说明,手机和手机建立连接之前,我们都是用手机的蓝牙搜索功能去搜索手表的蓝牙设备,这个过程中很明显手表在进行BLE广播以便其他设备知道自己的存在,它在这个过程中就是peripheral的角色,而手机负责扫描的任务,自然扮演的就是Center了;两者建立了GATT连接后,当手机需要从手表中读取步数等传感器数据时,两者交互的数据是保存在手表中的,因此此时手表就是GATT server的角色,自然手机就作为GATT client;而当手表想要从手机读取短信电话等信息室,数据的保有者又变成了手机,所以此时手机就是server ,而手表则是client。
GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的。
profiles可以看作是services的集合 而Services又是Characteristics的逻辑集合
Characteristic是最小的数据逻辑单元,value、descriptor中存储数据的解析由Server的工程师决定,并无规范,双发按照约定开发。
第二张图可能没那么准确(缺少了profiles),但又补充了value、Descriptor的概念
每个GATT由完成不同功能的Service组成;
每个Service由不同的Characteristic组成;
每个Characteristic由一个value和一个或者多个Descriptor组成;
Service、Characteristic相当于标签(Service相当于他的类别,Characteristic相当于它的名字),而value才真正的包含数据,Descriptor是对这个value进行的说明和描述,当然我们可以从不同角度来描述和说明,因此可以有多个Descriptor.
Service/Characteristic均有一个唯一的UUID标识,UUID既有16位的也有128位的,我们需要了解的是16位的UUID是经过蓝牙组织认证的,是需要购买的,当然也有一些通用的16位UUID。
下面我们来举一个简单的例子进行说明:
常见的小米手环是一个BLE设备,(假设)它包含三个Service,分别是提供设备信息的Service、提供步数的Service、检测心率的Service;
而设备信息的service中包含的characteristic包括厂商信息、硬件信息、版本信息等;而心率Service则包括心率characteristic等,而心率characteristic中的value则真正的包含心率的数据,而descriptor则是对该value的描述说明,比如value的单位啊,描述啊,权限啊等。
实际上,和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。
有很多官方(指蓝牙SIG)的Profiles, Services 和 Characteristics,当然这些也能自创。
0223总结:
蓝牙mesh网的协议栈的学习内容很多,涉及很多专业名词
目前已经将mesh协议栈的第一部分:配网协议中的承载层的相关信息收集完毕。
学习了GATT连接的拓扑、通信模型、结构,还有一些特性。
以上文章在理解的基础上做各个参考文章的摘抄,概念很多,逻辑不算分层很明确和条理清晰
需要后期翻看、熟悉概念以及相关逻辑。
下一次的学习计划:、
参考文章:
[简书蓝牙mesh协议栈]:https://www.jianshu.com/p/e9cc18e52f30
[csdn讲解GATT]:https://blog.csdn.net/gmq_syy/article/details/70231047
[简书讲解GATT]:https://www.jianshu.com/p/5cd5c6d4a7d2