服务128位UUID变为16位UUID问题

wen sir · 3次点击 · 2天前

     6621Px (6621Cx 类似) 建立128位定义服务和特征时,如果和标准的128位Base UUDI相同时, 协议栈里会把它简化为16位UUID。

     而有些App固定按128位UUID进行过滤,因此会导致匹配不成功。


  为了解决这个问题, SDK需要重写几个函数,并按如果指示调用。


image.png

394cccae92f7bc2f4a09331dbe07991.png


#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);
}


6621p_rw_attm_svc_create_db_128-202506238505.c
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站