This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Reading a subset of data on a BLE server

I am definitely missing something here, but I can't figure out how to specify a subset of data to read from my peripheral.

Here's the setup: my nrf51822 device is a server, publishing a custom service with custom characteristics.

I have in memory is the nrf51822 a long (2048 bytes) list of historical data.

I want to allow a client to be able to read a specific portion of this data rather than having to transfer all 2048 bytes (which I can't anyway).

The SoftDevice handles characteristic reads automatically, but even if I could intercept them I don't see how I can pass parameters to a characteristic read operation.

What is the official BLE way to do what I'm trying to do?

Parents
  • In the meantime, is there a way to get an event when the server gets a read from a client?

    What you are looking for is called "Read Authorization".

    The attached MSC should help you out.

    To create a characteristic with read authorization set the following bit:

    ble_gatts_attr_md_t :: rd_auth

    when calling:

    sd_ble_gatts_characteristic_add()

    So, combining rd_auth on your side with usage of Read Long Characteristic Values (aka Read Blob) you could simply do this:

    <- Read_Blob_Req(offset = 0) -> Read_Blob_Resp(first 20 bytes of data) <- Read_Blob_req(offset = 20) -> Read_Blob_Resp(bytes 20 to 40) ...

    msc_inline_mscgraph_29.png

Reply
  • In the meantime, is there a way to get an event when the server gets a read from a client?

    What you are looking for is called "Read Authorization".

    The attached MSC should help you out.

    To create a characteristic with read authorization set the following bit:

    ble_gatts_attr_md_t :: rd_auth

    when calling:

    sd_ble_gatts_characteristic_add()

    So, combining rd_auth on your side with usage of Read Long Characteristic Values (aka Read Blob) you could simply do this:

    <- Read_Blob_Req(offset = 0) -> Read_Blob_Resp(first 20 bytes of data) <- Read_Blob_req(offset = 20) -> Read_Blob_Resp(bytes 20 to 40) ...

    msc_inline_mscgraph_29.png

Children
Related