FUOTA

Firmware update over the air (sometimes called FUOTA) makes it possible to push firmware updates to one or multiple devices, making use of multicast. It is standardized by the following LoRa® Alliance specifications:

  • LoRaWAN® Application Layer Clock Synchronization (v1 & v2)
  • LoRaWAN® Fragmented Data Block Transport (v1 & v2)
  • LoRaWAN® Remote Multicast Setup (v1 & v2)

It is important to note that the implementation of this feature by devices is optional and therefore, unless your device explicitly states that it implements FUOTA it is safe to assume it does not.

For a step-by-step guide how to perform a FUOTA deployment, please see the FUOTA usage guide.

FUOTA flow

The following diagram provides a high-level overview of the ChirpStack FUOTA implementation:

GstartStart FUOTA deploymentcreate_mc_groupCreate Multicast Groupstart->create_mc_groupadd_mc_devicesAdd Devicescreate_mc_group->add_mc_devicesadd_mc_gatewaysAdd Gatewaysadd_mc_devices->add_mc_gatewaysmc_group_setup_reqSend McGroupSetupReq to all devicesadd_mc_gateways->mc_group_setup_reqmc_group_setup_ans_waitWait for McGroupSetupAns responsesmc_group_setup_req->mc_group_setup_ans_waitmc_group_setup_ans_okAll acknowledged?mc_group_setup_ans_wait->mc_group_setup_ans_ok:nmc_group_setup_ans_ok:e->mc_group_setup_reqNo, retry if < max retriesfrag_session_setup_reqSend FragSessionSetupReq to all devicesmc_group_setup_ans_ok:s->frag_session_setup_reqYes / max retries reachedfrag_session_setup_ans_waitWait for FragSessionSetupAns responsesfrag_session_setup_req->frag_session_setup_ans_waitfrag_session_setup_ans_okAll acknowledged?frag_session_setup_ans_wait->frag_session_setup_ans_ok:nfrag_session_setup_ans_ok:e->frag_session_setup_reqNo, retry if < max retriesmc_class_x_session_reqSend McClassBSessionReq -or-McClassCSessionReq to all devicesfrag_session_setup_ans_ok:s->mc_class_x_session_reqYes / max retries reachedmc_class_x_session_ans_waitWait For McClassBSessionAns -or-McClassCSessionAns responsesmc_class_x_session_req->mc_class_x_session_ans_waitmc_class_x_session_ans_okAll acknowledged?mc_class_x_session_ans_wait->mc_class_x_session_ans_ok:nmc_class_x_session_ans_ok:e->mc_class_x_session_reqNo, retry if < max retrieswait_mc_session_startWait until multicast session startmc_class_x_session_ans_ok:s->wait_mc_session_startYes / max retries reachedenqueueEnqueue fragmentswait_mc_session_start->enqueuefrag_session_status_reqSend FragSessionStatusReq to all devicesenqueue->frag_session_status_reqfrag_session_status_ans_waitWait for FragSessionStatusAns responsesfrag_session_status_req->frag_session_status_ans_waitfrag_session_status_ans_okAll acknowledger?frag_session_status_ans_wait->frag_session_status_ans_ok:nfrag_session_status_ans_ok:e->frag_session_status_reqNo, retry if < max retriescleanupCleanup Multicast Groupfrag_session_status_ans_ok:s->cleanupYes / max retries reached