I am running a simple BLE app on an nRF52 DK board.
In it simplest mode, the app advertises a GATT server with a
WriteNoResponse characteristic.
When I write to this characteristic from a GATT client (a mac in my case),
my access callback is properly invoked, and I can get the characteristic
value when this value is "normal" (i.e no more than MTU-3 bytes).
For testing, I set the MTU to 23 with:
ble_att_set_preferred_mtu(23);

I can verify that writing a 20 byte value works fine, as I get a callback
with ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR

However, if I write a value that's 21 bytes or more, the callback is never
invoked.
At the GATT level, writing a long attribute involves different GATT
commands, namely BLE_ATT_OP_PREP_WRITE_REQ and BLE_ATT_OP_EXEC_WRITE_REQ,
instead of the one-shot BLE_ATT_OP_WRITE_REQ.
If I enable DEBUG logging, I can see that the BLE_ATT_OP_EXEC_WRITE_REQ is
received and processed, but there's no callback to my code.

Here's what the log looks like (this is for a 21 bytes value, with the MTU
set at 23):

1687:[ts=13179676ssb, mod=64 level=1] mtu update event; conn_handle=1 cid=4
mtu=23

...


58955:[ts=460585900ssb, mod=4 level=0] ble_hs_hci_evt_acl_process():
handle=1 pb=2 len=27 data=
0x17 0x00 0x04 0x00 0x16 0x16 0x00 0x00 0x00 0x01 0x02 0x03 0x04 0x05 0x06
0x07 0x08 0x09 0x0a
0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12
58961:[ts=460632772ssb, mod=4 level=0] rxed att command: prep write req;
conn=1 handle=0x0016 o
ffset=0
58963:[ts=460648396ssb, mod=4 level=0] txed att command: prep write rsp;
conn=1 handle=0x0016 o
ffset=0
58966:[ts=460671832ssb, mod=4 level=0] host tx hci data; handle=1 length=27
58968:[ts=460687456ssb, mod=4 level=0] ble_hs_hci_acl_tx(): 0x01 0x00 0x1b
0x00 0x17 0x00 0x04
0x00 0x17 0x16 0x00 0x00 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
0x0a 0x0b 0x0c 0x0d
0x0e 0x0f 0x10 0x11 0x12
58976:[ts=460749952ssb, mod=4 level=0] ble_hs_hci_evt_acl_process():
handle=1 pb=2 len=6 data=0
x02 0x00 0x04 0x00 0x18 0x00
58979:[ts=460773388ssb, mod=4 level=0] rxed att command: exec write req;
conn=1 flags=0x00
58981:[ts=460789012ssb, mod=4 level=0] host tx hci data; handle=1 length=5
58983:[ts=460804636ssb, mod=4 level=0] ble_hs_hci_acl_tx(): 0x01 0x00 0x05
0x00 0x01 0x00 0x04
0x00 0x19
58986:[ts=460828072ssb, mod=4 level=0] Number of Completed Packets:
num_handles=1
58988:[ts=460843696ssb, mod=4 level=0] handle:1 pkts:1
58991:[ts=460867132ssb, mod=4 level=0] Number of Completed Packets:
num_handles=1
58993:[ts=460882756ssb, mod=4 level=0] handle:1 pkts:1

Reply via email to