Hello!
I am trying to set up a central that accepts notifications for two different attributes from a custom BLE service.
I know that the problem is in my discovery process seen below, and I have managed to figure out that it is either in the:
I have watched this post How to enable multiple notifications in central side that had the same issue as me however I can't seem to get it right.
static uint8_t discover_func(struct bt_conn *conn, const struct bt_gatt_attr *attr, struct bt_gatt_discover_params *params) { int err; if (!attr) { printk("Discover complete\n"); (void)memset(params, 0, sizeof(*params)); return BT_GATT_ITER_STOP; } printk("[ATTRIBUTE] handle %u\n", attr->handle); if (!bt_uuid_cmp(discover_params.uuid, BT_UUID_FROG)) { printk("Discovering TxDATA\n"); memcpy(&frog_discover_uuid, BT_UUID_TXDATA, sizeof(frog_discover_uuid)); discover_params.uuid = &frog_discover_uuid.uuid; discover_params.start_handle = attr->handle + 1; discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; err = bt_gatt_discover(conn, &discover_params); if (err) { printk("Discover failed (err %d)\n", err); } } else if ((!bt_uuid_cmp(discover_params.uuid, BT_UUID_FROG))) { printk("Discovering RxCREDIT\n"); memcpy(&frog_discover_uuid, BT_UUID_RXCREDIT, sizeof(frog_discover_uuid)); discover_params.uuid = &frog_discover_uuid.uuid; discover_params.start_handle = attr->handle + 2; discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; err = bt_gatt_discover(conn, &discover_params); if (err) { printk("Discover failed (err %d)\n", err); } } else if (!bt_uuid_cmp(discover_params.uuid, BT_UUID_TXDATA)) { printk("Discovering CCC TxData\n"); discover_params.uuid = ccc_uuid; discover_params.start_handle = attr->handle + 3; discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR; subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); err = bt_gatt_discover(conn, &discover_params); if (err) { printk("Discover failed (err %d)\n", err); } } else if (!bt_uuid_cmp(discover_params.uuid, BT_UUID_RXCREDIT)){ printk("Discovering CCC RxCredit\n"); discover_params.uuid = ccc_uuid2; discover_params.start_handle = attr->handle + 4; discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR; subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); err = bt_gatt_discover(conn, &discover_params); if (err) { printk("Discover failed (err %d)\n", err); } } else { subscribe_params.notify = notify_func; subscribe_params.value = BT_GATT_CCC_NOTIFY; subscribe_params.ccc_handle = attr->handle; err = bt_gatt_subscribe(conn, &subscribe_params); if (err && err != -EALREADY) { printk("Subscribe failed (err %d)\n", err); } else { printk("[SUBSCRIBED]\n"); } return BT_GATT_ITER_CONTINUE; } return BT_GATT_ITER_STOP; }
Thank you in advance and please let me know if I need to clarify or add some more information.
//Björn