SDK 15.2, S132 6.1, nRF52832
I have a characteristics to write data to a peripheral, using variable length up to 507 bytes and authorization.
Writing to the peripheral works fine with ATT_MTU=23 and DATA_LENGTH=27
When I establish a connection with ATT_MTU=247 and DATA_LENGTH=251, writing returns bad data after 28 bytes!
Data on wire: 122808021a241a2212200102030405060708091011121314151617181920212223242526272829303132
Data in buffer:122808021A241A22122001020304050607080910111213141516171801000000354D0300D1A90200A5A5
Characteristic:
static uint32_t toolCommandCharAdd(tBlePowerTool * prtToBlePowerTool, const tBlePressGunSrvInit * ptrToBlePressGunSrvInit)
{
ble_gatts_char_md_t gatts_char_md;
ble_gatts_attr_t gatts_attr;
ble_uuid_t ble_uuid;
ble_gatts_attr_md_t gatts_attr_md;
// setup the char attr meta data
memset(&gatts_char_md, 0, sizeof(gatts_char_md));
gatts_char_md.char_props.write = true;
gatts_char_md.char_ext_props.reliable_wr = true; // Queued write operation permmited
// setup the characteristic attr
ble_uuid.type = prtToBlePowerTool->pressGunSrv.uuid_type;
ble_uuid.uuid = PRESSGUNSRV_UUID_TOOL_COMMAND_CHAR;
memset(&gatts_attr_md, 0, sizeof(gatts_attr_md));
gatts_attr_md.read_perm = ptrToBlePressGunSrvInit->payload_writeonly_attr_md.read_perm;
gatts_attr_md.write_perm = ptrToBlePressGunSrvInit->payload_writeonly_attr_md.write_perm;
gatts_attr_md.vlen = true; // support of variable len
gatts_attr_md.vloc = BLE_GATTS_VLOC_USER;
gatts_attr_md.rd_auth = true;
gatts_attr_md.wr_auth = true;
memset(&gatts_attr, 0, sizeof(gatts_attr));
gatts_attr.p_uuid = &ble_uuid;
gatts_attr.p_attr_md = &gatts_attr_md;
gatts_attr.init_len = 0;
gatts_attr.init_offs = 0;
gatts_attr.max_len = sizeof BlePwrBrdCommEventDataWrite.dataBuf;
gatts_attr.p_value = (uint8_t *) BlePwrBrdCommEventDataWrite.dataBuf;
return sd_ble_gatts_characteristic_add(prtToBlePowerTool->pressGunSrv.service_handle,
&gatts_char_md,
&gatts_attr,
&prtToBlePowerTool->pressGunSrv.toolCommandHandles);
}
Event for receiving:
case BLE_GATTS_OP_WRITE_REQ:
NRF_LOG_DEBUG("BLE_GATTS_OP_WRITE_REQ: len: %d", p_evt_write->len );
memset( BlePwrBrdCommEventDataWrite.dataBuf, 0 , sizeof BlePwrBrdCommEventDataWrite.dataBuf );
memcpy( BlePwrBrdCommEventDataWrite.dataBuf, &p_evt_write->data[0], p_evt_write->len );
BlePwrBrdCommEventDataWrite.size = p_evt_write->len;
debug log
<debug> nrf_ble_gatt: ATT MTU updated to 247 bytes on connection 0x0 (response). <debug> nrf_sdh_ble: BLE event: 0x24. <debug> nrf_ble_gatt: Data length updated to 251 on connection 0x0. <debug> nrf_ble_gatt: max_rx_octets: 251 <debug> nrf_ble_gatt: max_tx_octets: 251 <debug> nrf_ble_gatt: max_rx_time: 2120 <debug> nrf_ble_gatt: max_tx_time: 2120 <debug> nrf_sdh_ble: BLE event: 0x51. <debug> app: BLE_GATTS_AUTHORIZE_TYPE_WRITE with BLE_GATTS_OP_WRITE_REQ <debug> app: BLE_GATTS_OP_WRITE_REQ: len: 11 <debug> app: BlePwrBrdCommEventBleWrite <debug> app: DATA BUFFER: 0A0908FA0710021A020816 <debug> nrf_sdh_ble: BLE event: 0x51. <debug> app: BLE_GATTS_AUTHORIZE_TYPE_WRITE with BLE_GATTS_OP_WRITE_REQ <debug> app: BLE_GATTS_OP_WRITE_REQ: len: 8 <debug> app: BlePwrBrdCommEventBleWrite <debug> app: DATA BUFFER: 120608011A025200 <debug> nrf_sdh_ble: BLE event: 0x51. <debug> app: BLE_GATTS_AUTHORIZE_TYPE_READ <debug> app: FrameRead reply offset 0 (16 bytes) with SUCCESS. <debug> nrf_sdh_ble: BLE event: 0x51. <debug> app: BLE_GATTS_AUTHORIZE_TYPE_WRITE with BLE_GATTS_OP_WRITE_REQ <debug> app: BLE_GATTS_OP_WRITE_REQ: len: 42 <debug> app: BlePwrBrdCommEventBleWrite <debug> app: DATA BUFFER: 122808021A241A22122001020304050607080910111213141516171801000000354D0300D1A90200A5A5