【BLE】ANCS(Apple Notification Center Service)

news2024/12/21 20:09:37

目录

  • 1. 前言
    • 1.1 名词解释
    • 1.2 ANCS概述
  • 2. ANCS的特征
    • 2.1 通知源
    • 2.2 控制点和数据源
    • 2.3 获取通知属性
    • 2.4 获取应用属性
    • 2.5 执行通知操作
    • 2.6 通知操作
  • 3. 更多详情参考

1. 前言

1.1 名词解释

NP(Notification Provider):消息提供者,指的是ANCS服务的生产者,即IOS设备。
NC(Nofitication Consumer):消息接受者,指的是ANCS服务的客户端,即周边BLE设备。

1.2 ANCS概述

Apple Notification Center Service 是一项首要服务,其服务UUID为7905F431-B5CE-4E99-A40F-4B1E122D00D0。一个 NP 上可能只存在一个 ANCS 实例。由于 iOS 的性质,不能保证 ANCS 始终存在。因此,NC 应该寻找并订阅 GATT 服务的 Service Changed 特性,以便随时监控 ANCS 的潜在发布和取消发布。

2. ANCS的特征

ANCS具备三个特征:

  1. 通知源(强制): UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD(可通知)
  2. 控制点(可选): UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(可写响应)
  3. 数据源(可选): UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(可通知)

2.1 通知源

  1. NP上新的IOS通知的到来
  2. 修改NP上的IOS通知
  3. 删除NP上的IOS通知

数据传输格式:
数据源通知数据格式
数据格式:

  1. EventID:通知附件是添加、修改或删除了给定的IOS通知。
  2. EventFlags:一个位掩码,其设置位通过IOS通知通知NC。例如,如果 iOS 通知被认为“重要”,则 NC 可能希望显示更具侵略性的用户界面 (UI) 以确保正确提醒用户。该字段的枚举位在EventFlags中定义。
  3. CategoryID:一个数值,提供可以将 iOS 通知归入的类别。NP 将尽最大努力为每个 iOS 通知提供准确的类别。该字段的枚举值在CategoryID Values中定义。
  4. CategoryCount:给定类别中当前活跃的 iOS 通知数。例如,如果用户的电子邮件收件箱中有两封未读电子邮件,并且新电子邮件被推送到用户的 iOS 设备,则 CategoryCount 的值为 3。
  5. NotificationUID:一个 32 位数值,是 iOS 通知的唯一标识符 (UID)。此值可用作发送到控制点特征以与 iOS 通知交互的命令的句柄。

NORDIC的相关代码描述:

/**@brief iOS notification structure. */
typedef struct
{
    uint32_t                        notif_uid;       //!< Notification UID.
    ble_ancs_c_evt_id_values_t      evt_id;          //!< Whether the notification was added, removed, or modified.
    ble_ancs_c_notif_flags_t        evt_flags;       //!< Bitmask to signal if a special condition applies to the notification, for example, "Silent" or "Important".
    ble_ancs_c_category_id_val_t    category_id;     //!< Classification of the notification type, for example, email or location.
    uint8_t                         category_count;  //!< Current number of active notifications for this category ID.
} ble_ancs_c_evt_notif_t;

/**@brief Event IDs for iOS notifications. */
typedef enum
{
    BLE_ANCS_EVENT_ID_NOTIFICATION_ADDED,     /**< The iOS notification was added. */
    BLE_ANCS_EVENT_ID_NOTIFICATION_MODIFIED,  /**< The iOS notification was modified. */
    BLE_ANCS_EVENT_ID_NOTIFICATION_REMOVED    /**< The iOS notification was removed. */
} ble_ancs_c_evt_id_values_t;

/**@brief Flags for iOS notifications. */
typedef struct
{
    uint8_t silent          : 1;  //!< If this flag is set, the notification has a low priority.
    uint8_t important       : 1;  //!< If this flag is set, the notification has a high priority.
    uint8_t pre_existing    : 1;  //!< If this flag is set, the notification is pre-existing.
    uint8_t positive_action : 1;  //!< If this flag is set, the notification has a positive action that can be taken.
    uint8_t negative_action : 1;  //!< If this flag is set, the notification has a negative action that can be taken.
} ble_ancs_c_notif_flags_t;

