ANCS协议翻译
综述
苹果通知中心(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) |
发信人:内容 |
ANCS协议翻译的更多相关文章
- 蓝牙接收苹果手机通知 ANCS协议分析
蓝牙接收苹果手机通知 ANCS协议分析 转载,请注明出处:http://www.cnblogs.com/alexcai/p/4321514.html 综述 现在有许多蓝牙手表.手环都能接收苹果ipho ...
- 苹果ANCS协议学习【转】
苹果ANCS协议学习 转自:http://www.cnblogs.com/alexcai/p/4321514.html 综述 苹果通知中心(Apple Notification Center Serv ...
- http2协议翻译(转)
超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...
- PBAP 1.0协议翻译(Part1)
添加vCard3.0 Spec的链接- http://tools.ietf.org/html/rfc2425- http://tools.ietf.org/html/rfc2426 寻找最新的Spec ...
- 转)TNS协议--翻译自《The Oracle Hackers Handbook》
在开发源工具解决Oracle中的问题时,必须了解TNS协议.在努力理解TNS协议的时候,Oracle JDBC驱动程序(classes12.zip)会是一个很有用的资源TNS头. 每个TNS包都有一个 ...
- MQTT-SN协议乱翻之小结篇
前言 这里简单做一些小结和对比,针对前面的协议翻译部分,一阶段的学习完结. MQTT-SN VS MQTT MQTT-SN基于MQTT原有语义,但做了很多的调整.比如: 一个CONNECT消息被拆分为 ...
- OAuth2.0官方文档中文翻译
http://page.renren.com/699032478/note/708597990 (一)背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准,目前在国内还没有很靠谱的技术资 ...
- OSI七层协议模型、TCP/IP四层模型
OSI七层协议模型 TCP/IP四层模型 首先我们梳理一下每层模型的职责: 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据: 网络层:定义IP地址,确认主机所在的网络位置,并通过I ...
- Openfire阶段实践总结
从3月开始研究Openfire,其实就是要做一套IM系统,也正是这个原因才了解到Openfire.之前还真没想过有这么多的开源产品可以做IM,而且也没想到XMPP这个协议竟然如何强大.看来还是标准为先 ...
随机推荐
- jquery插件autocomplete
项目中有时会用到自动补全查询,就像Google搜索框.淘宝商品搜索功能,输入汉字或字母,则以该汉字或字母开头的相关条目会显示出来供用户选择, autocomplete插件就是完成这样的功能. < ...
- Oracle - 找不到原因的无效字符
当执行Oracle语句时,提示“无效字符”,而语句并无错误时,尝试把语句中的空格替换成半角状态的. 一般直接复制的语句会出现这种问题.
- 多个Activity和Intent(转)
根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...
- MVC 界面开发
1.什么是设计模式 mvc只是其中一种,对某一类具体问题,总结出来的一套最优的解决方案 1.MVC: 1.Model(模型) View(视图) Controller(控制器) 的缩写 M ...
- vs2010中自动实现抽象方法
由于刚接触vs,感官上虽然和eclipse差不多,但是一些快捷都不太相同,导致一开始使用时候非常不习惯. 不过刚开始嘛,写点相当小白的东西,也没有用到太多功能,也就暂时忽视,用的时候再说. 但是今天, ...
- TRIGGERS_监测系统_多表视图触发器—向原始数据报表中插入数据
Create Or Replace Trigger trg_view_report Instead Of Insert or update or delete on view_for_report ...
- requirejs学习之-- 初始化(一)
为了规范在项目中使用的javascript代码,我们使用了requirejs框架. 初始阶段,我们在按钮的点击事件中调用创建的模块,代码如下: function button_click() { _t ...
- php __FILE__,__CLASS__等魔术变量,及实例
今天突然看到几个自己不认识的魔术变量 不知道怎么用于是就上网查了一下,看到了这篇博客,写的真不错,希望自己以后也能学会这样总结 张映 发表于 2010-12-13 分类目录: php 标签:php, ...
- c#一个分页控件的例子
一.首先下载一个dll,地址:http://pan.baidu.com/share/link?shareid=1628211605&uk=1342867987 二.添加到项目中 三.添加引用 ...
- WPF中XAML中使用String.Format格式化字符串示例
货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0:C}}" /> // $123.46 货币格式,一位小数 ...