GATT Central/Client BLE Write not working

Hello and thank you for your help.

Im working on a Zephyr-based project with the nrf52840 usb dongle, and Ive hit a wall.

The dongle needs to act as a central and client, and connects over BLE to a second device. This second device has one primary service with two characteristics. Of those two characteristics, one is a notify/read, and the other is write/write w/o response.

I have successfully implemented gatt discover and then subscribe/enable notifications, and I can see the heartbeat message from the server to the client in my printk output. So far so good. Where I am having a problem is I can't seem to then go back to the discovery process, and then get the write w/o response side of things to work.

I think I need to use GATT discover to find the write characteristic, and then I can write [0x01,0x63] to it without response. I think the problem im having is in the discovery part, but welcome any advice or examples. The GATT Central example isnt very helpful, in that it writes to basically a random handle. Are there any other examples for a client-side implementation that first does bt_gatt_discover(...) and then bt_gatt_write_without_response(...)?

Here is my code if that helps:

static uint8_t SEND_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;
	}

	//did we get to this callback after searching for the primary service? then look for write characterisitic
	if (0 == bt_uuid_cmp(SEND_Discover_Params.uuid, PROTEUS_PRIMARY_SERVICE_UUID)) 
	{
		memcpy(&SEND_Discover_UUID, PROTEUS_SERVER_Receive_CHARACTERISTIC, sizeof(SEND_Discover_UUID));
		SEND_Discover_Params.uuid = &SEND_Discover_UUID.uuid;
		SEND_Discover_Params.start_handle = attr->handle + 1; //why is this +1?
		SEND_Discover_Params.type = BT_GATT_DISCOVER_CHARACTERISTIC;
		err = bt_gatt_discover(conn, &SEND_Discover_Params);
		if (err) {
			printk("Discover failed (err %d)\n", err);
		}
	} 
	//did we get to this callback after searching for the characterisitic? Write to the handle
	else if (0 == bt_uuid_cmp(SEND_Discover_Params.uuid,PROTEUS_SERVER_Receive_CHARACTERISTIC))  
	{
		//debug info
		char str1 [128];
		bt_uuid_to_str(attr->uuid,str1,128);
		printk("[ATTRIBUTE] handle %u uuid %s %s\n", attr->handle,str1);

		//do the write
		err = bt_gatt_write_without_response(conn,attr->handle,send_data,2,false);
		printk("sent start to %i err %i \n",attr->handle,err);
	}	
	

	return BT_GATT_ITER_STOP;
}
 

Thank you all for your time and support.

Related