/**@brief Category IDs for iOS notifications. */
typedef enum
{
    BLE_ANCS_CATEGORY_ID_OTHER,                /**< The iOS notification belongs to the "other" category.  */
    BLE_ANCS_CATEGORY_ID_INCOMING_CALL,        /**< The iOS notification belongs to the "Incoming Call" category. */
    BLE_ANCS_CATEGORY_ID_MISSED_CALL,          /**< The iOS notification belongs to the "Missed Call" category. */
    BLE_ANCS_CATEGORY_ID_VOICE_MAIL,           /**< The iOS notification belongs to the "Voice Mail" category. */
    BLE_ANCS_CATEGORY_ID_SOCIAL,               /**< The iOS notification belongs to the "Social" category. */
    BLE_ANCS_CATEGORY_ID_SCHEDULE,             /**< The iOS notification belongs to the "Schedule" category. */
    BLE_ANCS_CATEGORY_ID_EMAIL,                /**< The iOS notification belongs to the "E-mail" category. */
    BLE_ANCS_CATEGORY_ID_NEWS,                 /**< The iOS notification belongs to the "News" category. */
    BLE_ANCS_CATEGORY_ID_HEALTH_AND_FITNESS,   /**< The iOS notification belongs to the "Health and Fitness" category. */
    BLE_ANCS_CATEGORY_ID_BUSINESS_AND_FINANCE, /**< The iOS notification belongs to the "Buisness and Finance" category. */
    BLE_ANCS_CATEGORY_ID_LOCATION,             /**< The iOS notification belongs to the "Location" category. */
    BLE_ANCS_CATEGORY_ID_ENTERTAINMENT         /**< The iOS notification belongs to the "Entertainment" category. */
} ble_ancs_c_category_id_val_t;

2.2 控制点和数据源

NC 可能想要与 iOS 通知进行交互。它可能想要检索关于它的更多信息,包括它的内容,或者它可能想要对其执行操作。这些属性的检索是通过控制点和数据源特性执行的。

NC 可以通过将特定命令写入控制点特性来发出请求以检索有关 iOS 通知的更多信息。如果写入控制点特征成功,NP 将通过数据源特征上的 GATT 通知流立即响应请求。

2.3 获取通知属性

获取通知属性命令允许 NC 检索特定 iOS 通知的属性。

命令格式如下:
在这里插入图片描述

  • CommandID:应设置为0(CommandIDGetNotificationAttributes)。
  • NotificationUID: 32 位数值,表示客户端需要其信息的 iOS 通知的 UID。
  • AttributeIDs: NC 想要检索的属性列表。某些属性可能需要后跟一个 16 位长度的参数,该参数指定 NC 想要检索的属性的最大字节数。

响应格式如下:
在这里插入图片描述

  • 命令ID:设置为0( CommandIDGetNotificationAttributes)。
  • NotificationUID: 32位数值,是以下属性对应的iOS通知的UID。
  • AttributeList: AttributeIDs/16 位长度/Attribute 元组的列表。属性始终是一个字符串,其长度(以字节为单位)在元组中提供,但不以 NULL 结尾。如果 iOS 通知请求的属性为空或缺失,则其长度设置为0. 元组的顺序始终与获取通知属性命令的 AttributeID 的顺序相同。
    如果响应大于协商的 GATT 最大传输单元 (MTU),则它会被 NP 分成多个片段。NC 必须通过拼接每个片段来重组响应。当收到每个请求属性的完整元组时,响应完成。

2.4 获取应用属性

获取应用程序属性命令允许 NC 检索安装在 NP 上的特定应用程序的属性。

命令格式如下:
在这里插入图片描述

  • CommandID:应设置为1( CommandIDGetAppAttributes)。
  • AppIdentifier:客户端想要了解其信息的应用程序的字符串标识符。此字符串必须以 NULL 结尾。
  • AttributeIDs:NC 想要检索的属性列表。

响应格式如下:
在这里插入图片描述

  • 命令ID:设置为1( CommandIDGetAppAttributes)。
  • AppIdentifier:以下属性对应的应用的字符串标识。此字符串以 NULL 结尾。
  • AttributeList: AttributeIDs/16 位长度/Attribute 元组的列表。属性始终是一个字符串,其长度(以字节为单位)在元组中提供,但不以 NULL 结尾。如果应用程序请求的属性为空或缺失,则其长度设置为0。元组始终与 Get App Attributes 命令的 AttributeIDs 的顺序相同。

和Get Notification Attributes 命令的响应一样,如果对 Get App Attributes 命令的响应大于协商的 GATT 最大传输单元 (MTU),它会被 NP 分成多个片段。NC 必须通过拼接每个片段来重组响应。当收到每个请求属性的完整元组时,响应完成。

2.5 执行通知操作

Perform Notification Action 命令允许 NC 对特定的 iOS 通知执行预定的操作。执行通知操作命令包含以下字段:
在这里插入图片描述
发出此命令时,无论成功与否,都不会在数据源特征上生成任何数据。

