6621Px (6621Cx 类似) 建立128位定义服务和特征时,如果和标准的128位Base UUDI相同时, 协议栈里会把它简化为16位UUID。 而有些App固定按128位UUID进行过滤,因此会导致匹配不成功。 为了解决这个问题, SDK需要重写几个函数,并按如果指示调用。 #include "gattm_task.h" #include "attm.h" #include "ke_mem.h" struct attm_svc_desc { uint16_t start_hdl; uint16_t end_hdl; uint16_t task_id; uint8_t perm; uint8_t ext_perm; uint16_t uuid; }; struct attm_svc { struct attm_svc *next; struct attm_svc_desc svc; }; uint8_t attmdb_svc_check_hdl(struct gattm_svc_desc *svc_desc); void (*attmdb_svc_init)(void* svc_desc, void* new_svc, uint16_t size, bool calc_hdl) = (void*)(size_t)0x00115c77; uint8_t (*attmdb_svc_calc_len)(void* svc_desc, void* size) = (void*)(size_t)0x00115ab1; // void attmdb_svc_init(void *svc_desc, void *new_svc, uint16_t size, bool calc_hdl); // uint8_t attmdb_svc_calc_len(void *svc_desc, void *size); static void _attmdb_svc_insert(struct attm_svc *svc) { extern struct { struct attm_svc *svcs; } gattm_env; struct attm_svc **current_svc = &(gattm_env.svcs); bool found = false; while ((*current_svc != NULL) && (!found)) { if (svc->svc.start_hdl < (*current_svc)->svc.start_hdl) { svc->next = *current_svc; *current_svc = svc; found = true; } else { current_svc = &((*current_svc)->next); } } if (!found) { *current_svc = svc; (*current_svc)->next = NULL; } } static uint8_t _attmdb_add_service(struct gattm_svc_desc *svc_desc) { uint8_t status = ATT_ERR_NO_ERROR; uint16_t svc_mem_size; struct attm_svc *new_svc; bool calc_hdl = (svc_desc->start_hdl == 0); do { status = attmdb_svc_check_hdl(svc_desc); if (status != ATT_ERR_NO_ERROR) { break; } svc_mem_size = sizeof(struct attm_svc) + (1 + svc_desc->nb_att) * svc_desc->nb_att * ATT_UUID_128_LEN; new_svc = (struct attm_svc *) ke_malloc(svc_mem_size, KE_MEM_ATT_DB); attmdb_svc_init(svc_desc, new_svc, svc_mem_size, calc_hdl); _attmdb_svc_insert(new_svc); } while (0); return (status); } uint8_t attm_svc_create_db_128_ex(uint16_t *shdl, const uint8_t *uuid, uint8_t *cfg_flag, uint8_t max_nb_att, uint8_t *att_tbl, ke_task_id_t const dest_id, const struct attm_desc_128 *att_db, uint8_t svc_perm) { uint8_t nb_att = max_nb_att; uint8_t i; uint8_t status = ATT_ERR_NO_ERROR; struct gattm_svc_desc *svc_desc; svc_desc = (struct gattm_svc_desc *) ke_malloc( sizeof(struct gattm_svc_desc) + (sizeof(struct gattm_att_desc) * (nb_att)), KE_MEM_NON_RETENTION); svc_desc->start_hdl = *shdl; svc_desc->nb_att = nb_att; svc_desc->task_id = dest_id; svc_desc->perm = svc_perm; memcpy(svc_desc->uuid, uuid, ((PERM_GET(svc_perm, SVC_UUID_LEN) == PERM_UUID_16) ? ATT_UUID_16_LEN : ((PERM_GET(svc_perm, SVC_UUID_LEN) == PERM_UUID_32) ? ATT_UUID_32_LEN : ATT_UUID_128_LEN))); for (i = 1, nb_att = 0; i < max_nb_att; i++) { svc_desc->atts[nb_att].max_len = att_db[i].max_size; svc_desc->atts[nb_att].ext_perm = att_db[i].ext_perm; svc_desc->atts[nb_att].perm = att_db[i].perm; memcpy(svc_desc->atts[nb_att].uuid, &(att_db[i].uuid), ((PERM_GET(att_db[i].ext_perm, UUID_LEN) == PERM_UUID_16) ? ATT_UUID_16_LEN : ((PERM_GET(att_db[i].ext_perm, UUID_LEN) == PERM_UUID_32) ? ATT_UUID_32_LEN : ATT_UUID_128_LEN))); nb_att++; } status = _attmdb_add_service(svc_desc); if (status == ATT_ERR_NO_ERROR) { *shdl = svc_desc->start_hdl; for (i = 0, nb_att = 0; (i < max_nb_att) && (att_tbl != NULL); i++) { att_tbl[i] = *shdl + nb_att; nb_att++; } } ke_free(svc_desc); return (status); } |
