I'm using Nrf connect for Mobile to test my BLE firmware. I noticed that when trying to write more than 20 bytes to a characteristic, nothing gets logged which means my write callback function isn't called. Either the nrf connect app isn't sending anything above 20 bytes or the BLE stack is just silently ignoring the message for some reason. According to BLE spec, characteristic value can be up to 512 bytes so that's a bit unexpected. Am I doing something wrong? I attached my prj.conf and some code.
# Enable logging system to USB CONFIG_LOG=y # <BLE> CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME="bale module" # Allow multiple devices to connect at once CONFIG_BT_MAX_CONN=6 CONFIG_BT_BUF_ACL_RX_COUNT=7 # Enable Security Management Protocol # CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 # CONFIG_BT_GATT_DYNAMIC_DB=y # </BLE> # Needed for LEDs CONFIG_DK_LIBRARY=y CONFIG_BT_HCI_ERR_TO_STR=y # <CRYPTO> # Enable nordic security backend and PSA APIs CONFIG_NRF_SECURITY=y CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_PSA_WANT_ALG_ECDH=y CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT=y CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT=y CONFIG_PSA_WANT_ECC_SECP_R1_256=y # For key generation CONFIG_PSA_WANT_GENERATE_RANDOM=y CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 CONFIG_MBEDTLS_ENABLE_HEAP=y CONFIG_MBEDTLS_HEAP_SIZE=8192 CONFIG_MAIN_STACK_SIZE=4096 CONFIG_HEAP_MEM_POOL_SIZE=4096 # </CRYPTO>
BT_GATT_SERVICE_DEFINE(rcs_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_RCS_SERVICE), BT_GATT_CHARACTERISTIC(BT_UUID_RCS_TX, BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ, NULL, NULL, NULL), BT_GATT_CCC(NULL, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), BT_GATT_CHARACTERISTIC(BT_UUID_RCS_RX, BT_GATT_CHRC_WRITE, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE, NULL, on_receive, NULL), ); // RX attribute was written to static ssize_t on_receive(struct bt_conn* conn, const struct bt_gatt_attr* attr, const void* buf, uint16_t len, uint16_t offset, uint8_t flags) { char addr[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("[%s] Received data, handle %d, conn %p", addr, attr->handle, (void*)conn); return len; }