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*)(¬ify_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:个人笔记,仅供学习参考)