mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-26 19:57:55 +00:00
3836 lines
86 KiB
HTML
3836 lines
86 KiB
HTML
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
<meta name="description" content="Documentation for the open source MeshCore firmware">
|
|
|
|
|
|
|
|
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/ota_user_guide/">
|
|
|
|
|
|
<link rel="prev" href="../ota_protocol/">
|
|
|
|
|
|
<link rel="next" href="../packet_format/">
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="icon" href="../assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
|
|
|
|
|
|
|
|
<title>Updating your node over the air (OTA) - user guide - MeshCore Docs</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
|
|
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/extra.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
|
|
|
|
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
<body dir="ltr">
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#updating-your-node-over-the-air-ota-user-guide" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header class="md-header md-header--shadow" data-md-component="header">
|
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
|
<a href=".." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
|
|
|
|
<img src="../_assets/meshcore.svg" alt="logo">
|
|
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
MeshCore Docs
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
Updating your node over the air (OTA) - user guide
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-header__button md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
|
</label>
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
|
</label>
|
|
<nav class="md-search__options" aria-label="Search">
|
|
|
|
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="md-search__suggest" data-md-component="search-suggest"></div>
|
|
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list" role="presentation"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-header__source">
|
|
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
mikecarper/MeshCore
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href=".." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
|
|
|
|
<img src="../_assets/meshcore.svg" alt="logo">
|
|
|
|
</a>
|
|
MeshCore Docs
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
mikecarper/MeshCore
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href=".." class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Introduction
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../WiFi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
WiFi and MQTT by Firmware Type
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cad_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SX1262 channel-scanning hardware results
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../carrier_wave/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Carrier-wave RF checks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../carrier_wave_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CW and CW2 validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_build_matrix/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Availability by Firmware Build
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_command_availability/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Command Availability Matrix
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_commands/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Commands
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_settings_audit/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI setting dispatch audit
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_contact_cache/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion contact caches
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_contact_cache_results/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Contact-cache and NimBLE RAM qualification
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_offline_queue/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion Offline Message Queue
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion Protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_radio_full/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_usb_ascii_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
USB Companion ASCII default validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_usb_client_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
USB Companion client compatibility
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../docs/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Local Documentation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../double_frequency_v4_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Double center-frequency write: V4 transmitter / XIAO receiver
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../esp32_memory_budget/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Classic ESP32 image memory budget
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../espnow_bridge_setup/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP-NOW bridge: simple setup
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../faq/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Frequently Asked Questions
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../filter_tool/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Filter policy playground
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../firmware_memory_budget/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Firmware memory checks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../firmware_picker/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Firmware picker
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../flood_filtering/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Flood Filtering and Moderation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../four_fixed_tx_dwell_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Four fixed transmitters: longer dwell repeats
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../four_fixed_tx_single_pass_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Four fixed transmitters / fast single-pass receiver
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_companion_features/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion: turn features on and off
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_companion_usb_switcher/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion USB CLI and binary switcher
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_usb_logging_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full USB logging repair — 1.17.1.6
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../gps_tracking/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
GPS Tracking
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../halo_keymind_settings/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Halo and Keymind Branch Settings
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hardware_validation_bluetooth_stealth_2026-09-07/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
XIAO Bluetooth stealth hardware validation - 2026-09-07
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hardware_validation_checklist/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Hardware validation checklist
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../home_text_spacing/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Home-screen text spacing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../host_cli_service/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
LoRa CLI Host Service
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../kiss_modem_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore KISS Modem Protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../lora_ota_automation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Scripted LoRa OTA from start to finish
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mbedtls-tls-footprint/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Shrinking the per-connection TLS footprint on non-PSRAM observers
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mixed_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Mixed-bandwidth two-channel reception test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mixed_sf_bw_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Equal-symbol-time mixed SF/BW, four-channel test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nimble_companion_trial/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 NimBLE Full Companion trial
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nimble_companion_trial_results/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 NimBLE trial results, 2026-09-08
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52-usb-ready-fix/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 USB READY hang
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52_companion_storage_recovery/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 Companion automatic ExtraFS recovery
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52_power_management/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 Power Management
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../number_allocations/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Number Allocations
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_easy/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Easy firmware updates over LoRa
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshTower V2 microSD LoRa OTA
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 bootloader updates over LoRa
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_nrf52_qspi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 repeater LoRa OTA with external QSPI
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore OTA - .mota container & LoRa protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Updating your node over the air (OTA) - user guide
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Updating your node over the air (OTA) - user guide
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#the-important-part-first-its-safe" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
The important part first: it's safe
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#how-to-talk-to-your-node" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
How to talk to your node
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#common-tasks" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Common tasks
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Common tasks">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#1-see-what-im-running-and-whether-anything-is-going-on" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
1. See what I'm running and whether anything is going on
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#2-find-updates-available-near-me" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
2. Find updates available near me
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#3-download-an-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
3. Download an update
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#4-install-a-downloaded-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
4. Install a downloaded update
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#updating-an-nrf52-bootloader-advanced-explicit-only" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Updating an nRF52 bootloader (advanced, explicit only)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#5-if-something-goes-wrong" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
5. If something goes wrong
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#adjust-lora-ota-speed" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Adjust LoRa OTA speed
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#optional-let-it-update-automatically" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Optional: let it update automatically
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#optional-only-trust-updates-from-specific-people" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Optional: only trust updates from specific people
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#sharing-updates-with-others-advanced" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Sharing updates with others (advanced)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Sharing updates with others (advanced)">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#relay-a-folder-of-firmware-from-a-computer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Relay a folder of firmware from a computer
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#everyone-helps-share" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Everyone helps share
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#where-firmware-files-come-from" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Where firmware files come from
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#quick-reference" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Quick reference
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#a-few-terms" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
A few terms
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../packet_format/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Packet Format
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pair_4p6_300us_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF7/62.5 + SF8/500: 4.6 slow chirps, 0.3 ms reserve
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pair_preamble32_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF7/62.5 + SF8/500, fast switching and preamble 32
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../payloads/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Payload Format
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pr7_review_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
PR #7 review and validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../preamble_detection_investigation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Off-channel preamble investigation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../qr_codes/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
QR Codes
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_chirp_math_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Shared radio/radio2 chirp timing and preamble warnings
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_dwell_policy_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Automatic dwell policy: 4.6 chirps on both profiles
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profile_switch_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SX1262 profile-switch validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profiles/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Two LoRa profiles on one radio
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profiles_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Dual-profile receive validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_receive_calibration/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Radio receive calibration and recovery
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../rak3401_mota_chain/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
RAK3401 1W repeater compact LoRa update chain
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../role_feature_switches/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Feature switches by role — 1.17.1.5 USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../s3_memory_soak_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 OTA memory experiment
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../separated_radio_modulation_cache_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Separated radios, normal XIAO RX gain, and unchanged-modulation timing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_10_vs_100hz_full_sample_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125 full samples: 10 Hz versus 100 Hz first-pass detour
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_10hz_cr_detour_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125: tiny first-pass frequency offset and coding-rate detour
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_full_retune_twice_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125: apply the full radio settings twice per hop
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_nrf52_double_write_settling_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10 / 125 kHz, XIAO nRF52 TX, double write, 1 ms delay grid
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_rollback_failure_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125 rollback and wider-spacing failure isolation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf125_settling_limits_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Descending SF10..SF5 / 125 kHz settling limits
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf5_250_dwell_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF5 / 250 kHz: four-channel dwell sweep
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_125_settling_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6/125 four-channel post-switch settling sweep
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_5p1_trace_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6 / 125 kHz: four channels at 5.1 chirps
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_channel_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6 / 125 kHz channel-count test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf8_5p1_trace_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF8 / 125 kHz: four-channel comparison at 5.1 chirps
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../spiffs_regular_file_reads/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SPIFFS regular-file reads and login replay state
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../stats_binary_frames/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Stats Binary Frame Structures
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../telemetry_decoder/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Telemetry decoder
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../terminal_chat_cli/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Terminal Chat CLI
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb_serial_backpressure/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Native USB backpressure and radio liveness
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v4_pixel5_font_trial/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Small-screen message fonts
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_88" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_88" id="__nav_88_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Releases
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_88_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_88">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Releases
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.5-doc-audit/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Markdown audit — 1.17.1.5 USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.5/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore 1.17.1.5 Dev - USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.6/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore 1.17.1.6 Dev - USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#the-important-part-first-its-safe" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
The important part first: it's safe
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#how-to-talk-to-your-node" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
How to talk to your node
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#common-tasks" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Common tasks
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Common tasks">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#1-see-what-im-running-and-whether-anything-is-going-on" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
1. See what I'm running and whether anything is going on
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#2-find-updates-available-near-me" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
2. Find updates available near me
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#3-download-an-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
3. Download an update
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#4-install-a-downloaded-update" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
4. Install a downloaded update
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#updating-an-nrf52-bootloader-advanced-explicit-only" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Updating an nRF52 bootloader (advanced, explicit only)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#5-if-something-goes-wrong" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
5. If something goes wrong
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#adjust-lora-ota-speed" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Adjust LoRa OTA speed
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#optional-let-it-update-automatically" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Optional: let it update automatically
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#optional-only-trust-updates-from-specific-people" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Optional: only trust updates from specific people
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#sharing-updates-with-others-advanced" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Sharing updates with others (advanced)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Sharing updates with others (advanced)">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#relay-a-folder-of-firmware-from-a-computer" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Relay a folder of firmware from a computer
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#everyone-helps-share" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Everyone helps share
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#where-firmware-files-come-from" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Where firmware files come from
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#quick-reference" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Quick reference
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#a-few-terms" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
A few terms
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/mikecarper/MeshCore/edit/keymindCascade/docs/ota_user_guide.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
<h1 id="updating-your-node-over-the-air-ota-user-guide">Updating your node over the air (OTA) - user guide</h1>
|
|
<p>For <strong>1.17.1.5</strong>, use the exact board/storage profile from
|
|
<a href="https://github.com/mikecarper/Adafruit_nRF52_Bootloader_OTAFIX/releases/tag/0.11.0-OTAFIX2.4.6">OTAFIX 2.4.6</a>
|
|
for nRF52 OTAFIX installations. New internal-flash hybrid receivers require
|
|
its 64 KiB retained-RAM handoff; QSPI and microSD targets require their own
|
|
matching bootloader profiles. Earlier preview versions mentioned below
|
|
describe compatibility/migration history, not the current recommended download.
|
|
Full Companion is a MOTA source and normally updates itself over USB.</p>
|
|
<p>This guide is for <strong>node operators</strong>: how to update your MeshCore device's firmware over the radio, in
|
|
plain language. No cables, no programmer - your node can download a new firmware from a neighbour and
|
|
install it. (For the technical wire format, see <a href="../ota_protocol/">the OTA protocol spec</a>.)</p>
|
|
<p>LoRa OTA download and installation are present only in supported Keymind destination artifacts; the receiver
|
|
must already be running one of those install-capable builds. Some internal-staging nRF52 targets use a lean
|
|
<code>lora_ota_no_external_sensors</code> target, while matched external-QSPI boards can retain their normal full-sensor
|
|
repeater features. Release filenames include an OTA marker, but capability must still be confirmed on the
|
|
running device. A source can be an OTA-enabled infrastructure node or a source-only Full Companion backed
|
|
by <code>motatool</code>. Intermediate repeaters
|
|
do not need OTA-enabled firmware: current repeater builds transport OTA floods opaquely, subject to their normal
|
|
forwarding filters, duplicate checks, and flood limits. OTA radio traffic is accepted, generated, and relayed
|
|
only while <code>tempradio</code> is actually running on that node. Every source, receiver, and intermediate repeater must
|
|
therefore have an overlapping temporary-radio window.</p>
|
|
<p>The recommended temporary OTA settings use 250 kHz bandwidth, SF5, CR5, and a 120-minute window. For a
|
|
North American node currently configured for 910.525 MHz, run this on every participating node:</p>
|
|
<pre><code class="language-text">tempradio 910.525,250,5,5,120
|
|
</code></pre>
|
|
<p>Use the node's current permitted regional frequency in place of <code>910.525</code> when necessary.</p>
|
|
<p>The scripted updater checks the firmware version of the receiver and every
|
|
sender before deciding whether RX power saving can remain active. At
|
|
SF5/BW250, an all-v1.17.1.5-or-newer path can use effective RXPS level 8 with
|
|
the tuple-selected 64-symbol physical preamble. SF5/BW500 can use level 8 with
|
|
128 symbols. Other fast tuples remain at the shortest viable preamble, normally
|
|
32. A mixed, older, or unknown long-preamble path is put in continuous receive
|
|
for the update, then the receiver's exact saved RXPS setting is restored. This
|
|
preserves the RX benefit without risking missed packets from a legacy
|
|
32-symbol sender.</p>
|
|
<blockquote>
|
|
<p><strong>Can my node install the update?</strong> Choose a release-table artifact explicitly labelled LoRa-OTA capable,
|
|
then confirm <code>ota self</code> and <code>ota status</code> expose install support; do not infer support from the filename alone.
|
|
LoRa OTA firmware is available for supported <strong>ESP32</strong> boards and nRF52 repeater targets. Every nRF52
|
|
installation also requires the OTAFIX bootloader built for that exact board; having an OTA-capable
|
|
application image alone is not enough. An intermediate repeater only relays packets and needs neither an
|
|
install-capable image nor OTAFIX. Check the bootloader release for an exact board match before attempting an update.</p>
|
|
</blockquote>
|
|
<p>The following nRF52 repeater families gained firmware-side LoRa OTA targets in
|
|
this release. Their ordinary repeater keeps its complete declared sensor recipe;
|
|
the install-capable <code>lora_ota_no_external_sensors</code> sibling is smaller:</p>
|
|
<ul>
|
|
<li>Heltec Mesh Solar, T1, and Tower V2</li>
|
|
<li>Keepteen LT1, LilyGo T-Impulse Plus, Mesh Pocket, and Nano G2 Ultra</li>
|
|
<li>Minewsemi ME25LS01, RAK3401, SenseCAP Solar, and Wio WM1110</li>
|
|
</ul>
|
|
<p>The RAK3401 <code>RAK_3401_repeater_lora_ota_no_external_sensors</code> image trims selected
|
|
optional environmental/ranging drivers but does not disable I2C. It retains the
|
|
INA219, INA226, INA260, and INA3221 voltage/current monitors, board display and
|
|
RTC support, and both RAK12500 I2C and RAK12501/L76K UART GPS paths. The four
|
|
INA drivers are only the retained voltage/current entries in the optional
|
|
environmental-sensor table; they are not the only I2C users. The SSD1306 OLED,
|
|
autodiscovered DS3231/RV3028/PCF8563/RX8130CE RTCs, and RAK12500 GPS use I2C as
|
|
separate board peripherals. Install one GPS module in sensor slot A. Slot D's
|
|
reset/PPS lines conflict with the RAK13302 radio's BUSY/DIO1 lines.</p>
|
|
<p>The firmware-configured INA3221 address and the RAK12500 address are both
|
|
<code>0x42</code>, so those devices cannot share one bus at those addresses. To install
|
|
both, leave the RAK12500 at <code>0x42</code>, strap INA3221 A0 to SCL for <code>0x43</code>, and use
|
|
a firmware build with <code>-DTELEM_INA3221_ADDRESS=0x43</code>.</p>
|
|
<p>The reduced RAK4631 profiles likewise retain the four INA monitors. The plain
|
|
repeater and Serial2 bridge retain GPS: a RAK12501 can use sensor slot A or D,
|
|
and a RAK12500 can use slot A or C. The runtime RS-232 bridge defaults to
|
|
Serial2 so the UART RAK12501 can retain Serial1. The merged runtime image always
|
|
reserves Serial1: a bounded silent probe cannot prove that a cold RAK12501 is
|
|
absent, and turning the GPS setting off cannot stop a fitted module from driving
|
|
the shared UART while WB_IO2/3V3_S remains powered. Use Serial2. Serial1 requires
|
|
an explicit no-GPS/dedicated image. The reservation remains fail-closed even
|
|
when an I2C RAK12500 is detected. The explicitly compiled
|
|
<code>RAK_4631_repeater_bridge_rs232_serial1_lora_ota_no_external_sensors</code> target
|
|
omits the combined GPS provider because its bridge owns the UART used by
|
|
RAK12501; consequently that legacy image does not expose the I2C RAK12500 path
|
|
either, even though RAK12500 itself does not use the UART.</p>
|
|
<p>Selected nRF52 repeaters with dedicated external QSPI can now stage the
|
|
complete package off-chip, so their normal full-sensor repeater build can
|
|
install a full image or an in-place delta. The current matched families are
|
|
XIAO nRF52840 and its XIAO-module derivatives, original LilyGo T-Echo,
|
|
ThinkNode M1/M6, Wio Tracker L1, SenseCAP Solar, and the dedicated RAK4631 +
|
|
RAK15001 slot-C target. The list also includes a separately wired W25Q16JV on
|
|
RAK19007 with either RAK4631 or RAK3401 + RAK13302. These require the
|
|
corresponding exact QSPI-aware OTAFIX bootloader; see
|
|
<a href="../ota_nrf52_qspi/">the nRF52 QSPI guide</a>.</p>
|
|
<p>The W25Q16 option uses one permanent RAK19007 wiring for either core: CLK/MISO/
|
|
MOSI tap IO-connector pins 26/27/28, flash CS uses J11 AIN1, and power uses J12
|
|
VDD (3.3 V) and GND. Add an approximately 10 kOhm CS-to-VDD pull-up and never
|
|
power the flash from VBAT. The three SPI signals require underside pads or an
|
|
IO-connector interposer; the easy J10/J11/J12 headers do not expose them. The
|
|
flash consumes no WisBlock slot, so a supported GPS can remain in slot A.</p>
|
|
<p>The ordinary full-sensor <code>RAK_4631_repeater</code> image remains too large for the
|
|
safe internal in-place update limit. Without external flash, use
|
|
<code>RAK_4631_repeater_lora_ota_no_external_sensors</code>; it trims selected optional
|
|
environmental/ranging drivers while retaining generic I2C, battery monitoring,
|
|
the four INA monitors, and target-compatible GPS. A RAK4631 fitted with
|
|
RAK15001 in sensor slot C can instead use
|
|
<code>RAK_4631_repeater_rak15001_slot_c_lora_ota</code> to retain the full sensor/GPS set
|
|
and stage full images or deltas off-chip.</p>
|
|
<p>For the external Winbond breakout, use
|
|
<code>RAK_4631_repeater_w25q16_lora_ota</code> on RAK4631 or
|
|
<code>RAK_3401_repeater_rak13302_w25q16_lora_ota</code> on RAK3401 + RAK13302. They retain
|
|
the full sensor/GPS recipe and require exactly a 2 MiB <code>EF4015</code> W25Q16 plus the
|
|
bootloader for that same core/radio/flash combination. Install
|
|
<code>wiscore_rak4631_w25q16</code> for RAK4631 or
|
|
<code>wiscore_rak3401_rak13302_w25q16</code> for RAK3401 + RAK13302 as a one-time
|
|
prerequisite. The physical wiring is shared, but the two firmware identities
|
|
are deliberately different and cannot be substituted for one another.</p>
|
|
<hr />
|
|
<h2 id="the-important-part-first-its-safe">The important part first: it's safe</h2>
|
|
<ul>
|
|
<li><strong>Nothing installs by itself.</strong> Your node can <em>discover</em> and download an update, but
|
|
it only <strong>installs</strong> when you say so (unless you deliberately turn on auto-install - see below).</li>
|
|
<li><strong>Bad downloads can't sneak in.</strong> Every piece of the firmware is checked against a cryptographic
|
|
fingerprint as it arrives, and the whole image is verified again before install. A corrupt or tampered
|
|
download is rejected, not installed.</li>
|
|
<li><strong>You choose who to trust.</strong> Updates can be <em>signed</em> by their author. You can tell your node to only
|
|
auto-install firmware signed by keys you've added.</li>
|
|
<li><strong>Discovery stays quiet; a transfer is deliberate.</strong> Periodic update discovery uses background priority.
|
|
Once a download starts, its transfer packets are primary traffic across every relay hop, so use
|
|
TempRadio as an OTA maintenance window when delaying unrelated mesh traffic would matter.</li>
|
|
<li><strong>It can recover.</strong> If an install ever fails, the node falls back to a safe recovery mode (you can
|
|
re-flash a known-good firmware over USB) - it won't be left bricked.</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="how-to-talk-to-your-node">How to talk to your node</h2>
|
|
<p>Connect to your node's <strong>console</strong> - usually a USB serial terminal at <strong>115200 baud</strong> (or whatever tool
|
|
you already use to manage the node). You type <code>ota ...</code> commands and the node replies in plain words.</p>
|
|
<p>The commands have short, friendly names (and most accept aliases, so you don't have to remember exact
|
|
spelling): type <strong><code>ota help</code></strong> any time to see the list, or just <strong><code>ota</code></strong> for a status summary.</p>
|
|
<hr />
|
|
<h2 id="common-tasks">Common tasks</h2>
|
|
<h3 id="1-see-what-im-running-and-whether-anything-is-going-on">1. See what I'm running and whether anything is going on</h3>
|
|
<pre><code>ota status
|
|
</code></pre>
|
|
<p>Shows your current firmware version, your node's update "target" (its hardware/role id), and whether a
|
|
download is in progress.</p>
|
|
<p>For a denser admin view - your firmware's content id (<code>mid</code>) <strong>and</strong> its body hash, the fingerprint of the
|
|
set you're serving, live download progress, and the current policy - use:</p>
|
|
<pre><code>ota stats
|
|
</code></pre>
|
|
<p>On a remote node this is <strong>admin-only</strong> (the remote command console requires the admin password) - send it
|
|
from the app's repeater command screen, or the WiFi/serial OTA console.</p>
|
|
<h3 id="2-find-updates-available-near-me">2. Find updates available near me</h3>
|
|
<pre><code>ota ls
|
|
ota ls 2 # page 2 when more than two updates are available
|
|
</code></pre>
|
|
<p>Your node asks around and lists the firmware updates other nodes nearby are offering, in plain words -
|
|
each with a temporary <strong>number</strong>, a stable eight-hex <strong>manifest ID</strong>, its version, whether it's a full image
|
|
or a small delta, how many nodes have it, and how recently it was seen. For example:</p>
|
|
<pre><code>Updates 1/1 (2 src; refreshing):
|
|
1) 838B8169 v1.2.3 delta [same target] 3n 5s
|
|
2) BF0AB0C4 v1.2.0 full [unsupported] 1n 12s
|
|
</code></pre>
|
|
<p>Each row shows the version, full-vs-delta, <strong>whether it fits your node</strong>, how many nodes have it, and how
|
|
long ago it was seen. The fit marker:</p>
|
|
<ul>
|
|
<li><strong>[same target]</strong> - the advertised target ID matches this hardware-and-role build. Download and apply
|
|
still enforce codec, bootloader, signed hardware tag, base hash, and integrity checks.</li>
|
|
<li><strong>[unsupported]</strong> - the target may match, but this build or its bootloader cannot apply that codec. A common
|
|
example is the source node's self-served <strong>full</strong> image on an internal-staging nRF52, which needs an
|
|
in-place delta. A matched external-QSPI nRF52 can accept that full codec.</li>
|
|
<li><strong>[rescue]</strong> - an installable in-place nRF52 delta for the same target, but this running firmware has no
|
|
valid app-side EndF. It requires the explicit rescue download and install flow below.</li>
|
|
<li><strong>[name]</strong> - a different known board or role (for example <code>[ProMicro_companion_radio_usb]</code>). Don't install it.</li>
|
|
<li><strong>[?]</strong> - can't tell (a build with no target id set, e.g. a bare IDE build rather than a release build).</li>
|
|
</ul>
|
|
<p>Run it again after a few seconds - discovery happens in the background, so the list fills in. Nothing is
|
|
downloaded yet; this is just looking around. <code>refreshing</code> means the command has just sent asynchronous
|
|
catalog queries, so run it again even when an older row is already visible. Two updates fit in each remote
|
|
CLI reply; use <code>ota ls 2</code>, <code>ota ls 3</code>, and so on for later pages. Catalog rows can change while replies arrive,
|
|
so use the displayed manifest ID for scripts and important operations rather than a numeric position.
|
|
(<code>ota neighbors</code> / <code>ota updates</code> also work.)</p>
|
|
<h3 id="3-download-an-update">3. Download an update</h3>
|
|
<p>Pick one from the list by its stable <strong>manifest ID</strong> (a number also works for interactive use), and say
|
|
<strong>where</strong> to put it:</p>
|
|
<pre><code>ota pull 838B8169 flash # stage it in this node's flash, to install here
|
|
ota pull 838B8169 folder # capture it onto a connected motatool folder as <id>.mota
|
|
ota pull 838B8169 folder validate # warm-start capture from a motatool --seed build (much faster; below)
|
|
</code></pre>
|
|
<p>The destination is required - <code>ota pull 838B8169</code> on its own just shows the choices. <strong><code>flash</code></strong> is always
|
|
available (stage here, then <code>ota install</code>). <strong><code>folder</code></strong> appears only while a <code>motatool serve</code> link is
|
|
attached (it shows the link, e.g. <code>folder: tcp 192.168.4.5</code>); it streams the firmware straight onto the
|
|
host folder - nothing is staged on this node. That's how you grab an <strong>exact copy of another device's
|
|
firmware</strong> off the mesh (to a <code>.mota</code> file) so you can later build a <em>delta</em> against firmware you don't
|
|
otherwise have. (<code>ota get</code> is an alias.)</p>
|
|
<p><strong><code>validate</code> (warm-start, advanced).</strong> Capturing a full image over the radio is slow. If you have a
|
|
<em>similar</em> build on the computer (e.g. a fresh recompile of the same firmware), run motatool with
|
|
<code>--seed <that.mota></code> and add <strong><code>validate</code></strong>: the node fetches just the target's block fingerprints, keeps
|
|
every block your seed already matches, and pulls over the radio only the handful that actually differ -
|
|
turning a ~30-minute capture into seconds. The result is still a byte-exact, verified copy of the target.</p>
|
|
<p><em>Where the seed comes from:</em> it is the <strong><code>--seed <file></code> you pass to <code>motatool serve</code></strong> - <strong>not</strong> a file you
|
|
drop into the capture (<code>--dir</code>) folder, which is only the destination and starts empty. There is exactly one
|
|
configured seed. When you run <code>... folder validate</code>, the node asks motatool to begin the capture and motatool
|
|
stamps that seed's payload into the fresh <code>.part</code> in the same step - so it is always the file you named, with
|
|
no guessing. <strong><code>validate</code> is the switch:</strong> a plain <code>folder</code> pull ignores any seed and fetches from scratch;
|
|
re-running a <code>validate</code> pull re-begins fresh (it never resumes a stale partial). Nothing about the seed is
|
|
trusted - every kept block is checked against the target's own fingerprints, so a mismatched or missing seed
|
|
just means those blocks are fetched over the radio (correct result, only slower).</p>
|
|
<p>The node fetches from one source as <strong>primary traffic</strong>, with bounded adaptive request flights. Every session
|
|
probes with one manifest block, then clean flights grow <code>1 -> 2 -> 3 -> 4</code> blocks on RAK3401 OTA builds. New
|
|
application packages use 2 KiB blocks; deployed 1 KiB packages remain supported. All blocks
|
|
in a flight share one request packet, and the receiver stays silent until the source/relays finish returning
|
|
them. A recovery halves the next flight. Retry timing follows the active SF/BW airtime, duty budget, and path
|
|
length, so faster settings recover sooner without a fixed one-second request colliding with a valid multi-hop
|
|
response. Mesh repeaters carry the packets only while their temporary-radio windows are active.
|
|
Check progress with <code>ota status</code>.</p>
|
|
<p>If a <code>folder</code> pull loses its link mid-transfer, <code>ota status</code> shows <strong>paused</strong> - the host keeps the
|
|
partial and the pull resumes (filling only what's missing) the moment you reconnect motatool; it never
|
|
falls back to flash. A TCP disconnect preserves the selected image even if it happens before its manifest
|
|
arrives or during the final save. Reconnect through the same transport; an interrupted manifest or seed
|
|
comparison restarts initialization, while a partial transfer rechecks its stored blocks. The paused capture
|
|
keeps its OTA workspace until reconnection or cancellation. To <strong>stop</strong> a download you no longer want:</p>
|
|
<pre><code>ota cancel
|
|
</code></pre>
|
|
<p>For a download staged on the node, success means current firmware also
|
|
invalidated the persistent flash/SD/QSPI copy; it reports an error if that
|
|
media operation cannot be verified. For a <code>folder</code> capture, cancel only
|
|
detaches the live session and retains the host partial so it can be resumed or
|
|
removed on the host deliberately. On a MeshTower SD auto-archive capture,
|
|
cancel also detaches the live archive session and retains its card partial for
|
|
the archive service to resume later; use <code>ota cache off</code> to stop new archive
|
|
captures.</p>
|
|
<h3 id="4-install-a-downloaded-update">4. Install a downloaded update</h3>
|
|
<p>Once <code>ota status</code> shows the download is <strong>ready to install</strong>:</p>
|
|
<pre><code>ota install
|
|
</code></pre>
|
|
<p>The node verifies the firmware one last time, and if everything checks out it installs it and <strong>reboots
|
|
into the new version</strong>. If the check fails, it tells you why and does <strong>not</strong> install. Unsigned images
|
|
normally install only through this explicit command. The MeshTower V2 SD target is stricter and requires an
|
|
allowlisted signature even for a manual application install, because it authorizes removable-media bytes for
|
|
the bootloader. A signed image whose signer is not in the device allowlist is rejected; trusted signed images
|
|
can auto-install only when that policy is enabled and the signed version is strictly newer than the running
|
|
hash-valid EndF version. Manual <code>ota install</code> remains the deliberate equal-version/rollback override.</p>
|
|
<p>After it reboots, run <code>ota status</code> to confirm the new version.</p>
|
|
<h3 id="updating-an-nrf52-bootloader-advanced-explicit-only">Updating an nRF52 bootloader (advanced, explicit only)</h3>
|
|
<p>This is available on specially marked no-external-flash nRF52840 lean
|
|
repeater/bridge builds, on the legacy XIAO nRF52840/Sense raw-QSPI builds, and
|
|
on the exact <code>Heltec_tower_v2_sdcard_repeater_lora_ota_no_external_sensors</code>
|
|
microSD build,
|
|
after a one-time exact-board ABI-3 OTAFIX installation over USB/BLE DFU or
|
|
SWD. It is not the normal firmware update path. Check support first:</p>
|
|
<pre><code class="language-text">ota bootloader
|
|
</code></pre>
|
|
<p>The reply must show a CRC-valid installed identity plus ABI 3 and the exact
|
|
storage/boot-update capability bits for that build (<code>0x09</code> for MeshTower V2
|
|
microSD, <code>0x0A</code> for the shared internal store, or <code>0x0E</code> for XIAO raw QSPI). A bootloader package appears as
|
|
<code>bootloader</code> in <code>ota ls</code>. It is never downloaded or installed automatically,
|
|
even if both OTA automation settings are enabled. Use its stable ID explicitly:</p>
|
|
<pre><code class="language-text">ota pull <MID8> flash
|
|
# wait until ota status says this bootloader download is ready
|
|
ota bootloader
|
|
ota bootloader install <MID8> <HASH16>
|
|
</code></pre>
|
|
<p>Copy both confirmation values exactly from the second <code>ota bootloader</code> reply.
|
|
Ordinary <code>ota install</code> deliberately refuses this package. The privileged
|
|
command requires an exact 40 KiB candidate payload in the fixed 41,330-byte
|
|
container, a valid exact embedded identity/CRC and vector table, continued
|
|
boot-update support, required <code>BLM2</code>/<code>SOFT</code> continuity metadata at canonical
|
|
raw-image offset <code>0x9FB4</code>, a boot version
|
|
that exactly matches the package and is newer than installed BLM2, and a valid
|
|
signature from a key already in <code>ota key</code>'s trusted allowlist. It preserves the
|
|
running application while OTAFIX replaces itself; <code>blup:C8</code> in post-reboot
|
|
<code>ota status</code> means success. Remote rollback is refused. Any node lacking this
|
|
command or those capabilities must update its bootloader locally instead.</p>
|
|
<p>On an internal-flash target, the package shares the ordinary store below
|
|
<code>0xED000</code> and bottom-aligns at <code>0xE2000</code>; there is no separate reserved scratch
|
|
bank. A valid live <code>EndF</code> must prove the current image ends at or below that
|
|
address before any page is erased. If <code>EndF</code> is missing/corrupt or the app is
|
|
too large, the pull is refused and local DFU/SWD is required.
|
|
On the MeshTower V2 SD target, the application linker remains at <code>0xED000</code>, but
|
|
bootloader replacement needs temporary scratch beginning at <code>0xE0000</code>. A
|
|
hash-valid live <code>EndF</code> must therefore prove the complete current image ends by
|
|
<code>0xE0000</code>. A CRC-bound boot-settings bank must cover that complete image while
|
|
also ending by <code>0xE0000</code>. MeshCore binds both application and bootloader SD
|
|
approval to purpose, exact raw geometry, and a normalized SHA-256 in a
|
|
reset-retained <code>MOTASDA2</code> record. Boot updates also bind the exact authenticated
|
|
signed image hash in the E0000 token. OTAFIX consumes the retained record before
|
|
media access, so a later card change or power cycle fails instead of authorizing
|
|
different bytes. MeshCore never claims or writes raw sector 1. Both application
|
|
and bootloader OTA wait until a matching BLM2 bootloader has been provisioned
|
|
locally; preview.12 requires USB/BLE DFU or SWD first.
|
|
Larger applications can continue to use normal application mOTA;
|
|
only bootloader self-update is refused.
|
|
See <a href="../ota_nrf52_bootloader_update/">the nRF52 bootloader-update guide</a> for the
|
|
complete target inventory, storage layouts, and safety contract.</p>
|
|
<h3 id="5-if-something-goes-wrong">5. If something goes wrong</h3>
|
|
<ul>
|
|
<li>A download that stalls or gets interrupted just <strong>resumes</strong> later. Use
|
|
<code>ota cancel</code> to durably discard device staging; a folder capture keeps its
|
|
host partial for a later resume.</li>
|
|
<li>A legacy app-only internal-flash <strong>nRF52</strong> that still runs but reports <code>no EndF</code> can use the pre-provisioned rescue path
|
|
if its physical EndF is intact and only app-side validation is failing. Fetch the exact <code>[rescue]</code>
|
|
in-place delta with an explicit acknowledgement, obtain its 16-hex-digit <code>base_hash</code> from the package
|
|
metadata, then run:</li>
|
|
</ul>
|
|
<p><code>text
|
|
ota pull <mid8> flash rescue
|
|
# wait for ota status to say ready to install
|
|
ota rescue install <base_hash16></code></p>
|
|
<p>This is not a force option. It refuses a normally valid EndF, a different package hash, hardware or
|
|
target mismatch, corrupt payload, and invalid/untrusted signatures. The bootloader independently hashes
|
|
the running app and rejects a wrong base before writing the app. If the physical EndF is absent or the
|
|
rescue commands were not already in the running firmware, recover over USB.
|
|
Release chains should put this command in their first bridge and keep it in every bridge after that.
|
|
The shared-internal bootloader-update builds are intentionally excluded:
|
|
without valid live <code>EndF</code>, they refuse every internal pull before erase
|
|
because their normal application can extend through <code>0xED000</code>. Recover one
|
|
of those builds over USB/BLE DFU or SWD.
|
|
- If an <strong>install</strong> fails, the node won't boot a broken image - it lands in <strong>recovery mode</strong>:
|
|
- <strong>nRF52:</strong> it appears as a USB drive; drag a known-good firmware <code>.uf2</code> for that exact board onto it
|
|
to recover.
|
|
- <strong>ESP32:</strong> it keeps the previous firmware in the other slot and rolls back.
|
|
- When in doubt, you can always re-flash over USB the normal way.</p>
|
|
<hr />
|
|
<h2 id="adjust-lora-ota-speed">Adjust LoRa OTA speed</h2>
|
|
<p>Use one saved speed factor for this node's LoRa OTA traffic:</p>
|
|
<pre><code class="language-text">get ota.speed
|
|
set ota.speed 0.5
|
|
set ota.speed .05
|
|
set ota.speed 3
|
|
set ota.speed 1
|
|
</code></pre>
|
|
<p>The range is <strong>0.05 through 3</strong>, including decimals. <strong>1 is the existing timing</strong>.
|
|
At <code>0.5</code>, adjustable OTA delays are twice as long; at <code>0.05</code>, they are twenty
|
|
times as long. At <code>3</code>, adjustable delays are divided by three. Actual transfer
|
|
speed also depends on packet airtime, the configured airtime budget, relays,
|
|
and packet loss; <code>3</code> does not guarantee three times the throughput.</p>
|
|
<p>The factor covers OTA requests and responses (catalog, manifest, leaves, DATA,
|
|
and proofs), OTA relay delays, discovery jitter, and automatic OTA adverts.
|
|
Below <code>1</code>, the transmit queue also spaces out <strong>every OTA packet</strong>, including
|
|
both profile copies, while letting ordinary messages run. Recovery waits grow
|
|
for slower transfers; faster settings retain the existing retry allowance so
|
|
they do not retry before a physical response train can finish. The radio's
|
|
frequency, bandwidth, SF, coding rate, preamble, and airtime budget stay as set.
|
|
The proof turnaround allowance also keeps its existing physical minimum.
|
|
Dual-profile timing accounts for the participating profiles and reply copies;
|
|
it does not vary with the scanner's current visit. Deliberate slow pacing is
|
|
excluded from observer builds' stale-packet age, while congestion still ages
|
|
queued packets normally.</p>
|
|
<p>Set the same factor on the <strong>source, destination, and OTA relays</strong>. It is a
|
|
local setting, not a value negotiated with peers. A slow source paired with a
|
|
receiver at <code>1</code> can cause unnecessary retries. The setting takes effect during
|
|
an active session, survives reboot and temporary-radio expiry, and applies to
|
|
OTA on either radio profile. <code>set ota.speed 1</code> restores the previous pace.
|
|
Ordinary chat, node adverts, and USB/WiFi source transfers keep their timing.
|
|
Local verification of a staged image and leaf comparisons keep their normal
|
|
maintenance rate even when LoRa pacing is slow.
|
|
If the local transmit queue cannot accept a catalog, manifest, or leaf request,
|
|
OTA keeps it pending without consuming a network retry. Successfully queued
|
|
requests that receive no answer still have bounded retries.
|
|
Blocked block requests also preserve the v2 transfer format and fragments
|
|
already received; queue congestion alone does not trigger legacy fallback.
|
|
Retry timing includes the primary channel when an RX-only temporary radio2
|
|
uses crossover to send requests there.</p>
|
|
<p><code>ota config speed 0.5</code> is an equivalent setter. <code>ota config speed</code> and
|
|
<code>ota speed</code> read the current factor; the <code>ota config</code> summary also includes it.
|
|
The setting is available on OTA-enabled repeaters, rooms, sensors, Companions,
|
|
and seeder-only builds. Its separate <code>/ota_speed</code> settings file preserves the
|
|
existing preference layouts and does not need an active OTA workspace.</p>
|
|
<h2 id="optional-let-it-update-automatically">Optional: let it update automatically</h2>
|
|
<p>By default your node only <em>discovers</em> updates - it won't download or install on its own. If you want more
|
|
automation (e.g. for a remote node you can't easily reach), you can opt in. These settings are saved.</p>
|
|
<pre><code>ota config autofetch any # auto-DOWNLOAD any compatible update for this node (still won't install)
|
|
ota config autofetch signed # auto-download only signed updates
|
|
ota config autofetch off # back to manual (default)
|
|
|
|
ota config autoinstall trusted # auto-INSTALL only a trusted signed version newer than the running EndF
|
|
ota config autoinstall off # never auto-install (default)
|
|
|
|
ota config advert 1440 # re-advertise every N minutes while temp radio is running
|
|
ota config advert 0 # only advertise when a temp-radio window starts
|
|
|
|
ota config hops 3 # how far OTA travels: accept from / relay up to N repeater hops (default 3)
|
|
ota config hops 0 # only exchange OTA with directly-connected nodes (never relay)
|
|
|
|
ota config # show the current settings
|
|
</code></pre>
|
|
<p>These policies also govern automatic adoption of an interrupted staged download after reboot. <code>off</code> leaves
|
|
it untouched, <code>signed</code> requires the stored manifest's signed flag, and automatic resume requires the stored
|
|
target to match this node and its version to be newer than the running valid EndF. Reissuing an explicit
|
|
<code>ota pull <MID8></code> remains the deliberate override for an older or unsigned partial.
|
|
For bring-up/debugging, <code>ota dev resume <MID8></code> performs the same explicit MID-bound re-adoption without
|
|
starting a new network fetch. After reboot it requires the MID; bare <code>ota dev resume</code> is accepted only while
|
|
an active/requested session MID still exists, and malformed or missing identifiers are rejected.
|
|
If raw flash contains multiple valid staged headers, automatic resume leaves them untouched rather than
|
|
guessing which is newest. Specify the intended MID to select its unique checkpoint; ambiguous matches are
|
|
rejected. Temporary storage read failures no longer consume a download slot indefinitely: host storage
|
|
pauses for reconnection, while non-reconnectable storage reports a storage error and can be retried.</p>
|
|
<p>Recommended for most people: leave both <strong>off</strong> and update by hand. Use <code>autoinstall trusted</code> only once
|
|
you've added the signer's key (next section) and you trust them to push updates unattended. Automatic
|
|
admission and final apply both reject zero, equal, or older signed versions; a dishonest catalog version
|
|
cannot bypass the manifest check. Use manual <code>ota pull</code> plus <code>ota install</code> for an intentional rollback.</p>
|
|
<p>The MeshTower V2 SD OTA target has a separate, default-on <strong>archive</strong> policy. It saves all mOTAs it sees
|
|
to the SD card so the repeater can seed them later; this does not install them and does not change the
|
|
install-oriented <code>autofetch</code> default above. Use <code>ota cache</code> for status and <code>ota cache off</code> or
|
|
<code>ota config cache off</code> to stop new archive captures. Already cached files remain available to peers.
|
|
Manual <code>ota pull</code> commands take priority and an interrupted archive capture resumes later.
|
|
See <a href="../ota_meshtower_v2_sdcard/#preload-many-motas-from-a-computer">Preload many mOTAs from a computer</a>
|
|
for the required <code>/mota/<manifest-id>.mota</code> filenames and the complete TempRadio seeding workflow.</p>
|
|
<hr />
|
|
<h2 id="optional-only-trust-updates-from-specific-people">Optional: only trust updates from specific people</h2>
|
|
<p>If you'll use auto-install, tell your node which signing keys to trust. The firmware author shares their
|
|
<strong>public</strong> key (a hex string); you add it:</p>
|
|
<pre><code>ota key add <public-key-hex> # trust this signer
|
|
ota key list # show trusted signers
|
|
ota key rm <public-key-hex> # stop trusting one
|
|
</code></pre>
|
|
<p>Only strictly newer updates signed by a trusted key are eligible for auto-install. Manual <code>ota install</code>
|
|
permits an unsigned package after all integrity, hardware, base, and bootloader checks pass, except on the
|
|
MeshTower V2 removable-SD path where all application installs must be signed and allowlisted. A signed
|
|
package whose signer is not in the device allowlist is rejected rather than silently treated as unsigned.</p>
|
|
<hr />
|
|
<h2 id="sharing-updates-with-others-advanced">Sharing updates with others (advanced)</h2>
|
|
<h3 id="relay-a-folder-of-firmware-from-a-computer">Relay a folder of firmware from a computer</h3>
|
|
<p>If your node is connected to a computer (e.g. a gateway on a Raspberry Pi), it can <strong>hand out</strong> a whole
|
|
folder of firmware files to the mesh - without storing them itself. Useful for seeding a new release to a
|
|
remote area.</p>
|
|
<ol>
|
|
<li>Put the firmware files (<code>.mota</code> files - see below) in a folder on the computer.</li>
|
|
<li>Install the helper tool once - the standalone <code>motatool</code> CLI (<a href="https://github.com/vk496/motatool">https://github.com/vk496/motatool</a>) -
|
|
then point it at your node and the folder - over the node's <strong>USB serial</strong>, over <strong>WiFi</strong> if it is
|
|
an ESP32 WiFi companion or FULL ESP32 node, or over encrypted <strong>Bluetooth</strong> if it is an nRF52 Full Companion:
|
|
<code>git clone https://github.com/vk496/motatool && cargo install --path ./motatool
|
|
# over USB serial:
|
|
motatool serve --dir ./my_firmware/ --serial /dev/ttyACM0 -v
|
|
# ...or over WiFi: the seeder is on dedicated TCP port 5001:
|
|
motatool serve --dir ./my_firmware/ --tcp 192.168.1.50:5001 -v
|
|
# ...or over paired BLE to an nRF52 Full Companion (protocol v14):
|
|
python3 tools/ble_mota/ble_mota_seeder.py \
|
|
--device MeshCore-MyCompanion --dir ./my_firmware/</code>
|
|
It answers the node's requests; your node then advertises those updates to neighbours, who can
|
|
<code>ota get</code> them like any other. (A WiFi node prints its IP + seeder port to the serial log on connect.
|
|
Details: <a href="https://github.com/vk496/motatool">https://github.com/vk496/motatool</a>.)</li>
|
|
</ol>
|
|
<p>Check the device's attach reply or run <code>ota folder</code>: <code>host=X/Y</code> means the firmware is advertising <code>X</code> of
|
|
the <code>Y</code> valid entries reported by the host. Serve registries are deliberately RAM-bounded on smaller builds,
|
|
and the node's own firmware also consumes a slot. If <code>X < Y</code>, split the chain across seeders/folders or use
|
|
a higher-capacity seeder; <code>motatool</code> saying that every file is valid does not mean every file fit on-device.</p>
|
|
<p>To stop, just stop the daemon - over WiFi the node auto-detaches when the connection closes; over USB you
|
|
can also run <code>ota folder off</code> on the node. <code>ota folder</code> on its own lists what your node is offering.
|
|
On a FULL repeater or room server, run <code>start webconfig</code> first if WiFi is not
|
|
already active. Other FULL roles with browser OTA support can use the
|
|
<code>MeshCore-OTA</code> access point from <code>start ota</code> and connect to
|
|
<code>192.168.4.1:5001</code>. Every LoRa participant still needs an overlapping
|
|
<code>tempradio</code> window.</p>
|
|
<h3 id="everyone-helps-share">Everyone helps share</h3>
|
|
<p>You don't have to be a gateway to help. Once <strong>any</strong> node finishes downloading an update, it automatically
|
|
offers it to <em>its</em> neighbours too. So a new firmware spreads outward node-to-node, instead of everyone
|
|
hammering the one node that had it first. Discovery remains background traffic; an actual transfer is
|
|
primary traffic for the duration of its TempRadio maintenance window.</p>
|
|
<hr />
|
|
<h2 id="where-firmware-files-come-from">Where firmware files come from</h2>
|
|
<p>OTA distributes <strong><code>.mota</code></strong> files - a packaged, verifiable firmware image (full image or a small "delta"
|
|
that only contains what changed). You get them by:</p>
|
|
<ul>
|
|
<li><strong>Downloading a build.</strong> This fork publishes a rolling <strong><code>dev-latest</code></strong> release on GitHub with the
|
|
current firmware for many boards, each accompanied by a <code>.full.mota</code> and a tiny <code>.delta.mota</code>. Grab the
|
|
one for your board to test.</li>
|
|
<li><strong>Building your own</strong> with the <code>mota</code> packaging tool - see <a href="https://github.com/mikecarper/MeshCore/blob/keymindCascade/tools/mota/README.md">tools/mota/README.md</a>
|
|
(this is for people distributing updates, not everyday operators).</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="quick-reference">Quick reference</h2>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>I want to...</th>
|
|
<th>Command</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>List all commands</td>
|
|
<td><code>ota help</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>See my firmware + any download</td>
|
|
<td><code>ota status</code> (or just <code>ota</code>)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Admin: ids/hashes + serving + policy</td>
|
|
<td><code>ota stats</code> (admin-only remotely)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Find updates nearby</td>
|
|
<td><code>ota ls</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Download a listed update for installation</td>
|
|
<td><code>ota get <mid8> flash</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Cancel a download</td>
|
|
<td><code>ota cancel</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Install a finished download</td>
|
|
<td><code>ota install</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Recover app-side <code>no EndF</code> on a legacy app-only internal nRF52</td>
|
|
<td><code>ota rescue install <base_hash16></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Turn on auto-download</td>
|
|
<td><code>ota config autofetch any</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Turn on auto-install (trusted only)</td>
|
|
<td><code>ota config autoinstall trusted</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Trust a signer</td>
|
|
<td><code>ota key add <hex></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Relay a folder (gateway)</td>
|
|
<td><code>ota folder on</code> + the seeder daemon</td>
|
|
</tr>
|
|
<tr>
|
|
<td>List what I'm offering</td>
|
|
<td><code>ota folder</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>(Older names still work too: <code>neighbors</code>/<code>updates</code> = <code>ls</code>, <code>pull</code> = <code>get</code>, <code>applydelta</code>/<code>apply</code> = <code>install</code>, <code>drop</code>/<code>stop</code> = <code>cancel</code>.)</p>
|
|
<hr />
|
|
<h2 id="a-few-terms">A few terms</h2>
|
|
<ul>
|
|
<li><strong>Firmware</strong> - the software running your node. Updating it can add features or fix bugs.</li>
|
|
<li><strong><code>.mota</code></strong> - a packaged firmware update file, with built-in integrity checks.</li>
|
|
<li><strong>Target</strong> - your node's hardware + role identity. Your node only auto-fetches updates built for the
|
|
same target, so it won't grab firmware meant for a different board.</li>
|
|
<li><strong>Delta</strong> - a small update containing only the changes from your current firmware (faster to send than a
|
|
full image). Your node rebuilds the complete firmware from it and verifies the result before installing.</li>
|
|
<li><strong>Signed</strong> - the update carries the author's cryptographic signature, so you can verify who made it.</li>
|
|
</ul>
|
|
<p>For the full technical details (the file format and the radio protocol), see
|
|
<a href="../ota_protocol/">the OTA protocol spec</a>.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
|
|
|
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-copyright">
|
|
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
|
|
|
|
|
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
|
|
|
|
<script src="../_javascript/firmware_picker.js"></script>
|
|
|
|
<script src="../_javascript/telemetry_decoder.js"></script>
|
|
|
|
<script src="../_javascript/filter_tool.js"></script>
|
|
|
|
|
|
</body>
|
|
</html> |