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
  • Hi there,

    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).

    There is no "official" way to read buffers from a server that are longer than 512 bytes (the maximum length of a characteristic value).

    You have several options to achieve that:

    1. Create 4x characteristics (since each characteristic can only be 512 bytes long) and use VLOC_USER to make each of those point to a quarter of your historical data. Then the client can use read long operations on all those characteristics to obtain the data

    2. Create a single characteristic, and mark it rd_auth = 1. Then every time your client asks for data you are free to provide the data you want with sd_ble_gatts_rw_auth_reply()

    Carles

Reply
  • Hi there,

    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).

    There is no "official" way to read buffers from a server that are longer than 512 bytes (the maximum length of a characteristic value).

    You have several options to achieve that:

    1. Create 4x characteristics (since each characteristic can only be 512 bytes long) and use VLOC_USER to make each of those point to a quarter of your historical data. Then the client can use read long operations on all those characteristics to obtain the data

    2. Create a single characteristic, and mark it rd_auth = 1. Then every time your client asks for data you are free to provide the data you want with sd_ble_gatts_rw_auth_reply()

    Carles

Children
No Data
Related