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