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

Multilink central - data always received from the last device

Hello,

I am having a custom nRF52832-based central device - it works fine when connecting a single nRF52832-based peripheral (the both are based on SDK 14).

Now I need to support two identical peripheral devices - I have increased NRF_SDH_BLE_CENTRAL_LINK_COUNT to 2, and enabled scanning after discovery of the first device. Now, both peripheral devices connect simulteniously to the central without a problem. In order to receive the data from the both, however, I guess I should also modify the part related to data reception. I have checked the ble_app_multilink_central example but still not sure how to implement that part. I guess I should modify somehow connection handling parts. Currently, data is always received from the last connected device. That is, when first device gets connected, data comes from it. Once the second peripheral gets connected, data reception from first device gets terminated and reception of data from the second device starts.

Any guidance or advice would be appreciated.

P.S. Here https://devzone.nordicsemi.com/f/nordic-q-a/29790/multiperipheral-uart-example  I see the following:

"you would need an array to store the attribute table (the handles), if you have 2 devices, you need space for two tables"

In my case I have

BLE_DB_DISCOVERY_DEF(m_db_disc); and I replaced it with  BLE_DB_DISCOVERY_ARRAY_DEF(m_db_disc, NRF_SDH_BLE_CENTRAL_LINK_COUNT);

At BLE_GAP_EVT_CONNECTED I have the following:

        case BLE_GAP_EVT_CONNECTED:
             // Upon connection, check which peripheral has connected, initiate DB
             // discovery, update LEDs status and resume scanning if necessary. 			
    	     DEBUGOUT1("Connection 0x%x established, starting DB discovery.", p_gap_evt->conn_handle);
    		 ble_connected();
    
            // start discovery of services. 
    
            err_code = ble_db_discovery_start(&m_db_disc[p_gap_evt->conn_handle], p_ble_evt->evt.gap_evt.conn_handle);
            APP_ERROR_CHECK(err_code);

However, still only receiving data from one peripheral device at a time. So anything else I could be missing?

Related