两个设备应用数据的通信是通过协议栈的GATT层实现的。

从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一:

GATT服务器: 它是为GATT客户端提供数据服务的设备

GATT客户端: 它是从GATT服务器读写应用数据的设备

GATT角色中的客户端和服务器的概念与链路层的主机和从机的概念完全独立,与GAP角色中的外设和集中器的概念也是完全独立的。主机既可以是GATT客户端,也可以是GATT服务器;从机既可以是GATT客户端,也可以是GATT服务器。

一个GATT服务器中可包含一个或多个GATT服务,GATT服务是完成特定功能的一系列数据的集合。在SimpleBLEPeripheral应用中有三个GATT服务。

1、强制的GAP服务。这一服务包含了设备的访问信息,如设备名,设备供应商和产品标识。它是协议栈的一部分,是BLE规范对每一个BLE设备的强制要求。

2、强制的GATT服务。这一服务包含了GATT服务器的信息,是协议栈的一部分,是BLE规范对每一个BLE设备的要求。

3、SimpleGATTProfile服务。这个服务包含了应用数据的信息,与应用数据的传递密切相关,可按照特定的格式编写自己的GATT服务

特性Characetristics是服务用到的值,以及其内容和配置信息。GATT定义了在BLE连接中发现、读取和写入属性的子过程。GATT服务器上的特性值极其内容和配置信息(称为描述符)存储在属性表中。属性表是一个数据库,包含了成为属性的小块数据,除了值本身,每个属性都包含了下列属性:

1、句柄。属性表中的地址,每个属性有唯一的句柄;

2、类型。表示数据代表的事物,通常是SIG规定或由用户自定义的UUID(UniversallyUnique Identifier);

3、权限。规定了GATT客户端设备对属性的访问权限,包括是否能访问和怎样访问。

GATT定义了若干GATT服务器和客户端之间通信的子过程:

1、读特性值。客户端设备请求读取句柄处的特性值,服务器将此值回应给客户端(假定属性有读取权限)。

2、使用特性的UUID读。客户端请求读基于一个特定类型的所有特征值,服务器将所有与指定类型匹配的特性的句柄和值返回给客户端设备(假定属性有读权限)。

3、读多个特性值。客户端一次请求中读取几个句柄的特性值,服务器将这些特性值回应给客户端(假定属性有读权限)。客户端需要知道如何解析这些不同的特性值数据。

4、读特性描述符。客户端请求读特定句柄处的特性描述符,服务器将特性描述符的值回应给客户端设备(假定属性有读权限)。

5、使用UUID发现特性。客户端通过特性的类型(UUID)来请求发现这个特性的句柄。服务器将这个特性的声明回应给客户端设别,其中包括特性值的句柄以及特性的权限。

6、写特性值。客户端设备请求向服务器特定的句柄处写入特性值,服务器将数据是否写入成功的信息返回给客户端。

7、写特性描述符。客户端设备请求向服务器特定的句柄处写入特性描述符,服务器将特性描述符是否写入成功的信息反馈给客户端。

8、特性值通知。服务器将一个特性值通知给客户端。客户端设备不需要向服务器请求这个数据,当客户端收到这个数据时,也不需要回应服务器,但需要注意的是,要想使能服务器通知,首先要配置好特性,profile中定义了什么时候服务器应该发送这个数据。

每个profile初始化其相应的服务并内在地通过设备的GATT服务器来注册服务。GATT服务器将整个服务加到属性表中,并为每个属性分配唯一句柄。

GATT属性表中有一些特殊的属性类型,由SIG定义:

GATT_PRIMARY_SERVICE_UUID表示新服务的起始和提供的服务类型

GATT_CHARACTER_UUID 特性声明,紧随其后的是GATT特性值

GATT_CLIENT_CHAR_CFG_UUID 代表特性描述符,与属性表中它前面最精的句柄处的特性值相关,允许GATT客户端设备使能特性值通知

GATT_CHAR_DESC_UUIS 代表特性描述符,与属性表中它前面最精句柄处的特性值相关,包含一个ASCII字符串,是对相关的特性的描述。

