用于对接苹果通知中心BLE服务,NP指代iPhone或iPad,NC指代BLE终端设备。ANCS必需要安全配对才可以使用。
The Apple develop address for ANCS
目录
3.Control Point(控制命令)&Data Source(数据源)
1.ANCS服务特征
Characteristic | UUID | Authorization |
Notification Source | 9FBF120D-6301-42D9-8C58-25E699A21DBD | notifiable |
Control Point | 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9 | writeable with response |
Data Source | 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB | notifiable |
ANCS与AMS类似也是一个有着3个Characteristic Service,如上表描述:通知、命令、数据。
其中通知,由iOS发出iOS通知中心收到的所有通知信息,包括来电、社交、新闻之类。
其中命令、数据组合成一个交互Function,NC->NP端,由NC写control point发送指定cmdID,NP端收到并从数据端口发回响应数据。
ANCS的大致流程
IOS消息中心收到APP通知
NP -> NC: 通过NotificationSource给NC端发送一个简短的通知(包含通知事件类型、通知消息类型、通知UID)
NC -> NP: 通过ControlPoint给NP发送进一步获取通知详细信息的控制命令
NP -> NC: 通过DataSrouce响应NC的控制命令发送通知的具体信息
2.Notification Source(通知源)
用于发送notify形式的通知消息,手机NP -> NC产品,通知消息分三种类型:新增新通知消息、通知消息出现变化、通知消息被移除(包括手机端操作移除和产品端操作移除)。
一条通知消息的标准格式:
EventID | EventFlags | CategoryID | CategoryCount | NotificationUID |
1byte | 1 byte | 1 byte | 1 byte | 4 byte |
通知的事件类型:增加/删除/变更 | 一个位掩码,各设置位描述当前通知的重要性/通知时效性/积极性/消极性等 | 通知消息的所属类型,如来电/社交类/新闻类等 | 通知消息所属类型的消息累积数量 | iOS 消息中心对每个通知的唯一标识符 (UID)。 |
CategoryID :描述通知消息所属类型
CategoryIDOther | = 0, | 其它 |
CategoryIDIncomingCall | = 1, | 来电 |
CategoryIDMissedCall | = 2, | 未接来电 |
CategoryIDVoicemail | = 3, | 语音信息类 |
CategoryIDSocial | = 4, | 社交类消息 |
CategoryIDSchedule | = 5, | 日程类 |
CategoryIDEmail | = 6, | 电子邮件类 |
CategoryIDNews | = 7, | 新闻类消息 |
CategoryIDHealthAndFitness | = 8, | 健康及健身通知 |
CategoryIDBusinessAndFinance | = 9, | 商业及金融 |
CategoryIDLocation | = 10, | 本地消息 |
CategoryIDEntertainment | = 11, | 娱乐类消息 |
EventID:描述当前通知的属性是增、删、改
EventIDNotificationAdded | = 0, | 新增一条通知 |
EventIDNotificationModified | = 1, | 通知变更 |
EventIDNotificationRemoved | = 2, | 通知被移除 |
EventFlags:描述通知的重要性、活跃性等属性
| = (1 << 0), | |
| = (1 << 1), | 重要通知,如来电 |
| = (1 << 2), | 旧通知,在连接建立之前就已存在IOS消息中心 |
| = (1 << 3), | 通知具有积极的预定义动作,如来电通知,具有接听预定义动作 |
| = (1 << 4), | 通知具有消极的预定义动作,如来电通知,具有挂断预定义动作 |
Reserved EventFlags | = (1 << 5-7), | 保留 |
AppAttributeID:应用展示
| = 0, |
Reserved | = 1–255 |
3.Control Point(控制命令)&Data Source(数据源)
NC端收到NP端的简短通知之后,NC需要通过Control Point特征的Write属性向NP发送控制命令,进一步获取通知的具体信息如发通知的APP,通知的内容等等,NP则通过Data Source特征的Notify属性向NC回传响应数据(并不是所有命令都有回传)。
控制命令各字段意义
字段 | 意义 |
CommandID | 控制命令 |
NotificationID | 通知的UID,表明要获取哪条通知<通知源中的NotificationID字段> |
AttributeID | 通知属性的ID,表明要获取通知的哪条属性<通知属性类型,后文描述> |
Notificatioin AttributeID n max length | 通知信息最大长度,某些通知属性类型需要表明接收的最大长度<如通知内容,我仅显示60字节> |
控制命令:
CommandID:命令ID
CommandIDGetNotificationAttributes | = 0, | 获取通知的详细信息 |
CommandIDGetAppAttributes | = 1, | 获取发出通知的应用的属性,应用名 |
CommandIDPerformNotificationAction | = 2, | 执行通知操作 |
CommandIDGetNotificationAttributes获取通知的详细信息,命令格式(CMD = 0,NC->NP):
CommandID | NotificationUID | Attribute ID 1 | Attribute 1 max length | Attribute ID 2 | Attribute 2 max length | ... |
1byte | 4 byte | 1 byte | 2 byte | 1 byte | 2 byte | ... |
iOS分配 ID = 0 | 通知的UID | 属性ID | 数据长度 | 属性ID | 数据长度 | ... |
NC通过control point特征写属性向NP发送,理论一条命令一次可以发送获取多条通知属性,但通常只获取一条。
NP响应NC获取通知的详细信息,命令格式(CMD = 0,NP->NC):
CommandID | NotificationUID | Attribute ID 1 | Attribute 1 max length | Attribute Data 1 | Attribute ID 2 | Attribute 2 max length | Attribute Data 2 | ... |
1byte | 4 byte | 1 byte | 2 byte | N byte | 1 byte | 2 byte | N byte | ... |
iOS分配 ID = 0 | 通知的UID | 属性ID 1 | 数据长度 | 数据 | 属性ID 2 | 数据长度 | 数据 | ... |
NP通过Data Source特征notify属性向NC回传响应数据。
UID后是一个属性列表,由属性ID、数据长度、数据组成的列表。
当响应数据长度超过MTU时,一条消息会被分割成多条消息发送,NC端需要接收并组合再处理。
NotificationAttributeID(AttributeID):通知属性类型
有三种属性是需要加2个字节指定可接收数据的最大长度(Attribute 2 max length),其它不用,通常指定一个较大的数字即可,下表描述属性类型。
| = 0, | 发出通知的APP标识 |
| = 1, | 通知标题<+2bytes> |
| = 2, | 通知子标题,通常为空<+2bytes> |
| = 3, | 通知内容<+2bytes> |
| = 4, | 通知内容大小 |
| = 5, | 通知发出时间 |
| = 6, | 通知的积极属性具体意义,如来电通知,积极表明接听 |
| = 7, | 通知的消极属性具体意义,如来电通知,消极表明挂断 |
CommandIDGetAppAttributes获取应用属性命令格式(CMD = 1):
AppIdentifier:客户端想要了解的应用程序的字符串标识符。此字符串必须以 NULL 结尾。
AttributeIDs: NC 想要检索的属性列表。
用于获取指定应用的相关属性,如社交应用的消息内容等,它与获取通知属性命令不同的是它可以获取之前某条通知的具体内容,而通知属性命令是获取当前通知UID的通知属性内容。
获取应用属性命令的响应格式(CMD = 1):
AppIdentifier:以下属性对应的应用程序的字符串标识符。此字符串以 NULL 结尾。
AttributeList: AttributeIDs/16 位长度/属性元组的列表。属性始终是一个字符串,其字节长度在元组中提供,但不是以 NULL 结尾的。如果应用程序请求的属性为空或缺失,则其长度设置为0。元组的顺序始终与 Get App Attributes 命令的 AttributeID 的顺序相同。
CommandIDPerformNotificationAction执行通知操作命令格式(CMD = 2):
字节 | Name | 描述 |
1 | CommandID | 2 ( CommandIDPerformNotificationAction)。 |
2-5 | NotificationUID | 通知的 UID。 |
6 | ActionID | NC 希望在 iOS 通知上执行的操作<积极/消极>。 |
ActionID:通知活跃或消极
| = 0, | 控制iOS执行通知中的积极操作,如来电通知,执行接听动作 |
| = 1, | 控制iOS执行通知中的消极操作,如来电通知,执行拒接动作 |
执行通知操作命令发出后,iOS不会有任何响应数据回来,NC端可以在notification attbute特征notify属性端接收相应的执行结果变更通知<如来电接听,接听成功之后会再来一个接听通知>,如果有的话。
iOS通常只会响应它建议的操作(积极/消极)。
错误代码
写入控制点特性时,NC 可能会收到以下 ANCS 特定的错误代码:
未知命令( 0xA0):命令ID 未被 NP 识别。
无效命令( 0xA1):命令格式不正确。
无效参数( 0xA2):参数之一(例如 NotificationUID)未引用 NP 上的现有对象。
操作失败( 0xA3):未执行操作。
如果 NP 回复错误,则不会针对相应命令的数据源特性生成任何 GATT 通知。