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

S132 3.0 MTU exchange not completing

  1. I looked at examples and added identical code to my own app, specifically to a) set the gatt_enable_params.att_mtu to GATT_MTU_SIZE_DEFAULT, and b) to handle BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST in evt dispatch by doing an sd_ble_gatts_exchange_mtu_reply of that same size.

  2. I found that when testing my app, just after an incoming CONNECT succeeds, when I try to do an sd_ble_gatts_hvx, it is returning NRF_ERROR_INVALID_STATE.

  3. I found the doc of the new functionality of Configurable ATT_MTU on P.6 of the S132 migration document, which was great. I also saw this in the Usage section, which was also a relief because it explains the invalid state. This must mean that the exchange is currently still in progress. "HVx and service changed cannot run while a local client initiated ATT_MTU exchange is active. The SV calls sd_ble_gatts_hvx( ) and sd_ble_gatts_service_changed() will return NRF_ERROR_INVALID_STATE if a local client initiated ATT_MTU exchange is ongoing."

  4. I instrumented my app to use NRF_LOG to output all BLE messages to the serial console, and see the following:

a) BLE_GAP_EVT_CONNECTED (which has a good handle)

b) BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST (which I handle with the sd_ble_gatts_exchange_mtu_reply as I said above, and as in all the samples)

c) Nothing else. I never receive the BLE_GATTC_EVT_EXCHANGE_MTU_RSP which the doc would imply I should be receiving to indicate the end of the exchange.

  1. I read this doc, and anything else I could find, and I am stumped as to why the RSP isn't coming, and why I'm stuck in the middle of the MTU exchange. I don't even know who is originathing this request, so I can't look at the source code to see what is happening. infocenter.nordicsemi.com/index.jsp

I'm completely blocked in my conversion to SDKV12 at this point because of nonfunctional BT. Guidance would be greatly appreciated. Thank you.

Parents
  • Oh, I'm sorry I misread that everything suddenly worked today, including your app.

    You would need to make sure BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST actually arrived, and you put the MTU size to gatt_enable_params.att_mtu correctly. You should check all the return code when you call either softdevice_enable() or the sd_ble_gatts_exchange_mtu_reply() they should return success.

    My suggestion is to modify your app to a very simple one. Maybe just keep a dummy characteristic that you can use to send notification, just to check it MTU exchange finished or not. If you can make simple example that can reproduce the issue, you can send to use and we test here. If we can also reproduce the issue here, it will be fixed very quickly.

Reply
  • Oh, I'm sorry I misread that everything suddenly worked today, including your app.

    You would need to make sure BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST actually arrived, and you put the MTU size to gatt_enable_params.att_mtu correctly. You should check all the return code when you call either softdevice_enable() or the sd_ble_gatts_exchange_mtu_reply() they should return success.

    My suggestion is to modify your app to a very simple one. Maybe just keep a dummy characteristic that you can use to send notification, just to check it MTU exchange finished or not. If you can make simple example that can reproduce the issue, you can send to use and we test here. If we can also reproduce the issue here, it will be fixed very quickly.

Children
No Data
Related