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

OTA Thread DFU: Merge SDK example with custom application

Hi all!

I'm able to fully test the SDK example https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_tz_v3.2.0%2Fthread_example_dfu.html and it works pretty well.

Now, the next step is the integration of this OTA DFU over Thread example in my custom application (that already exploits Thread and MQTT-SN protocol).

I haven't found a tutorial that explains step-by-step this kind of operation. 

Basically I need some help to integrate the DFU client with the user application. I think the key point is the IoT SDK CoAP library that implement a DFU algorithm that should run concurrently to the user application, but I'm a bit confused about merging process.

Thanks in advance,

Alessio

  • Hi,

    You do not need to flash both the MBR and Softdevice HEX-files. The MBR is merged into the softdevice, and you will find that if you do a compare, the first page (0x0 - 0x1000) will be identical.

    The Bootloader needs information about the application in order to verify that it is a valid application. This means that you either needs to generate the settings using nrfutil, or create a DFU packet of the application and "flash" it using the DFU process. 

    I recommend that you follow the instructions in the Testing section of the Thread Secure OTA DFU Example, especially steps 3.c-d.

    Best regards,
    Jørgen 

  • Yes, I got it right 10min ago, I had a try flashing SD + BL + APP (app + settings) as you linked in the guide.

    The setup doesn't work, so I thought it was a code problem and I tried to enter in debug mode.

    To avoid problems, since I am newbie in these aspects, I started the debug on SES so I think the right components are flashed directly by SES via Jlink.

    I found my code stucked here:

    that is part of this function in my main:

    If I comment that line the application FW works as usual, without the DFU part.

    Seems like there are some problems with openthread lib, since the FW stucks here:

    I tried to understand more debugging DFU example and there the code run smoothly.

    The only difference I found between the two cases is this one:

    DFU example (from which I copy-paste the code) uses blue-marked files, while my application uses red-marked files (obviously because DFU example doesn't exploit SD and my application does).

    I can't keep them together otherwise I get "multiple definitions" build error.

    Could this be the problem?

  • EDIT: Problem solved calling

    thread_instance_init();

    before

    coap_dfu_init(thread_ot_instance_get());

    Now the application starts without stucking.

    The problem is that only my original application starts normally, but there isn't the DFU feature.

    I can attach a Teraterm log:

    The blue-marked line indicates that my application has started normally.

    COAP debug messages seem to indicate that there are no particular problems with DFU, but the FW doesn't send any COAP messages (I can't sniff anything with an external sniffer).

    Thanks in advance,

    Alessio

  • Are you triggering the DFU when the node have attached to a network? In the DFU client example this happens in state_changed_callback() in main:

    if (aFlags & OT_CHANGED_THREAD_ROLE)
    {
        switch(role)
        {
            case OT_DEVICE_ROLE_CHILD:
            case OT_DEVICE_ROLE_ROUTER:
            case OT_DEVICE_ROLE_LEADER:
                coap_dfu_trigger(NULL);
                break;
    
            case OT_DEVICE_ROLE_DISABLED:
            case OT_DEVICE_ROLE_DETACHED:
            default:
                break;
        }
    }

    Also make sure that you have initialized app_timer in your application.

  • Hi Jorgen,

    yes I noticed that my application had the ".autocommissioning = false" option, so it creates a thread network only with the border router active. I set it to true and now it sends the GET messages correctly.

    But after 3 times, I receive this kind of error log:

    Is it normal?

    Moreover, when I tried to do the DFU process with a server, It has failed. I got the invalid init error.

    The DFU process doesn't start at all, I can't get if this is a problem of the flashed FW or of the DFU procedure (the package or the settings). In my command prompt I can see this kind of error from the server side when I run

    nrfutil dfu thread -f -pkg app_dfu_package.zip -p COM13 --channel 11 --panid 43981 --address fdde:ad00:beef:0:45de:6d18:9ea6:219b

    Thanks in advance,

    Alessio

Related