Sending a complete file at once from SD card to Mobile App using NRF52840.

Hello Nordic Family. I hope this post finds you well. 

I am working on a project where I have connected multiple sensors to the NRF52840. I have collected all the sensor's data and saved it on the SD card as a CSV file. The file size is about 240MB which has 60 Hours of data from all the sensors(client requirements). Now I want to send this complete file at once from the SD card to the Mobile App in the fastest possible way. I have run the below program on my board

/cfs-file/__key/communityserver-discussions-components-files/4/8204.ble_5F00_app_5F00_uart_5F00_fatfs_5F00_send_5F00_sdk_5F00_16.0.0.zip.

but this program reads data one by one byte from the SD card and sends it byte by byte to the mobile app which I don't want. I want to send the whole file at once in the fastest possible way not byte by byte. Any help regarding this will be highly appreciated. 

Best Regards,

Sami 

  • Hi Hakon, 

    Your overall throughput will depend on what the parameters that the central device accepts. It is true that you can technically achieve these numbers, but that also depends on a phone that allows such optimal parameters.

    I have applied all the suggestions from multiple similar threads but still, I can only send 220KB(of 234MB file) per 4 seconds which is 55KB/second. This figure is far beyond the 1Mbps speed. 

    You have to transfer the file in chunks of the max. data length that you can send, ie. 244 bytes in your scenario.

    Yes, I am sending in chunks of 244 bytes but the rate of sending chunks is very low. I am very tired of looking at this problem for more than a week and studied a lot of threads but no one help me. I just want to read a 234MB file from the SD card and send it to the mobile app in the fastest possible way(up to 1Mbps)

    Best Regards,

    Sami Ul Haq. 

  • Hi,

     

    Samiulhaq said:
    I have applied all the suggestions from multiple similar threads but still, I can only send 220KB(of 234MB file) per 4 seconds which is 55KB/second. This figure is far beyond the 1Mbps speed. 

    55 kiloBytes per second -> 440kbit/s, which is quite fast when using the BLE 1Mbit on-air data rate.

    Have you checked what the connection parameters that you receive from your phone is? This might be the maximum based on the event length, connection interval, etc. that the central provides you with.

     

    Have you tried requesting 2MBit PHY in the BLE_GAP_EVT_CONNECTED event?

    Here's a snippet on how to request that:  enabling 2Mb phy Windows 10 (1909) 

     

    Kind regards,

    Håkon

  • Hi Hakan, thanks for the reply.

    55 kiloBytes per second -> 440kbit/s, which is quite fast when using the BLE 1Mbit on-air data rate.

    No, I am not using IMbit on-air data rate, rather I am using 2MBPS as I have set BLE_GAP_EVT_PHY_UPDATE_REQUEST: to 

                    .rx_phys = BLE_GAP_PHY_2MBPS,
    .                tx_phys = BLE_GAP_PHY_2MBPS,

    Is this the correct way to set the 2MBPS on-air data rate? 

    Have you tried requesting 2MBit PHY in the BLE_GAP_EVT_CONNECTED event?

    The below is my Ble_connected Case:

    case BLE_GAP_EVT_CONNECTED:
                NRF_LOG_INFO("Connected");
                err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
                APP_ERROR_CHECK(err_code);
                m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
                err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
                APP_ERROR_CHECK(err_code);
                break;

    How do I check whether the 2MBit PHY is requested or not in the BLE_GAP_EVT_CONNECTED case?

    Have you checked what the connection parameters that you receive from your phone is? This might be the maximum based on the event length, connection interval, etc. that the central provides you with.

    Yes Sir, this might be the case, How do I check these parameters in my mobile App? I am using a Vivo phone and the mobile App which I am using to get the data is nRF Toolbox in which I am using UART. How to check connection parameters in my case? 

    Best Regards,

    Sami Ul Haq

  • Hi Sami,

     

    Samiulhaq said:

    No, I am not using IMbit on-air data rate, rather I am using 2MBPS as I have set BLE_GAP_EVT_PHY_UPDATE_REQUEST: to 

                    .rx_phys = BLE_GAP_PHY_2MBPS,
    .                tx_phys = BLE_GAP_PHY_2MBPS,

    Is this the correct way to set the 2MBPS on-air data rate? 

    You should call the snippet from the BLE_GAP_EVT_CONNECTED, similar to this:

    case BLE_GAP_EVT_CONNECTED:
    {
        ble_gap_phys_t const phys =
        {
           .rx_phys = BLE_GAP_PHY_2MBPS,
           .tx_phys = BLE_GAP_PHY_2MBPS,
        };
        err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
        ...
        break;
    };

    Samiulhaq said:
    Yes Sir, this might be the case, How do I check these parameters in my mobile App? I am using a Vivo phone and the mobile App which I am using to get the data is nRF Toolbox in which I am using UART. How to check connection parameters in my case? 

    You can use the BLE sniffer to see the details of the link:

    https://www.nordicsemi.com/Products/Development-tools/nrf-sniffer-for-bluetooth-le

     

    Note that you should also include the pairing process, so that the sniffer can follow (ie. decode) the rest of the communication as well.

    You can do this by deleting the bonds on both phone and nRF, then the sniffer shall be able to pick it up.

     

    Kind regards,

    Håkon

  • Hello Hakan, thanks for the replay. 

    You should call the snippet from the BLE_GAP_EVT_CONNECTED, similar to this:

    Yes, I have included these lines in the BLE_GAP_EVT_CONNECTED.  Thanks for the snippet.

    You can use the BLE sniffer to see the details of the link:

    I have set up the Sniffer with Wireshark, but I am new to the sniffer and can't analyze the packets correctly that is how I can find the packet size, number of bits/bytes per packet, connection interval, time taken by1 packet, and other related parameters in the sniffer/Wireshark. I have attached the Wireshark result to this reply, can you please analyze it and extract the required information from it? I will be very thankful for this kind act. 

    Sniffer_Result.pcapng

    Note that you should also include the pairing process, so that the sniffer can follow (ie. decode) the rest of the communication as well.

    You can do this by deleting the bonds on both phone and nRF, then the sniffer shall be able to pick it up.

     

    I didn't understand this as I am new to Sniffer. I have the sniffer running in one NRF52840 Eval kit and another NRF2840 DK for the main task to send the data to the app. Can you please refer me to a blog/ticket etc for more clarification?

    Best Regards,

    Sami  

Related