BLE芯片PHY6222的ANCS代码解读

news/2025/1/13 6:02:50/

BLE芯片PHY6222的ANCS代码解读

  • ANCS是什么
  • 实现原理
  • PHY6222软件实现框架
  • 要获取的详细信息
  • 开通知源
  • 通知源的解析
  • 数据源的解析

ANCS是什么

ANCS(苹果通知中心, Apple Notification Center Service)的目的是提供给蓝牙外设通过蓝牙设备上的GATT 客户端发现IOS上的ANCS服务,实现一种简单、方便的获取ios设备通知信息的方式。使得蓝牙手环、手表可以收到苹果手机的来电、短信及各种应用的通知信息。

实现原理

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

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

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

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

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

PHY6222软件实现框架

在这里插入图片描述

要获取的详细信息

在这里插入图片描述

  ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_APP_IDENTIFIER,m_attr_appid,ANCS_ATTR_DATA_MAX);//ble_ancs_attr_add(BLE_ANCS_APP_ATTR_ID_DISPLAY_NAME,m_attr_disp_name,sizeof(m_attr_disp_name));ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_TITLE,m_attr_title,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_MESSAGE,m_attr_message,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_SUBTITLE,m_attr_subtitle,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_MESSAGE_SIZE,m_attr_message_size,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_DATE,m_attr_date,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_POSITIVE_ACTION_LABEL,m_attr_posaction,ANCS_ATTR_DATA_MAX);ble_ancs_attr_add(BLE_ANCS_NOTIF_ATTR_ID_NEGATIVE_ACTION_LABEL,m_attr_negaction,ANCS_ATTR_DATA_MAX);

