苹果ANCS协议学习

转自:http://www.cnblogs.com/alexcai/p/4321514.html

综述

苹果通知中心(Apple Notification Center Service, ANCS)的目的是提供给蓝牙外设一种简单、方便的获取ios设备通知信息的方式。

依赖

ANCS的使用没有依赖,它是GATT的一个子集,任何一个实现了GATT client的设备可以方便的从ios设备获取通知信息。

传输注意事项

如果没有特殊说明,通过ANCS传输的数值均使用小端模式。

如果没有特殊说明,通过ANCS传输的字符串均使用UTF-8编码。

概念定义

l  ANCS:苹果通知中心服务

l  NP(Notification Provider):通知的产生者,一般是ios设备

l  NC(Notification Consumer):通知的消费者,一般是蓝牙设备

l  iOS notification:ios设备里出现的通知

l  GATT notification:GATT characteristic发送的通知

Service定义

ANCS使用了一个私有UUID作为其Service的UUID:

7905F431-B5CE-4E99-A40F-4B1E122D00D0

NP上只有一个ANCS实例,基于ios的机制,ANCS没有办法保证一直运行。

所以NC需要搜索并且监听(subscribe)Service Changed characteristic,以保证能够坚挺到所有通知。

(怎么做。。。。Service Changed characteristic是啥)

Characteristic类型

所涉及的characteristic

1、Notification Source:

UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD(notifiable)

基本通知源,通知一些计数的信息;

2、Control Point:

UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(writeablewithresponse)

控制器,用于向ios设备写入控制信息,例如读取详情;

3、Data Source:

UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(notifiable)

数据源,用于提供详细数据,在控制信息写入后通过此characteristic返回;

还有许多其他characteristic,不过只有Notification Source是强制的,其他的都是可选的。

Notification Source

通知信息更新时,从NP发给NC的消息。

有以下一些情况:

l  新的ios通知到来;

l  ios通知有改动;

l  ios通知移除;

l  EventID:消息类型,添加(0)、修改(1)、删除(2);

l  EventFlags:消息优先级,静默(1)、重要(2);

l  CategoryID:消息类型;

l  CategoryCount:消息计数;

l  NotificationUID:通知ID,可以通过此ID获取详情;

Notification的生命周期如下:

Get Notification Attributes

当NC希望从NP读取Notification的详细信息时,它需要向Control Point characteristic发送一些命令,格式如下:

l  CommandID:设为0;

l  NotificationUID:对应Notification Source中相同名字的字段;

l  AttributeIDs:NC希望读取的变量ID列表,有些变量可能需要跟一个16bit的数说明想要的最大长度;

NP接收到此命令后,会通过Data Source characteristic将结果返回(通过GATT Notification),所以你需要监听这个参数。此命令发出后对应的返回信息如下:

l  CommandID:为0;

l  NotificationUID:对应之前请求的UID;

l  AttributeList:查询结果列表,每一项的格式都是:ID/16bit  Length/Value,每个attribute都是一个字符串,其长度由Length指定,但是此字符串不是以NULL结尾。若找不到对应的Attribute,则Length为0;

* 如果返回的消息长度大于GATT最大传输长度(MTU),则其会被分割成多个分段。蓝牙设备必须将这些分段组装起来。当所有请求属性的内容都接收完成后,此过程才算完成;

Get App Attributes

此命令允许NC读取NP上安装app的特定属性,它需要向Control Point characteristic发送一些命令,格式如下:

l  CommandID:设成1;

l  AppIdentifier:App ID,这个字符串必须使用NULL结尾(“\0”吧);

l  AttributeIDs:希望获得属性的列表;

此命令的响应消息格式如下:

l  CommandID:为1;

l  AppIdentifier:App ID,与之前的请求ID对应;

l  AttributeList:属性值列表,每一个格式都是:ID/16-bit Length/Value,每个attribute都是一个字符串,其长度由Length指定,但是此字符串不是以NULL结尾。若找不到对应的Attribute,则Length为0;

* 关于分段以及传输结束的判断标准,与Get Notification Attributes一致;

Session(会话)

ANCS session 在NC订阅Notification Source之后开始,在取消订阅或者连接断开之后结束。由于ANCS不是一个完全同步的服务,它不会在会话中记录状态。所以,所有的NotificationUID以及AppIdentifier仅在某个特定的会话周期内有效。(换句话说,那些ID只是在会话后开始的计数,下次再连接重新计数)

