ANCS推送简介

总体原理 ANCS通过蓝牙BLE 4.0实现,仅支持iPhone 4S及以上且系统版本在IOS 7以上的手机,同时在外设端需要支持蓝牙4.0协议。

1、外设端进行广播,手机打开蓝牙,搜索外设,连接外设,之后进行绑定(这很重要,否则无法接收通知)

2、外设在连接建立后需要监听手机上的ANCS Service中的Notification Source

3、当有通知时,手机会给外设发消息,说明是哪个应用的通知

4、如果外设想进一步获取通知的详情,就往Control Point写控制信息,获取详情

5、详情会通过Data Source发过来


ANCS 服务

服务名: AppleNotification Center Service UUID:7905F431-B5CE-4E99-A40F-4B1E122D00D0

角色:

NC:Notification Consumer  (i410e)     NP:Notification Provider  (iOS设备)

服务特征值:

Notification Source:   UUID9FBF120D-6301-42D9-8C58-25E699A21DBD (notifiable) Control Point:  UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9 (writeable with response) Data Source: UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB (notifiable)   Note:访问该服务需要进行配对。 ANCS服务寻找完毕后,就可以打开监听通知功能了,这里需要注意的是,不能同一时间打开通知源特征Notification Source的通知和数据源特征Data Source的通知功能,所以这里可以开启了一个定时任务,让数据源特征在1s后再打来通知功能。

Notification Source

iOS设备(NP)用来通知i410e(NC)相应的通知;当i410e订阅(set Notify)该特征值后就可以接收通知消息(i410e已自动执行); 格式:

  Category count: iOS通知中当前category的数量;(例如当有两个未读邮件的时候,又收到一个邮件通知,categoryCount就为3); NotificationUID: 一个32位的唯一的数字ID,通过这个ID可以用来发送命令操作iOS通知。   

Control Point 和 Data Source

NC可以通过Control Point 对iOS通知执行操作;(获取通知内容或者删除通知等) NC通过对Control Point特征值写特殊的命令来实现获取通知内容等操作,如果执行成功,NP就会迅速的通过Data Source 特征值的发送通知内容到NC来响应该操作。 共三种:

  • 1.获取通知属性
该命令通过Control Point发出CommandID :固定为0;
NotificationUID: 特定通知的ID,通过NS 的通知获取。
AttributeIDs:NC希望读取的变量ID列表,有些变量可能需要跟一个16bit的数说明想要的最大长度;
复制代码

NP端响应格式:
该响应通过DS通知给到NC
复制代码

CommandID :固定为0;
NotificationID: 特定通知的ID,通过NS 的通知获取。
Attribute List:查询结果列表,每一项的格式都是:ID/16bit  Length/Value,每个attribute都是一个字符串,其长度由Length指定,但是此字符串不是以NULL结尾。若找不到对应的Attribute,则Length为0* 如果返回的消息长度大于GATT最大传输长度(MTU),则其会被分割成多个分段。蓝牙设备必须将这些分段组装起来。当所有请求属性的内容都接收完成后,此过程才算完成;
复制代码
  • 2.获取App属性

通过Control Point发出
CommandID :固定为1;
AppIdentifier:app的字符串标识符,以Null结束。
AttributeIDs:希望获得属性的列表;
复制代码

响应:
通过DS通知给到NC
复制代码

CommandID :固定为1;
AppIdentifier:app的字符串标识符,以Null结束。
Attribute List:属性值列表,每一个格式都是:ID/16-bit Length/Value,每个attribute都是一个字符串,其长度由Length指定,但是此字符串不是以NULL结尾。若找不到对应的Attribute,则Length为0;* 关于分段以及传输结束的判断标准,与Get Notification Attributes一致;
复制代码
  • 3.对通知执行操作
CommandID :固定为2;
NotificationUID: 特定通知的ID,通过NS 的通知获取。
ActionID:从通知源中拿到的可以操作的类型,“积极”操作或“消极”操作.
从iOS8之后,NP可以通知NC一些相关的动作(接通、挂断电话;删除通知等),NC可以根据NP的通知执行对应的操作。从NS的通知event flag中 EventFlagPositiveAction和EventFlagNegativeAction位可以判断是否能够执行对应的操作。
通过获取通知属性对应的属性IDNotificationAttributeIDPositiveActionLabel和NotificationAttributeIDNegativeActionLabel可以获取到对应的操作描述(接听/挂断、清楚)。
复制代码

