-
Create manifest and upload bundle:
# Set path to your application binary export BIN_FILE="build/app/zephyr/zephyr.signed.bin" export FW_VERSION="1.2.3" # Create manifest.json with firmware details cat > manifest.json << EOF { "name": "My Firmware", "description": "Firmware description", "fwversion": "${FW_VERSION}", "format-version": 1, "files": [ { "file": "$(basename ${BIN_FILE})", "type": "application", "size": $(stat -c%s ${BIN_FILE} 2>/dev/null || stat -f%z ${BIN_FILE}) } ] } EOF # Create zip containing firmware and manifest zip -j firmware.zip ${BIN_FILE} manifest.json # Upload to nRF Cloud and extract bundle ID UPLOAD_RESPONSE=$(curl -X POST "https://api.nrfcloud.com/v1/firmwares" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/zip" \ --data-binary @firmware.zip) # Extract the bundle ID from the response (UUID from the URI path) export BUNDLE_ID=$(echo $UPLOAD_RESPONSE | jq -r '.uris[0]' | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}') -
Create and apply FOTA job:
# Create job JOB_RESPONSE=$(curl -X POST "https://api.nrfcloud.com/v1/fota-jobs" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/json" \ -d "{\"deviceIds\": [\"${DEVICE_ID}\"], \"bundleId\": \"${BUNDLE_ID}\"}") export JOB_ID=$(echo $JOB_RESPONSE | jq -r '.jobId') # Apply job curl -X POST "https://api.nrfcloud.com/v1/fota-jobs/${JOB_ID}/apply" \ -H "Authorization: Bearer ${API_KEY}" -
Monitor job status:
curl -X GET "https://api.nrfcloud.com/v1/fota-jobs/${JOB_ID}" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Accept: application/json"Job status values:
QUEUED,IN_PROGRESS,DOWNLOADING,SUCCEEDED,FAILED,TIMED_OUT,CANCELLED,REJECTED -
Verify the update by checking the device information in nRF Cloud (App Version or Modem Firmware field).