This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to setup a Notification Characteristic

I am writing my own function to setup a notification characteristic, but it failed,

Could anyone help me check it ?

static uint8_t d[2] = {0};
static ble_gatts_char_handles_t h;
APP_ERROR_CHECK(ble_app_gatts_characteristic_add(uuid, NOTIFY_PROP_MASK|WRITE_PROP_MASK|READ_PROP_MASK|READ_PERM_MASK|WRITE_PERM_MASK,
                                d,
                                2,
                                2,
                                &h));

uint32_t ble_app_gatts_characteristic_add(const ble_uuid_t uuid, 
                                            const uint16_t properties,
                                            uint8_t * p_characteristic_value, 
                                            const uint16_t characteristic_value_length,
                                            const uint16_t characteristic_max_value_length,
                                            ble_gatts_char_handles_t * p_handles)
{
    ble_gatts_attr_md_t cccd_md;
    ble_gatts_char_md_t char_md;
    ble_gatts_attr_md_t attr_md;
    ble_gatts_attr_t attr_value;

    memset(&cccd_md, 0, sizeof(cccd_md));
    memset(&char_md, 0, sizeof(char_md));
    memset(&attr_md, 0, sizeof(attr_md));
    memset(&attr_value, 0, sizeof(attr_value));

    // cccd_md
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);

    cccd_md.vloc = BLE_GATTS_VLOC_STACK;

    // char md
    if(properties & WRITE_PROP_MASK){char_md.char_props.write = true;}
    if(properties & WRITE_NO_RESP_PROP_MASK){char_md.char_props.write_wo_resp = true;}
    if(properties & READ_PROP_MASK){char_md.char_props.read = true;}
    if(properties & NOTIFY_PROP_MASK) {
        char_md.char_props.notify = true;
        BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);
        char_md.p_cccd_md = &cccd_md;
        attr_md.vlen = 1;
    }
    if(properties & INDICATE_PROP_MASK) {
        char_md.char_props.indicate = true;
        BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);
        char_md.p_cccd_md = &cccd_md;
        attr_md.vlen = 1;
    }


    // static char *desc = "Test User Description";
    // char_md.p_char_user_desc = desc;
    // char_md.char_user_desc_sie

    // attr md
    if(properties & READ_PERM_MASK) {BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);}
    if(properties & WRITE_PERM_MASK) {BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);}
    attr_md.vloc = BLE_GATTS_VLOC_STACK;

    // attr value
    attr_value.p_attr_md = &attr_md;

    ble_uuid_t u = uuid;
    attr_value.p_uuid = &u;
    attr_value.init_len = characteristic_value_length;
    attr_value.p_value = p_characteristic_value;
    attr_value.init_offs = 0;
    attr_value.max_len = characteristic_max_value_length;

    // according to doc to sd_ble_gatts_characteristic_add, use BLE_GATT_HANDLE_INVALID, the characteristic will be placed sequentially
    return sd_ble_gatts_characteristic_add(BLE_GATT_HANDLE_INVALID, &char_md, &attr_value, p_handles); 

if I set NOTIFY_PROP_MASK flag, iPhone can connect but cannot discover the charactersitic until it timeout; if I unset NOTIFY_PROP_MASK flag, iPhone can connect and discover all services and characteristics

I am using SDK 6.0.0, with soft device 110 7.0.0

Parents Reply Children
No Data
Related