错误码: 对Control Point执行操作的时候,收到的NP端未识别的操作的响应

I410e 返回有区别,以规范为准。 0xAA0, 0xAA1, 0xAA2, 0xAA3,

实际实验之DataSource读取
主要是介绍一下读取的各个AttrID返回的都是啥:0(App ID) ->com.apple.mobilephone1(Title) ->1 (326) 021-3971(电话号码,不过划分方式好怪。。。)如果此号码存了名字,则是电话本中的名字2(SubTitle) ->空 如果此号码存了名字,则是mobile3(Message) ->Incoming Call其他应用的ID:
短信: com.apple.MoileSMS
微信: com.tencent.xin
QQ: com.tencent.mqq
365: com.365rili.Coco
Any.Do:com.anydo.AnyDO
系统提示:com.apple.reminders
复制代码
下面以来电为例,解析期间收到的通知。来电时存在两种操作,不同的操作会收到不同的通知。
1、接听了电话(1)来了一同电话BLE设备将会收到一则通知,如下:0 1A 1 1 0 0 0 0EventID——0:表示为增加一条通知。EventFlags——1A:即0x1A,具有重要、具有“积极”操作、具有“消极”操作等特性。CategoryID——1:通知的分类为来电。CategoryCount——1:通知的个数为1
NotificationUID——0 0 0 0:即该通知的UID为0。(2)接听了来电接听来电后,会收到一条通知,如下:2 1A 1 0 0 0 0 0EventID——2:表示为删除一条通知。EventFlags——1A:即0x1A,具有重要、具有“积极”操作、具有“消极”操作等特性。CategoryID——1:通知的分类为来电。CategoryCount——0:通知的个数为0。
NotificationUID——0 0 0 0:即该通知的UID为0。解析出的意思是:删除来电通知。2、拒接了电话(1)来了一同电话BLE设备将会收到一则通知,如下:0 1A 1 1 0 0 0 0EventID——0:表示为增加一条通知。EventFlags——1A:即0x1A,具有重要、具有“积极”操作、具有“消极”操作等特性。CategoryID——1:通知的分类为来电。CategoryCount——1:通知的个数为1。
NotificationUID——0 0 0 0:即该通知的UID为0。解析出来的意思就是说:来了一通电话。(2)拒接了来电如拒接了来电,BLE设备将收到两则通知,如下:2 1A 1 0 0 0 0 00 18 2 1 1 0 0 0对第一条通知进行解析如下:EventID——2:表示为删除一条通知。EventFlags——1A:即0x1A,具有重要、具有“积极”操作、具有“消极”操作等特性。CategoryID——1:通知的分类为来电。CategoryCount——0:通知的个数为0。
NotificationUID——0 0 0 0:即该通知的UID为0。解析出的意思是:删除来电通知。对第二条通知进行解析如下:EventID——0:表示为新增一条通知。EventFlags——18:即0x1A,具有重要、具有“消极”操作等特性。CategoryID——2:通知的分类为未接来电。CategoryCount——1:通知的个数为1。
NotificationUID——1 0 0 0:即该通知的UID为1。翻译的意思是:一通未接来电。
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好记性不如烂笔头,记录几个常用的Linux操作

作者:老王Shell公共函数库Linux系统里有一些公共的Shell函数库可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目录下有很多脚本都用到了这个函数库,里面提供了很多有用的方法,比如:killproc…

用matlab简单电路模型,基于MATLAB的电路模型仿真应用

基于MATLAB的电路模型仿真应用实验指导书一、实验目的1、掌握采用M文件及SIMULINK对电路进行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模块集的调用、设置方法。3.进一步熟悉M脚本文件编写的方法和技巧。二、实验原理1、通过M文件实现电路仿真的一般仿真步骤为&…

春节期间小游戏同时在线人数最高达2800万人/小时

微信官方发布2018年春节期间微信数据报告:除夕至初五,总共有2,297亿条微信消息,28亿条微信朋友圈成功发出,音视频通话总时长175亿乙分钟。其中,90后用广的消息发送量占总量的42.5%,80后用户25.9%&#xff0…

C语言中* 和

&x是对x变量取地址,也就是返回的是x的地址。 int *i;这里面的*说明变量i是一个指针,存的是一个地址。 而 *i整体代表的是一个数值,例如可以int *i 5 这里整体的*i代表的是5,而i代表的是这个值存储的地址

