DFU for external BLE Sensor

Hi,

  I have a current project that is based on the nRf52840.  This project acts both as a peripheral and a central.  I have a need to update the firmware on a remote BLE sensor using DFU, i.e., I need to do exactly what the nRfConnect application does when it updates a peripheral firmware via DFU.  My thought was to use the nRf52840 dongle and develop this code on my PC and then port it to my embedded system.  I also thought the best starting point would be the source code for the nRfConnect application which I would port it but I see from user comments that nordic did not release the source code for this.  Is it possible to get this source code or is there another example that demonstrates what I need to accomplish?

Thanks!

Parents Reply
  • Hi, my code is based on the nRF5 SDK and runs on a nRf52840.  I am trying to send a firmware update from my nRf52840 to an external BLE sensor via whatever means I need to use.  The external sensor is a BT610 from Laird.   When I use the nRFConnect app to connect to the BT610 sensor I do not see the BT610 advertising a Secure DFU service.  The BT610 does advertise an SMP Service.  So I guess I need an nRF5 SDK example for how to connect to the SMP service and discover it's characteristics so I can read/write to them.  I have not been able to find any nRF5 SDK examples for this.

    Thanks,

    Dave

Children
  • I see, thanks for the clarification. The fact that the laird module  advertises the SMP service indicates that it only supports the mcumgr protocol. And the bad news is that there is no SMP implementation in the nRF5 SDK, so this is something you would have to do from scratch.

    A good start would maybe be to make the SMP GATT client service to interface with the SMP server on the BT610.

  • Hi,

      Is there a tutorial or other information available to show me how to make a SMP GATT client service?  I have never made a GATT client service before.

    Thanks,

    Dave

  • Hi,

    There are some tutorials here you can take a look at: https://devzone.nordicsemi.com/nordic/short-range-guides/b/bluetooth-low-energy. The "Bluetooth low energy central tutorial" is likely the most relevant one for what you're trying to do.

    You may also use the Client implementation in the nRF connect sdk as a reference for your implementation: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.1.0/nrf/include/bluetooth/services/dfu_smp_c.html

    Best regards,

    Vidar

  • Hi,

      I have my app scanning the BT610 which in fact a Zephyr RTOS based device.  I have attached a screen shot of the connection that nRfConnect app makes to this sensor.

    I have successfully scanned and made a connection to this BT610 sensor from my application but I am not seeing the characteristics and UUID that I am expecting during the discovery phase.  I have added a bunch of print statements in the discovery handler as shown here:  

    static void db_disc_handler(ble_db_discovery_evt_t *p_evt)
    {
    	ble_gatt_db_char_t * p_chars = p_evt->params.discovered_db.charateristics;
    
    	print_trace("call to ble_lbs_on_db_disc_evt for instance %d and link 0x%x!", p_evt->conn_handle, p_evt->conn_handle);
    	print_trace("p_evt->evt_type: %d", p_evt->evt_type);
    	print_trace("p_evt->params.discovered_db.srv_uuid.uuid: 0x%X", p_evt->params.discovered_db.srv_uuid.uuid);
    	print_trace("p_evt->params.discovered_db.srv_uuid: 0x%X", p_evt->params.discovered_db.srv_uuid.type);
    	for (uint32_t ii = 0; ii < p_evt->params.discovered_db.char_count; ii++) {
    		print_trace("p_chars[%d].characteristic.uuid.uuid: 0x%X, Type: 0x%X", ii, p_chars[ii].characteristic.uuid.uuid, p_chars[ii].characteristic.uuid.type);
    	}	
    }
    This is what is being printed..

    <info> app: trace:1634844344:p_evt->evt_type: 2
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid.uuid: 0x1
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid: 0x3
    <info> app: trace:1634844344:call to ble_lbs_on_db_disc_evt for instance 0 and link 0x0!
    <info> app: trace:1634844344:p_evt->evt_type: 2
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid.uuid: 0x1523
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid: 0x5
    <info> app: trace:1634844344:call to ble_lbs_on_db_disc_evt for instance 0 and link 0x0!
    <info> app: trace:1634844344:p_evt->evt_type: 2
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid.uuid: 0x1
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid: 0x6
    <info> app: trace:1634844344:call to ble_lbs_on_db_disc_evt for instance 0 and link 0x0!
    <info> app: trace:1634844344:p_evt->evt_type: 2
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid.uuid: 0x1
    <info> app: trace:1634844344:p_evt->params.discovered_db.srv_uuid: 0x7

    The p_evt->evt_type: 2 indicates BLE_DB_DISCOVERY_SRV_NOT_FOUND (Event indicating that the service was not found at the peer).  Can you shed some light on why I am getting BLE_DB_DISCOVERY_SRV_NOT_FOUND back?  I am expecting to get what the nRfConnect application sees?

  • Hi, you have to add the SMP service's based UUID through the sd_ble_uuid_vs_add() call before you start service discovery. You may take a look at the ble_app_uart_c example to see how it's done there for the the NUS client service.

Related