当某个会话结束时,NC需要清空所有ID以及数据内容。当新的会话开始时,NP会尽量把现有的通知都发给NC。NC可以使用这些信息知道当前尚未处理的通知有哪些。

Attribute Fetching and Caching

我们建议,只在用户做出操作时才获取attribute。例如,一开始只是展示一个通知列表,然后在用户点击某一个后才查询详细的信息。

另外,我们建议在一次会话中建立一张App attribute的缓存表,这样可以避免重复获取一些常量attribute。

Error Codes

写入Control Point characteristic时,可能会有错误发生,错误码定义如下(在哪里返回错误码。。。同一次请求中么):

0xA0 : 未知命令,commandID非法;

0xA1 : 无效命令,命令的格式错误;

0xA2 : 无效参数,某一个参数(例如NotificationID无效)

如果有错误发生,就不会有Data Source返回。

时序图

下面展示了NP与NC之间的常见交互时序:

下面的图展示了获取详细信息的时序:

CategoryID

EventID

EventFlags

CommandID

NotificationAttributeID

AppAttributeID

实际实验之DataSource读取

主要是介绍一下读取的各个AttrID返回的都是啥:

电话:

AttrID

返回值

0(App ID)

com.apple.mobilephone

1(Title)

1 (326) 021-3971(电话号码,不过划分方式好怪。。。)

如果此号码存了名字,则是电话本中的名字

2(SubTitle)

如果此号码存了名字,则是mobile

3(Message)

Incoming Call

短信:

AttrID

返回值

0(App ID)

com.apple.MoileSMS

1(Title)

10698109555991

01051726663

+86 132-6021-3971

如果此号码存了名字,则是电话本中的名字

2(SubTitle)

3(Message)

短信的内容

微信:

AttrID

返回值

0(App ID)

com.tencent.xin

1(Title)

微信

2(SubTitle)

3(Message)

发信人:内容

其他应用的ID:

QQ:c o m . t e n c e n t . m q q

365:c o m . 3 6 5 r i l i . C o c o

Any.Do:c o m . a n y d o . A n y D O

系统提示:c o m . a p p l e . r e m i n d e r s

苹果ANCS协议学习【转】的更多相关文章

  1. 蓝牙接收苹果手机通知 ANCS协议分析

    蓝牙接收苹果手机通知 ANCS协议分析 转载,请注明出处:http://www.cnblogs.com/alexcai/p/4321514.html 综述 现在有许多蓝牙手表.手环都能接收苹果ipho ...

  2. TCP/IP协议学习(五) 基于C# Socket的C/S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  3. http协议学习系列

    深入理解HTTP协议(转)  http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列   1. 基础概念篇 1.1 介绍 H ...

  4. BGP协议学习总结

    BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...

  5. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  6. HTTP协议学习笔记(四)

    HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...

  7. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

  8. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...

  9. HTTP协议学习笔记(一)

    HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...

随机推荐

  1. mysql 访问不是本地数据库,给用户刷新了权限没有作用

    1.grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option; flus ...

  2. Leetcode题库——46.全排列

    @author: ZZQ @software: PyCharm @file: permute.py @time: 2018/11/15 19:42 要求:给定一个没有重复数字的序列,返回其所有可能的全 ...

  3. 微信小程序动画技巧

    用微信小程序自带的wx.createAnimation api可创建动画,该动画效果相比css写的动画更流畅. 栗子与用法,见官网:https://mp.weixin.qq.com/debug/wxa ...

  4. jmeter 获取执行脚本的路径

    需求:向jmeter.jmx 的路径下 写日志 : import org.apache.jmeter.services.FileServer; import com.bzj.utils.*; Stri ...

  5. shell 命令 if [ -d filename] 判断文件

    作者:曹毅涵  [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊 ...

  6. 2013成都网赛1003 hdu 4730 We Love MOE Girls

    题意:有一个字符串,若以"desu"结尾,则将末尾的"desu"替换为"nanodesu",否则在字符串末尾加上"nanodesu ...

  7. Python day5 --------递归、匿名函数、高阶函数、内置函数

    一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...

  8. MT【177】三个乘积和

    对任意 2 个 1,2,3,4,5,6 的全排列 $(a_1,a_2,a_3,a_4,a_5,a_6)$ 和 $(b_1,b_2,b_3,b_4,b_5,b_6)$,求$\displaystyle S ...

  9. MT【78】几张动态图

  10. 【刷题】BZOJ 4195 [Noi2015]程序自动分析

    Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或x ...