This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Nus profile seems to cause system reset if the data length too long.

iphone5_b.psdm370_android6_b.psdlong_write_error.pngI using SDK11. I porting nus profile to my system and make a customer's UUID. I use Lightblue on iPhone 5 to connect my system. I sent a data through my customer's UUID. My system work fine when the data length is less than or equal 20 bytes. It will cause system reset if the data length is great than 20 bytes. Was the softdevice error, or I made something wrong?

  • Ok. What if you use BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED instead?

  • I tested all gatt_status from BLE_GATT_STATUS_SUCCESS to BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE. I got an error code = 7 from the reply of the function of sd_ble_gatts_rw_authorize_reply at each gatt_status. Some gatt_status got a BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event, and some gatt_status got it twice. Can I use my code I post yesterday? Does it has any side effect?

  • Strange, I tested the following code in ble_evt_dispatch(), and I'm not getting any error code:

    if(p_ble_evt->header.evt_id == BLE_EVT_USER_MEM_REQUEST)
    {
        err_code = sd_ble_user_mem_reply(m_nus.conn_handle, NULL);
        APP_ERROR_CHECK(err_code);
    }
    if(p_ble_evt->header.evt_id == BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST)
    {
        ble_gatts_rw_authorize_reply_params_t rw_authorize_reply_params;
        
        memset(&rw_authorize_reply_params, 0, sizeof(rw_authorize_reply_params));
        
        rw_authorize_reply_params.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE;
        
        rw_authorize_reply_params.params.write.gatt_status  = BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED;
    
        err_code = sd_ble_gatts_rw_authorize_reply(m_nus.conn_handle, &rw_authorize_reply_params);
        APP_ERROR_CHECK(err_code);
    }
    
  • Oh, it is very strange. I use your code and then I send 22-byte data. I receive BLE_EVT_USER_MEM_REQUEST event 1 time and call the API of sd_ble_user_mem_reply(m_conn_handle, NULL). Then I get first BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event and call the API of sd_ble_gatts_rw_authorize_reply(m_conn_handle, &rw_authorize_reply_params). I get the error code == 0. (success). Then I get second BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event and call the API of sd_ble_gatts_rw_authorize_reply(m_conn_handle, &rw_authorize_reply_params). I get the error code == 7. (failure. system reset).

  • Ok. I'm not sure why you get the error. Can you do a sniffer trace with the nRF Sniffer? Also, when you get the error, what are all the parameters in ble_gatts_evt_rw_authorize_request_t struct that comes with the BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event?

Related