Multiple notifications on central side

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:

discover_params.start_handle = attr->handle   part of the code OR it is in how I handle my switch if-statements.
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.
All sample code that I have looked at on the central side does not handle multiple notifications/multiple attributes so they haven't helped me.
Note 1: I don't want to use the discovery manager so please don't suggest this.
Note 2: Everything from the peripheral works fine with the NRF Connect app so the peripheral is not the issue here.
 

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

Parents
  • Hi!

    Note 1: I don't want to use the discovery manager so please don't suggest this.

    If there are features missing, or something else we can change with the discovery manager, please let us know.

    discover_params.start_handle = attr->handle   part of the code OR it is in how I handle my switch if-statements.

    Did you manage to solve this? Looking at the code, it seems like maybe having this "(!bt_uuid_cmp(discover_params.uuid, BT_UUID_FROG) " 2 times could cause issues?

  • Hi! I solved the discovery part by adding them in the order they are declared in the GATTServer and then changing the conditional statement accordingly.
    Now I need to figure out how to subscribe to the attributes directly when discovered.

    Regards,

    Björn

Reply Children
No Data
Related