variable length for long characteristic

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hi, I am trying to use long characteristic (50byte) with variable length.

I can set value to the characteristic once, but it never change if I try to update to another value.

I defined below LEGATTDB_PERM_READABLE and LEGATTDB_PERM_VARIABLE_LENGTH set characteristic.

```

    CHARACTERISTIC_UUID128 (

        HANDLE_MY_CHARACTERISTIC,

        HANDLE_MY_VALUE,

        UUID_MY_CHARACTERISTIC,

        LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_NOTIFY,

        LEGATTDB_PERM_READABLE | LEGATTDB_PERM_AUTH_READABLE | LEGATTDB_PERM_VARIABLE_LENGTH,

        50),

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

```

I set value as below.

```

    BLEPROFILE_DB_PDU* my_characterestic = cfa_mm_Alloc(2 + data_len);

    memcpy(my_characterestic->pdu, data, data_len);

    my_characterestic->len = data_len;

    bleprofile_WriteHandleData(HANDLE_MY_VALUE, my_characterestic, 2 + data_len);

    cfa_mm_Free(my_characterestic);

```

reproducible procedure.

1. connect BCM20737S(peripheral) and iPhone(central)

2. set value with bleprofile_WriteHandleData.

    data is {0x01, 0x02, 0x03, 0x04, 0x05, 0x06} and data_len is 6.

3. read value from iPhone. {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}  can be read correctly.

4. set another value like {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17} and data_len is 7.

5. read value from iPhone. {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}  remains even though another value has been set.

(if I set shorter byte array like {0x21,0x22,0x23,0x24,0x25} at step4, it can be set correctly..)

Can we use long characteristic with variable length?

Environment is as below.

```

Hardware : BCM20737S as BLE peripheral, and iPhone (iOS9.1) as BLE central

SDK : 2.2.0

```


Best Regards,


0 Likes
1 Solution
Anonymous
Not applicable

Thanks boont,

This issue has been solved with below modification (enable to write).

With our use case, this characteristic don't need to write, but without "writable", I cannot use variable length even though adding LEGATTDB_PERM_VARIABLE_LENGTH.

```

-  CHARACTERISTIC_UUID128 (

+  CHARACTERISTIC_UUID128_WRITABLE (

      HANDLE_MY_CHARACTERISTIC,

        HANDLE_MY_VALUE,

        UUID_MY_CHARACTERISTIC,

        LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_NOTIFY,

-      LEGATTDB_PERM_VARIABLE_LENGTH | LEGATTDB_PERM_READABLE | LEGATTDB_PERM_AUTH_READABLE,

+      LEGATTDB_PERM_VARIABLE_LENGTH | LEGATTDB_PERM_READABLE | LEGATTDB_PERM_WRITE_CMD | LEGATTDB_PERM_WRITE_REQ | LEGATTDB_PERM_AUTH_READABLE,

        50),

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

```

Anyway, thank you for your support!

View solution in original post

0 Likes
4 Replies
BoonT_56
Employee
Employee
500 likes received 250 likes received 100 likes received
0 Likes
Anonymous
Not applicable

Hi boont ,

Thank you for your reply, but your link is about length of long characteristic data. In your linked article, 79rpm use LEGATTDB_PERM_VARIABLE_LENGTH flag, but I cant know s/he can handle long characteristic as variable length data...

Thanks.

0 Likes

There is a description of a fix here. Let me know if it helps:

Characteristic of variable-length write

dmiya

0 Likes
Anonymous
Not applicable

Thanks boont,

This issue has been solved with below modification (enable to write).

With our use case, this characteristic don't need to write, but without "writable", I cannot use variable length even though adding LEGATTDB_PERM_VARIABLE_LENGTH.

```

-  CHARACTERISTIC_UUID128 (

+  CHARACTERISTIC_UUID128_WRITABLE (

      HANDLE_MY_CHARACTERISTIC,

        HANDLE_MY_VALUE,

        UUID_MY_CHARACTERISTIC,

        LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_NOTIFY,

-      LEGATTDB_PERM_VARIABLE_LENGTH | LEGATTDB_PERM_READABLE | LEGATTDB_PERM_AUTH_READABLE,

+      LEGATTDB_PERM_VARIABLE_LENGTH | LEGATTDB_PERM_READABLE | LEGATTDB_PERM_WRITE_CMD | LEGATTDB_PERM_WRITE_REQ | LEGATTDB_PERM_AUTH_READABLE,

        50),

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

```

Anyway, thank you for your support!

0 Likes