开通知源

    case ANCS_ENABLE_NS_CCCD:{bStatus_t ret;if (pMsg->method == ATT_FIND_INFO_RSP && (pMsg->hdr.status == bleProcedureComplete)){ret = Ancs_CCCDConfig(pservie->chars_hdl[ANCS_NOTIF_SCR_HDL_CCCD], TRUE);//TRUE为开  FALSE为关if(ret != SUCCESS){LOG("ANCS_DATA_SRC_HDL_CCCD FAILURE\n");pservie->chars_hdl[ANCS_DATA_SRC_HDL_CCCD] = 0;pctx->disc_state = ANCS_DISC_FAILED;errorcode = 10;break;}pctx->disc_state = ANCS_ENABLE_DS_CCCD;}}

通知源的解析

void ble_ancs_process_ns_notify(gattMsgEvent_t *pMsg)
{ancs_ctx_t* pctx = &s_ancs_ctx;ancs_evt_t evt;ancs_notify_evt_t notify_msg;uint8_t len = pMsg->msg.handleValueNoti.len;if (len != 8){LOG("\n");LOG("Error evt len\n");return;}// Create pointer to GATT notification data.uint8_t *packetData = pMsg->msg.handleValueNoti.value;// Store the ANCS notification's eventIDnotify_msg.eventID = packetData[0];// Store the ANCS notification's eventFlagnotify_msg.eventFlag = packetData[1];// Store the ANCS notification's categoryIDnotify_msg.categoryID = packetData[2];notify_msg.categoryCount = packetData[3];// Notification UID from packetData[4] to packetData[7]notify_msg.notifUID[0] = packetData[ANCS_NOTIF_UID_LENGTH];notify_msg.notifUID[1] = packetData[ANCS_NOTIF_UID_LENGTH+1];notify_msg.notifUID[2] = packetData[ANCS_NOTIF_UID_LENGTH+2];notify_msg.notifUID[3] = packetData[ANCS_NOTIF_UID_LENGTH+3];evt.msg = (void*)(&notify_msg);evt.len = sizeof(notify_msg);evt.type = BLE_ANCS_EVT_NOTIF;if(pctx->callback){pctx->callback(&evt);}}

数据源的解析

void ancs_parse_get_attrs_response(ancs_ctx_t  * p_ancs, const uint8_t * p_data_src, uint8_t  hvx_data_len)
{uint32_t index;LOG("ancs_parse_get_attrs_response:\n");print_hex(p_data_src, hvx_data_len);for (index = 0; index < hvx_data_len;){switch (p_ancs->parse_info.parse_state){case COMMAND_ID:p_ancs->parse_info.parse_state = command_id_parse(p_ancs, p_data_src, &index);break;case NOTIF_UID:p_ancs->parse_info.parse_state = notif_uid_parse(p_ancs, p_data_src, &index);break;case APP_ID:p_ancs->parse_info.parse_state = app_id_parse(p_ancs, p_data_src, &index);break;case ATTR_ID:p_ancs->parse_info.parse_state = attr_id_parse(p_ancs, p_data_src, &index);break;case ATTR_LEN1:p_ancs->parse_info.parse_state = attr_len1_parse(p_ancs, p_data_src, &index);break;case ATTR_LEN2:p_ancs->parse_info.parse_state = attr_len2_parse(p_ancs, p_data_src, &index);break;case ATTR_DATA:p_ancs->parse_info.parse_state = attr_data_parse(p_ancs, p_data_src, &index);break;case ATTR_SKIP:p_ancs->parse_info.parse_state = attr_skip(p_ancs, p_data_src, &index);break;case DONE:LOG("Parse state: Done %s\r\n", p_ancs->attr_evt_msg.p_attr_data);index = hvx_data_len;break;default:// Default case will never trigger intentionally. Go to the DONE state to minimize the consequences.p_ancs->parse_info.parse_state = DONE;break;}}
}

(PS:个人笔记,仅供学习参考)


http://www.ppmy.cn/news/724227.html

相关文章

蓝牙BLE芯片PHY6222之RTC计时

蓝牙BLE芯片PHY6222之RTC计时 个人建议使用外部32K作为RTC的时钟源&#xff0c;精度相对6222内部32K高很多&#xff0c;内部32K看官方资料是500ppm的时钟精度 RTC驱动 datetime_t ttdatetime; #define UNIX_2000 946656000 UTCTimeStruct user_get_utc(void); void user_se…

phy6222 IIC从机配置

phy6222 IIC从机配置 一、IIC从机初始化配置 void user_iic_slave_init(void) {hal_gpio_pin_init(P33, IE);hal_gpio_pin_init(P34, IE);hal_gpio_pull_set(P33, STRONG_PULL_UP);hal_gpio_pull_set(P34, STRONG_PULL_UP);uint8_t op_ret 0;I2C_Slave_Parameter iic_slave_…

蓝牙PHY6222添加OTA升级功能

主要步骤&#xff1a; 1&#xff1a;代码添加 ota_app_service 2&#xff1a;keil软件添加ota_app代码 3&#xff1a;烧录软件添加ota设置 4&#xff1a;手机ota_app升级准备&#xff1a; 奉加微电子官网下载6222的代码SDK&#xff0c;V3.0以上 下载官网的PhyPlusKit串口烧录工…

蓝牙BLE芯片PHY6222之I2C主从通信

蓝牙BLE芯片PHY6222之I2C主从通信 开发环境I2C主机I2C从机注意事项 开发环境 1.PHY6222开发板 2.SDK版本以及路径&#xff1a;SDK\release_bbb_sdk-PHY62XX_SDK_3.0.9\example\peripheral\gpio 3.硬件连接 SDA  GPIO_P33----------GPIO_33 CLK  GPIO_P34----------GPIO_34…

蓝牙BLE芯片PHY6222之OTA

蓝牙BLE芯片PHY6222之OTA 什么是OTA将OTA驱动移植到应用代码一、SLB移植用PhyPlusKit烧录支持SLB的文件支持SLB的OTA bin文件的制作使用APP进行SLB升级二、Single Bank 移植用PhyPlusKit烧录支持Single Bank的OTA文件支持Single Bank OTA 的hex16文件制作使用APP进行Single Ban…

如何修改Jupyter Notebook的默认目录和默认浏览器

一、修改默认目录 Jupyter Notebook的文件默认保存目录是C:\Users\Administrator&#xff0c;默认目录可在黑窗口中查看&#xff0c;如下图所示&#xff1a; 为了方便文档的管理&#xff0c;可将默认目录修改成自己想保存的地方。修改方法如下&#xff1a; 1、找到config文件 …

前端适配笔记本缩放125%,150%导致页面错乱问题

由于前端在开发时使用的都是标准ui设计图&#xff0c;基本都是按照所以1920*1080&#xff0c; 而小屏幕笔记本由于分辨率高&#xff0c;所以导致的显示元素变小&#xff0c;因此很多笔记本的默认显示都是放大125%或者150%。 如果页面比较简单就让多余的空白单边扩展&#xff0c…

台式机计算机型号怎么查,电脑配置怎么查询?笔记本台式机查询电脑配置的四种方法...

电脑配置怎么查询&#xff1f;虽然说现在网络非常的发达&#xff0c;但是并不是每个人都是电脑专家&#xff0c;还有一些不怎么接触电脑的小白用户&#xff0c;对于电脑配置怎么查询并不了解。今天智能手机网就为大家带来了电脑配置查询的具体方法&#xff0c;一起来瞧一瞧吧。…