2.6 通知操作

从 iOS 8.0 开始,NP 可以通知 NC 与 iOS 通知相关的潜在操作。然后,NC 可以代表用户请求 NP 执行与特定 iOS 通知关联的操作。

EventFlags通过检测通知源特性生成的 GATT 通知字段中设置标志的存在,通知 NC 在 iOS 通知上存在可执行操作:

  • EventFlagPositiveAction:存在一个积极的行动,并与这个 iOS 通知相关联。
  • EventFlagNegativeAction:存在否定操作并与此 iOS 通知相关联。

NP 代表 NC 执行的实际操作由 NP 确定,并根据执行它们的 iOS 通知而有所不同。例如,对来电通知执行积极操作可能会接听它,而执行消极操作可能会拒绝它。

NC 不得预先假设或尝试猜测对 iOS 通知执行的确切操作,因为这些操作基于它无法获得的信息,以及其他因素,例如 NP 实现的 ANCS 版本。NP 保证积极和消极的行动与不会让用户感到惊讶的结果相关联。

如果出现在 iOS 通知中,正面和负面操作可能会向用户表示为复选标记、X 标记或通常与确认和取消相关的颜色(例如绿色和红色)。

NC 可以通过检索 iOS 8.0 中引入的新通知属性来检索简要描述与 iOS 通知关联的实际操作的标签:

  • NotificationAttributeIDPositiveActionLabel: 用于描述可以对 iOS 通知执行的积极操作的标签
  • NotificationAttributeIDNegativeActionLabel:用于描述可以对 iOS 通知执行的否定操作的标签。

3. 更多详情参考

官方描述地址,了解更多详情请点击。

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

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

相关文章

【JavaSE】入门概述(1~41)

1.Java视频及配套资料下载指南 2.Java基础学习导读 Java语言的三个层面 基本语法&#xff1a;变量、运算符、流程控制、数组面向对象&#xff1a;把数据及对数据的操作方法放在一起&#xff0c;作为一个相互依存的整体——对象高级应用&#xff1a;多线程、集合、IO流、网络…

性能怪兽-Nginx常用配置指北

目录 安装 Nginx操作命令 https反向代理 负载均衡 轮询 加权轮询 最少连接 加权最少连接 IP Hash 普通 Hash 动静分离 资源压缩 缓冲区 缓存机制 解决跨域 防盗链设计 配置SLL证书 性能优化 打开长连接配置 开启零拷贝技术 开启无延迟或多包共发机制 调整W…

Python连接Liunx中mysql数据库-增删改查

上一篇文章已经讲解了如何连接liunx中的mysql数据库&#xff0c;如果没有连接好数据库的话&#xff0c;可以看这一篇文章 增删改查Mysql中查询操作1.创建游标2.定义一个sql的查询语句3.调用游标内的sql语句执行操作4.打印出查询结果5.完整代码6.指定查询Mysql中新增操作1.单条数…

jupyter 常用记录

安装windows环境下 运行cmd 然后&#xff1a;在命令提示窗口输入pip install jupyter,然后回车&#xff1b;完成后运行 jupyter notebook 前言 提起jupyter notebook&#xff0c;应该很多学习过Python的同学都不陌生。虽然用jupyter notebook的同学相对较少&#xff0c;但是提…

Java多级缓存是为了解决什么的?

前言 提到缓存&#xff0c;想必每一位软件工程师都不陌生&#xff0c;它是目前架构设计中提高性能最直接的方式。 缓存技术存在于应用场景的方方面面。从网站提高性能的角度分析&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服务器&#xff0c;还可以放在应用…

使用JINJA2模板部署自定义文件(RH294)

在ansible中有许多模板可以用于修改现有的文件比如—— lineinfile和blockinfile但是&#xff01;我们还有一种更加便捷而且牛皮的方法为其构建模板在部署该文件是自动为受管主机自定义次模板配置文件而这些模板中非常有名的就是 JINJA2ansible将Jinja2模板系统用于模板文件 并…

Java设计模式-职责链模式Chain of Responsibility

介绍 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;, 又叫 责任链模式&#xff0c;为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理…

C语言#include的用法详解

#include叫做文件包含命令&#xff0c;用来引入对应的头文件&#xff08;.h文件&#xff09;。#include 也是C语言预处理命令的一种。#include 的处理过程很简单&#xff0c;就是将头文件的内容插入到该命令所在的位置&#xff0c;从而把头文件和当前源文件连接成一个源文件&am…

Oracle数据库故障处理-存储单块读hang分析处理