餐馆的故事-浅析职责链模式

我们在餐馆吃饭的时候,一般都是在拿到菜单后,选择喜欢的菜,然后通知服务员。服务员会将我们的定单交给大厨,大厨可能会亲自去做这道菜,也可能安排给小厨来做,总之,我们不用担心他们没有人做菜&a…

JDBC数据对象存储

一:将查询的结果生成对象,储存在数组中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

个人工作13年的一些人生真实领悟

此文不定期的更新,想起来就写一些,我都忘了我曾经会过什么了。你可能会在许多的文章里看到类似的,但这些是我个人的真实体会。 1 技术服从于业务 此问题以前的一个文章提过,不再多说。 适用于大多数对技术的盲目崇拜者。在绝大…

matlab非齐次方程组的通解,用matlab求非齐次线性方程组的通解?

先向大家介绍一下非齐次线性方程组。所谓非齐次线性方程组就是方程组等号右边的常数项不全为零的线性方程组。全部等于零时,就称为齐次线性方程组。下面我们就讲解一下如何利用matlab快速求非齐次线性方程组的通解。工具/材料matlab电脑操作方法01线性方程组Axb的求…

Linux 终端仿真程序Putty

PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。较早的版本仅支持Windows平台,现在的版本中开始支持各类Unix平台。 用linux作为桌面系统,身为工程师很多时候需要通过Telnet、SSH协议进行远程管理,通过串口进行设备配置。Putty…

Mysql 数据库水平分表 存储过程

数据库存储量达到一定程度的时候,就需要进行分表以减轻检索的消耗。 常用的分表方式包括水平和垂直分表。本次进行的是按照uid进行水平分表。 ##分表思路: 水平分表平均的将数据按照特定方式分配到多个表中。理论上每个表的访问频次和数据量都是同一水平…

中国架构师,名符其实有多少?

先说一下读后感:我前段时间去过几个公司面试架构师,要求还是蛮高的,要熟悉大数据量处理,要熟悉高并发,要熟悉XX体系架构,要能在关键技术上实现突破。总之,架构错了,就啥都错了。呵呵…

粗识静态链表

为了弥补链表在内存分配上的不足,出现了静态链表这么一个折中的办法。静态链表比较类似于内存池,它会预先分配一个足够长的数组,之后链表节点都会保存在这个数组里,这样就不需要频繁的进行内存分配了。 当然,这个方法的…

php用date语句获取时间,关于php date()函数获取时间的设置和使用方法

date()函数是PHP自带的时间函数,可以获取当前服务器的时间echo date(Y-m-d H:i:s); //输出:2020-05-18 11:02:35date()函数中可以使用的字母含义:a-"am"(上午)或者"pm"(下午)A-"AM"或者"PM"Y-年,显示…

Django_form补充

问题1: 注册页面输入为空,报错:keyError:找不到passworddef clean(self): print("---",self.cleaned_data) # if self.cleaned_data["password"]self.cleaned_data["repeat_password"]: …

WF4.0:NativeActivity中的错误处理

备注:这篇文章的使用环境是.NET framework 4.0 RC 1 在WF4中创建native活动时,NativeActivity是非常强大的。其众多的功能之一是围绕错误处理。 调度子活动的时的基本错误处理。 当NativeActivity执行的时候,它是通过一个NativeActivityConte…

程序员提高建议之踏踏实实“扎马步”

踏踏实实“扎马步” 今天无意中看了“校长”的“程序员&司机”,其中谈到了关于程序员速成的问题。其实速成班毕业的“系统杀手”早已在遍布大江南北,只是在互联网时代,互联网的应用型软件生命周期越来越短,业务驱动主导…

c语言scanf返回值

1. scanf 函数是有返回值的,它的返回值可以分成三种情况1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量…

gpgga格式读取MATLAB,GPS编码格式及读取.doc

GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此…

Cadence 电源完整性仿真实践(二)

转载于:http://blog.csdn.net/wu20093346/article/details/38050917 通过以上步骤对每个平面进行了单节点分析并观测了响应曲线,接下来将观测平面对的目标阻抗是否满足要求,通过选择电容器的方法来减小含有电容器阻抗响应曲线中的反谐振波峰。在SigWave窗…

Johnson 全源最短路径算法

解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E VlogV),要求权值非负; Bellman-Ford 单源最短路径算法:时间复杂度为 O…