Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3975793
  • 博文数量: 408
  • 博客积分: 10227
  • 博客等级: 上将
  • 技术积分: 9820
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-17 21:48
个人简介

非淡泊无以明志,非宁静无以致远

文章存档

2022年(1)

2021年(1)

2020年(2)

2019年(5)

2018年(4)

2017年(3)

2016年(24)

2015年(8)

2014年(7)

2013年(3)

2012年(1)

2011年(23)

2010年(179)

2009年(147)

分类: Android平台

2017-07-05 09:56:35

通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以充当Server,又可以充当Client;从设备亦然 

Server首先将一个服务按“属性/句柄/数值/描述”这种格式予以组织,然后调用API函数GATTServApp_RegisterService将服务数据进行注册。举个实例吧,设提供一个电池电量服务字节,它允许Client读取,数据为一个8比特无符号数(0~100%),它的组织如下:02 25 00 19 2A, 这5个数据(小端格式)分别是:0x02=只读属性,0x0025=句柄;0x2A19=服务UUID。 

句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查明该书在哪一层楼,哪个房间,这就是该书的Handle

大致分三类:

1. 读取服务的值,需要知道服务的UUID或者Handle;

2. 写服务的值,需要知道服务的Handle;

3. 写服务描述符,需要知道该Descriptor的Handle。 

根据服务的UUID调用API函数GATT_ReadUsingCharUUID 协议栈会返回该服务的Handle。特别注意的是,一个服务的DescriptorHandle总是该服务的Handle+1如电池电量服务的Handle是0x0025,那么它的Descriptor的Handle是0x0026 

蓝牙通信中,Server不能直接访问(读/写)Client,但是可以通知(NotificationClient,通知的前提是Client通过写Descriptor使能通知功能。例如,某Server发现电池电量已经低于安全阀值,它可以调用GATT_Notification通知所有已连接的Client,但是Client接收后如何处理是它自己的事情。 

阅读(9301) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~