1 故障描述 2023年1月27日下午接到业务反馈数据库存在大量的锁表阻塞信息&#xff0c;并且业务的页面以及数据库的一些查询均处于阻塞状态&#xff0c;简单的查询sql也需要查询很长时间且未返回结果,数据库hang状态。 2 故障原因分析 2.1 数据库层面分析 接到业务反馈后&am…

如果放在几年前,无法想到互联网会蜕变成今天这样一副模样

如果放在几年前&#xff0c;你是万万无法想到互联网会蜕变成今天这样一副模样。尽管如此&#xff0c;这样一种蜕变却在真实地发生着。不知道你有没有发现就连前两年火爆的短视频人们都懒得刷了。所有的这一切都在告诉我们&#xff0c;互联网正在发生一场深刻而又彻底的嬗变。如…

SQL Server数据库版本总结

一、为什么要写这篇文章 之所以专门写一篇文章来整理归纳SQL Server各个版本的功能区别&#xff0c;是因为遇到过两次真实的客户案例&#xff0c;因为数据库版本选取不当&#xff0c;导致生产系统宕机的情况。 案例一 某客户安装了 32位 版本的SQL Server 2008 R2 数据库&…

人工智能轨道交通行业周刊-第31期(2023.1.16-1.29)

本期关键词&#xff1a;磁悬浮原理、小米石、通信铁塔维护、桥隧工巡检、地方铁路十大新闻 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路…

element 日期组件实现只能选择小时或者只能选择小时、分钟

前言 在使用 element 框架时&#xff0c;总是会有一些满足不了现有项目需求的问题&#xff0c;这个时候就需要我们对 element 的组件进行改造&#xff0c;最近有一个需求就是要求日期组件只能选择年月日时&#xff0c;不要分钟和秒&#xff0c;找了一圈&#xff0c;发现 elemen…

【Markdown】CSDN 的 Markdown 编辑器锚点使用-进阶篇

1. 原始 Markdown 代码 1.1 “目录”元素 [TOC](8.6 InnoDB ClusterSet 的状态和拓扑)1.2 “1号标题-1”元素 # InnoDB ClusterSet 状态1.3 “1号标题-2”元素 <h1> <a id"innodb-clusterset-topology">InnoDB ClusterSet 拓扑</a> </h1>…

压缩包文件如何设置和删除密码

压缩软件除了可以压缩和解压文件&#xff0c;还可以作为加密软件&#xff0c;给压缩的文件设置密码来保护文件。 今天就来看下两个常用的压缩软件是如何设置和删除密码的。 先说说WinRAR这个最常用的压缩软件&#xff0c;它可以根据不同的需求设置单次密码和永久自动加密。 …

2023年度国家自然科学基金项目开放申报及注意事项

根据国家自然科学基金委员会发布的通告&#xff0c;2023年国家自然科学基金项目申报系统已于1月15日开放。知识人网整理了主要内容&#xff0c;提醒申报者注意。一、日程节点&#xff1a;1.集中接收工作于2023年3月1日开始&#xff0c;3月20日16时截止。2.申请人于2023年1月15日…

笔记本电脑拆机并更换固态硬盘的方法

本文介绍为笔记本电脑拆机、更换固态硬盘的具体方法。 在文章Win10电脑出现No Bootable Device且无法开机或开机后蓝屏无限重启的多个解决方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/122923896&#xff09;中我们提到&#xff0c;一些由电脑硬盘…

高频算法:删除有序数组中的重复项

今天要讲的算法题是LeetCode上的第26题&#xff0c;先贴题目&#xff1a; 首先题目中给出了几个比较关键的条件&#xff0c;首先就是升序排列的数组&#xff0c;这样的话至少我们不需要进行排序的操作&#xff0c;直接从前向后进行比较&#xff0c;我们就能知道数组中的哪些元…

基于SpringBoot、Mybatis-Generator实现数据库表自动生成全套后台代码

背景我们在日常开发过程&#xff0c;大多数都是使用主流MVC架构&#xff0c;如下图所示。从图中可以看出&#xff0c;我们主要的业务代码基本都是从Controller->Service->Dao/Mapper&#xff0c;由Dao/Mapper则通过Mybatis连接数据库连接池的方式与数据库进行指令数据交互…

实现简单的栈与队列

前言&#xff1a;前面已经详细地介绍了基本的顺序表和链表&#xff0c;这次要介绍的是数据结构中的栈与队列。从本质上来说&#xff0c;二者是特殊的线性表&#xff0c;是依赖于顺序表或链表来实现的&#xff0c;所以只要能够很好地掌握顺序表和链表&#xff0c;再了解清楚栈与…