总结:GATT包含若干个Profile,一个Profile包含若干个Services,一个Service包含若干个Characteristics,一个Characteristic包含Properties字段和若干个Descriptor(可选)。

GATT调用下层的ATT,ATT的attirbute在GATT中表现为Characteristic。

备注:转载自http://blog.csdn.net/zhaoshuzhaoshu/article/details/52354057

GATT两个角色 服务器与客户端的更多相关文章

  1. GATT 服务器与客户端角色

    两个设备应用数据的通信是通过协议栈的GATT层实现的.从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端:  ...

  2. 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。

    一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...

  3. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  4. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  5. golang thrift 源码分析,服务器和客户端究竟是如何工作的

    首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...

  6. homework-05 服务器与客户端

    首先非常抱歉第三次和第四次作业我没交上来,不想找借口强调原因,但是这两次作业我一定会补上,到时候会@助教.谢谢 回到这次作业! 这次作业邹老师没说博客的格式,所以在这里就没有什么回答问题的东西了.这次 ...

  7. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  8. Linux系统编程(37)—— socket编程之UDP服务器与客户端

    典型的UDP客户端/服务器通讯过程: 编写UDP Client程序的步骤 1.初始化sockaddr_in结构的变量,并赋值.这里使用"8888"作为连接的服务程序的端口,从命令行 ...

  9. [转]关于HTTP服务器每个客户端2个连接的限制

    这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久.今天回公司无意中发现了一个帖子,终于真相大白了, 现 ...

随机推荐

  1. WordPress模板常用函数

    基本条件判断Tag is_home() : 是否为主页 is_single() : 是否为内容页(Post) is_page() : 是否为内容页(Page) is_category() : 是否为C ...

  2. jsp&Sevelet基础详解

    1.用scriptlet标签在jsp中嵌入java代码: (1).<%!...%>可以在里面定义全局变量,方法,类,一般写在<head>内 (2).<%%>定义的是 ...

  3. 20145334赵文豪 《Java程序设计》第1周学习总结

    20145334赵文豪 <Java程序设计>第1周学习总结 教材学习内容总结 第一周的学习在紧张中结束了,我们这周了解了各门课的基本内容与授课形式,在第一周java课程的的学习中我们学习了 ...

  4. BizTalk开发系列(三十)单向端口实现请求-响应

    BizTalk本质上是异步的消息处理引擎.BizTalk的请求与响应模式是基于异步之上的同步消息交换.消息引擎通过消息的扩展架构链接许 多异步消息,消息的相关集关联请求与响应消息.例如,客户端发送一个 ...

  5. php课程---简单的分页练习

    在写代码时,我们可以用类来使代码更加方便简洁,下面是一个简单的查询分页练习 源代码: <html> <head> <style type="text/css&q ...

  6. 最实用的IT类网站及工具大集合[转]

    1.聚合数据 大家在开发过程中,可能会用到各种各样的数据,想找一些接口来提供一些数据.比如天气预报查询,火车时刻表查询,彩票查询,身份证查询等等.有了这个接口,直接调用即可.各种各样的API接口满足你 ...

  7. ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置

    ThinkPHP3.2.3 的 URL_MODEL 包括普通模式(0).PATHINFO 模式(1).REWRITE 模式(2).兼容模式(3)等 4 种 URL 模式.在 Apache 下只要在配置 ...

  8. mysql单表多timestamp的current_timestamp设置问题

    一个表中出现多个timestamp并设置其中一个为current_timestamp的时候经常会遇到 1293 - Incorrect table definition; there can be o ...

  9. Linked List Cycle II || LeetCode

    /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * } ...

  10. C++笔记----构造函数与析构函数(二)

    构造函数是一种特殊的成员函数.在创建对象的时候自动调用,对对象的数据成员进行初始化. (1)栈区中创建的对象,在生存期结束的时候会自动调用析构函数. (2) 在堆上创建的对象,要由程序员显示调用del ...