Files
HaloKeymind/payloads/index.html
T
2026-10-19 03:47:18 +00:00

4231 lines
74 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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/payloads/">
<link rel="prev" href="../packet_format/">
<link rel="next" href="../ota_protocol/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Payloads - 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/notification_builder.css?v=20261006-channel9">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css?v=20261013-pick-first-1">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/management_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
<link rel="stylesheet" href="../_stylesheets/preset_test.css?v=20260923-2">
<link rel="stylesheet" href="../_stylesheets/esp32_partition_catalog.css?v=20261001-1">
<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="#payload-format" 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">
Payloads
</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">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Firmware and tools
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Firmware and tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<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="../notifications/" class="md-nav__link">
<span class="md-ellipsis">
Notifications
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../preset_test/" class="md-nav__link">
<span class="md-ellipsis">
Preset test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filter_tool/" class="md-nav__link">
<span class="md-ellipsis">
Filter tool
</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="../management_decoder/" class="md-nav__link">
<span class="md-ellipsis">
Management decoder
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Documentation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
<span class="md-ellipsis">
Getting started and features
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Getting started and features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
Faq
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Full profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../role_feature_switches/" class="md-nav__link">
<span class="md-ellipsis">
Role feature switches
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_features/" class="md-nav__link">
<span class="md-ellipsis">
Full companion features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_radio_full/" class="md-nav__link">
<span class="md-ellipsis">
Companion radio full
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_usb_switcher/" class="md-nav__link">
<span class="md-ellipsis">
Full companion usb switcher
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_offline_queue/" class="md-nav__link">
<span class="md-ellipsis">
Companion offline queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../halo_keymind_settings/" class="md-nav__link">
<span class="md-ellipsis">
Halo keymind settings
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2" id="__nav_3_2_label" tabindex="0">
<span class="md-ellipsis">
Firmware updates and partitions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Firmware updates and partitions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../upgrading_1.17.1.8_to_1.17.1.9/" class="md-nav__link">
<span class="md-ellipsis">
Upgrading 1.17.1.8 to 1.17.1.9
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_user_guide/" class="md-nav__link">
<span class="md-ellipsis">
Ota user guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_easy/" class="md-nav__link">
<span class="md-ellipsis">
Ota easy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lora_ota_automation/" class="md-nav__link">
<span class="md-ellipsis">
Lora ota automation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
<span class="md-ellipsis">
Ota nrf52 bootloader update
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_qspi/" class="md-nav__link">
<span class="md-ellipsis">
Ota nrf52 qspi
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
<span class="md-ellipsis">
Ota meshtower v2 sdcard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_partition_catalog/" class="md-nav__link">
<span class="md-ellipsis">
Esp32 partition catalog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_wifi_partition_migration/" class="md-nav__link">
<span class="md-ellipsis">
Esp32 wifi partition migration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../heltec_v4_wifi_partition_migration/" class="md-nav__link">
<span class="md-ellipsis">
Heltec v4 wifi partition migration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../host_cli_service/" class="md-nav__link">
<span class="md-ellipsis">
Host cli service
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
<span class="md-ellipsis">
Radio, networking, and power
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Radio, networking, and power
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../radio_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Radio profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../fleet_management/" class="md-nav__link">
<span class="md-ellipsis">
Private fleet management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../room_services/" class="md-nav__link">
<span class="md-ellipsis">
Room services
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave/" class="md-nav__link">
<span class="md-ellipsis">
Carrier wave
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../espnow_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
Espnow bridge setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../WiFi/" class="md-nav__link">
<span class="md-ellipsis">
WiFi
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
<span class="md-ellipsis">
Flood filtering
</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="../companion_lost_reply/" class="md-nav__link">
<span class="md-ellipsis">
Companion lost reply
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sensor_tracker/" class="md-nav__link">
<span class="md-ellipsis">
Sensor tracker
</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>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4" checked>
<label class="md-nav__link" for="__nav_3_4" id="__nav_3_4_label" tabindex="0">
<span class="md-ellipsis">
CLI and protocol reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
CLI and protocol reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<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_build_matrix/" class="md-nav__link">
<span class="md-ellipsis">
Cli build matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_command_availability/" class="md-nav__link">
<span class="md-ellipsis">
Cli command availability
</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="../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Kiss modem protocol
</span>
</a>
</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 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">
Payloads
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Payloads
</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="#important-concepts" class="md-nav__link">
<span class="md-ellipsis">
Important concepts:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-advertisement" class="md-nav__link">
<span class="md-ellipsis">
Node advertisement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#acknowledgement" class="md-nav__link">
<span class="md-ellipsis">
Acknowledgement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returned-path-request-response-and-plain-text-message" class="md-nav__link">
<span class="md-ellipsis">
Returned path, request, response, and plain text message
</span>
</a>
<nav class="md-nav" aria-label="Returned path, request, response, and plain text message">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#returned-path" class="md-nav__link">
<span class="md-ellipsis">
Returned path
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request" class="md-nav__link">
<span class="md-ellipsis">
Request
</span>
</a>
<nav class="md-nav" aria-label="Request">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#get-stats" class="md-nav__link">
<span class="md-ellipsis">
Get stats
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-telemetry" class="md-nav__link">
<span class="md-ellipsis">
Get Telemetry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-minmaxave-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Get Min/Max/Ave (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#subscribe-to-telemetry-push-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Subscribe to Telemetry push - (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unsubscribe-from-telemetry-push-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Unsubscribe from Telemetry push - (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-access-list" class="md-nav__link">
<span class="md-ellipsis">
Get Access List
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-neighbors" class="md-nav__link">
<span class="md-ellipsis">
Get Neighbors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-owner-info" class="md-nav__link">
<span class="md-ellipsis">
Get Owner Info
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#response" class="md-nav__link">
<span class="md-ellipsis">
Response
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plain-text-message" class="md-nav__link">
<span class="md-ellipsis">
Plain text message
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#anonymous-request" class="md-nav__link">
<span class="md-ellipsis">
Anonymous request
</span>
</a>
<nav class="md-nav" aria-label="Anonymous request">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#companion-one-key-dm-introduction" class="md-nav__link">
<span class="md-ellipsis">
Companion one-key DM introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#room-server-login" class="md-nav__link">
<span class="md-ellipsis">
Room server login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeatersensor-login" class="md-nav__link">
<span class="md-ellipsis">
Repeater/Sensor login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-regions-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Regions request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-owner-info-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Owner info request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-clock-and-status-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Clock and status request
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#group-text-message" class="md-nav__link">
<span class="md-ellipsis">
Group text message
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#group-datagram" class="md-nav__link">
<span class="md-ellipsis">
Group datagram
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#control-data" class="md-nav__link">
<span class="md-ellipsis">
Control data
</span>
</a>
<nav class="md-nav" aria-label="Control data">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#discover_req-sub_type" class="md-nav__link">
<span class="md-ellipsis">
DISCOVER_REQ (sub_type)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#discover_resp-sub_type" class="md-nav__link">
<span class="md-ellipsis">
DISCOVER_RESP (sub_type)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#trace" class="md-nav__link">
<span class="md-ellipsis">
Trace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multipart" class="md-nav__link">
<span class="md-ellipsis">
Multipart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ota" class="md-nav__link">
<span class="md-ellipsis">
OTA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-packet" class="md-nav__link">
<span class="md-ellipsis">
Custom packet
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../ota_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Ota protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../management_reports/" class="md-nav__link">
<span class="md-ellipsis">
Management reports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats binary frames
</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="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
Qr codes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Docs
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../research/" class="md-nav__link">
<span class="md-ellipsis">
Research
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_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_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Releases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Current release
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Current release
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../releases/1.17.1.9/" class="md-nav__link">
<span class="md-ellipsis">
1.17.1.9 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.8/" class="md-nav__link">
<span class="md-ellipsis">
1.17.1.8 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../test-results/" class="md-nav__link">
<span class="md-ellipsis">
Test Results
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../old-releases/" class="md-nav__link">
<span class="md-ellipsis">
Old Releases
</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="#important-concepts" class="md-nav__link">
<span class="md-ellipsis">
Important concepts:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-advertisement" class="md-nav__link">
<span class="md-ellipsis">
Node advertisement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#acknowledgement" class="md-nav__link">
<span class="md-ellipsis">
Acknowledgement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returned-path-request-response-and-plain-text-message" class="md-nav__link">
<span class="md-ellipsis">
Returned path, request, response, and plain text message
</span>
</a>
<nav class="md-nav" aria-label="Returned path, request, response, and plain text message">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#returned-path" class="md-nav__link">
<span class="md-ellipsis">
Returned path
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request" class="md-nav__link">
<span class="md-ellipsis">
Request
</span>
</a>
<nav class="md-nav" aria-label="Request">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#get-stats" class="md-nav__link">
<span class="md-ellipsis">
Get stats
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-telemetry" class="md-nav__link">
<span class="md-ellipsis">
Get Telemetry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-minmaxave-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Get Min/Max/Ave (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#subscribe-to-telemetry-push-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Subscribe to Telemetry push - (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unsubscribe-from-telemetry-push-sensor-nodes" class="md-nav__link">
<span class="md-ellipsis">
Unsubscribe from Telemetry push - (Sensor nodes)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-access-list" class="md-nav__link">
<span class="md-ellipsis">
Get Access List
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-neighbors" class="md-nav__link">
<span class="md-ellipsis">
Get Neighbors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#get-owner-info" class="md-nav__link">
<span class="md-ellipsis">
Get Owner Info
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#response" class="md-nav__link">
<span class="md-ellipsis">
Response
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plain-text-message" class="md-nav__link">
<span class="md-ellipsis">
Plain text message
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#anonymous-request" class="md-nav__link">
<span class="md-ellipsis">
Anonymous request
</span>
</a>
<nav class="md-nav" aria-label="Anonymous request">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#companion-one-key-dm-introduction" class="md-nav__link">
<span class="md-ellipsis">
Companion one-key DM introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#room-server-login" class="md-nav__link">
<span class="md-ellipsis">
Room server login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeatersensor-login" class="md-nav__link">
<span class="md-ellipsis">
Repeater/Sensor login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-regions-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Regions request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-owner-info-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Owner info request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#repeater-clock-and-status-request" class="md-nav__link">
<span class="md-ellipsis">
Repeater - Clock and status request
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#group-text-message" class="md-nav__link">
<span class="md-ellipsis">
Group text message
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#group-datagram" class="md-nav__link">
<span class="md-ellipsis">
Group datagram
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#control-data" class="md-nav__link">
<span class="md-ellipsis">
Control data
</span>
</a>
<nav class="md-nav" aria-label="Control data">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#discover_req-sub_type" class="md-nav__link">
<span class="md-ellipsis">
DISCOVER_REQ (sub_type)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#discover_resp-sub_type" class="md-nav__link">
<span class="md-ellipsis">
DISCOVER_RESP (sub_type)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#trace" class="md-nav__link">
<span class="md-ellipsis">
Trace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multipart" class="md-nav__link">
<span class="md-ellipsis">
Multipart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ota" class="md-nav__link">
<span class="md-ellipsis">
OTA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-packet" class="md-nav__link">
<span class="md-ellipsis">
Custom packet
</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/payloads.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>
<!-- meshcore-hosted-doc-link:start -->
<p class="meshcore-hosted-doc-link"><a href="https://mikecarper.github.io/MeshCore/payloads/">View this page on MeshCore Docs</a>.</p>
<!-- meshcore-hosted-doc-link:end -->
<h1 id="payload-format">Payload Format</h1>
<p>Inside each <a href="../packet_format/">MeshCore Packet</a> is a payload, identified by the payload type in the packet header. The types of payloads are:</p>
<ul>
<li>Request, response, and plain text (<code>0x00</code>-<code>0x02</code>).</li>
<li>Acknowledgment and node advertisement (<code>0x03</code>-<code>0x04</code>).</li>
<li>Group text and group datagram (<code>0x05</code>-<code>0x06</code>).</li>
<li>Anonymous request and returned path (<code>0x07</code>-<code>0x08</code>).</li>
<li>Trace, multipart, control, and OTA (<code>0x09</code>-<code>0x0C</code>).</li>
<li>Custom raw data (<code>0x0F</code>).</li>
</ul>
<p>This document describes the shared payload envelopes implemented by the core.
Application-specific request, response, control, and custom bodies can add their
own formats.</p>
<p>NOTE: all 16 and 32-bit integer fields are Little Endian.</p>
<h2 id="important-concepts">Important concepts:</h2>
<ul>
<li>Node hash: the first byte of the node's public key</li>
</ul>
<h2 id="node-advertisement">Node advertisement</h2>
<p>This kind of payload notifies receivers that a node exists, and gives information about the node</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>public key</td>
<td>32</td>
<td>Ed25519 public key of the node</td>
</tr>
<tr>
<td>timestamp</td>
<td>4</td>
<td>unix timestamp of advertisement</td>
</tr>
<tr>
<td>signature</td>
<td>64</td>
<td>Ed25519 signature of public key, timestamp, and app data</td>
</tr>
<tr>
<td>appdata</td>
<td>rest of payload</td>
<td>optional, see below</td>
</tr>
</tbody>
</table>
<p>Appdata</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>flags</td>
<td>1</td>
<td>specifies which of the fields are present, see below</td>
</tr>
<tr>
<td>latitude</td>
<td>4 (optional)</td>
<td>decimal latitude multiplied by 1000000, integer</td>
</tr>
<tr>
<td>longitude</td>
<td>4 (optional)</td>
<td>decimal longitude multiplied by 1000000, integer</td>
</tr>
<tr>
<td>feature 1</td>
<td>2 (optional)</td>
<td>reserved for future use</td>
</tr>
<tr>
<td>feature 2</td>
<td>2 (optional)</td>
<td>reserved for future use</td>
</tr>
<tr>
<td>name</td>
<td>rest of appdata</td>
<td>name of the node</td>
</tr>
</tbody>
</table>
<p>Appdata Flags</p>
<table>
<thead>
<tr>
<th>Value</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x01</code></td>
<td>is chat node</td>
<td>advert is for a chat node</td>
</tr>
<tr>
<td><code>0x02</code></td>
<td>is repeater</td>
<td>advert is for a repeater</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td>is room server</td>
<td>advert is for a room server</td>
</tr>
<tr>
<td><code>0x04</code></td>
<td>is sensor</td>
<td>advert is for a sensor server</td>
</tr>
<tr>
<td><code>0x10</code></td>
<td>has location</td>
<td>appdata contains lat/long information</td>
</tr>
<tr>
<td><code>0x20</code></td>
<td>has feature 1</td>
<td>Reserved for future use.</td>
</tr>
<tr>
<td><code>0x40</code></td>
<td>has feature 2</td>
<td>Reserved for future use.</td>
</tr>
<tr>
<td><code>0x80</code></td>
<td>has name</td>
<td>appdata contains a node name</td>
</tr>
</tbody>
</table>
<h2 id="acknowledgement">Acknowledgement</h2>
<p>An acknowledgement that a message was received. Note that for returned path messages, an acknowledgement can be sent in the "extra" payload (see <a href="#returned-path">Returned Path</a>) instead of as a separate acknowledgement packet. Current <code>CLI_DATA</code> commands do not cause acknowledgement responses, neither discrete nor extra; their text reply is the application-level result. Repeaters still ACK the legacy plain-text form before processing it.</p>
<p>Repeater remote CLI keeps one volatile copy of the most recently completed
reply, keyed by the authenticated sender, request timestamp, and command text.
Repeating that same logical request re-sends the text reply without executing
the command again. A retry must therefore preserve the original timestamp and
command text. The cache is cleared by reboot and replaced by the next completed
remote command; commands that intentionally produce no text reply remain
silent.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>checksum</td>
<td>4</td>
<td>CRC checksum of message timestamp, text, and sender pubkey</td>
</tr>
</tbody>
</table>
<h2 id="returned-path-request-response-and-plain-text-message">Returned path, request, response, and plain text message</h2>
<p>Returned path, request, response, and plain text messages are all formatted in the same way. See the subsection for more details about the ciphertext's associated plaintext representation.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>destination hash</td>
<td>1</td>
<td>first byte of destination node public key</td>
</tr>
<tr>
<td>source hash</td>
<td>1</td>
<td>first byte of source node public key</td>
</tr>
<tr>
<td>cipher MAC</td>
<td>2</td>
<td>MAC for encrypted data in next field</td>
</tr>
<tr>
<td>ciphertext</td>
<td>rest of payload</td>
<td>encrypted message, see subsections below for details</td>
</tr>
</tbody>
</table>
<h3 id="returned-path">Returned path</h3>
<p>Returned path messages provide a description of the route a packet took from the original author. Receivers will send returned path messages to the author of the original message.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>path descriptor</td>
<td>1</td>
<td>low 6 bits are the hash count; high 2 bits encode hash size minus one</td>
</tr>
<tr>
<td>path</td>
<td>count × size</td>
<td>encoded node-hash prefixes, each 1-3 bytes; the four-byte code is reserved</td>
</tr>
<tr>
<td>extra type</td>
<td>1</td>
<td>low nibble is the bundled payload type, such as acknowledgment or response; high nibble is reserved</td>
</tr>
<tr>
<td>extra</td>
<td>rest of data</td>
<td>extra, bundled payload content, follows same format as main content defined by this document</td>
</tr>
</tbody>
</table>
<h3 id="request">Request</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>request sub type</td>
</tr>
<tr>
<td>request data</td>
<td>rest of payload</td>
<td>application-defined request payload body</td>
</tr>
</tbody>
</table>
<p>For the common chat/server helpers in <code>BaseChatMesh</code>, the current request type values are:</p>
<table>
<thead>
<tr>
<th>Value</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x01</code></td>
<td>get stats</td>
<td>get stats of repeater or room server</td>
</tr>
<tr>
<td><code>0x02</code></td>
<td>keepalive</td>
<td>(deprecated)</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td>get telemetry</td>
<td>request node telemetry</td>
</tr>
<tr>
<td><code>0x04</code></td>
<td>get min/max/avg</td>
<td>get sensor node stats on time series data</td>
</tr>
<tr>
<td><code>0x05</code></td>
<td>get acl</td>
<td>node ACL query</td>
</tr>
<tr>
<td><code>0x06</code></td>
<td>get neighbors</td>
<td>node neighbors query</td>
</tr>
<tr>
<td><code>0x08</code></td>
<td>subscribe</td>
<td>subscribe to telemetry push</td>
</tr>
<tr>
<td><code>0x09</code></td>
<td>ubsubscribe</td>
<td>unsubscribe from telemetry push</td>
</tr>
<tr>
<td><code>0x0C</code></td>
<td>tracker status</td>
<td>encrypted Sensor dog tracker check to a configured owner's Companion; <a href="../sensor_tracker/#encrypted-check-format">wire format</a></td>
</tr>
</tbody>
</table>
<h4 id="get-stats">Get stats</h4>
<p>Gets information about the node, possibly including the following:</p>
<ul>
<li>Battery level (millivolts)</li>
<li>Current transmit queue length</li>
<li>Current free queue length</li>
<li>Last RSSI value</li>
<li>Number of received packets</li>
<li>Number of sent packets</li>
<li>Total airtime (seconds)</li>
<li>Total uptime (seconds)</li>
<li>Number of packets sent as flood</li>
<li>Number of packets sent directly</li>
<li>Number of packets received as flood</li>
<li>Number of packets received directly</li>
<li>Error flags</li>
<li>Last SNR value</li>
<li>Number of direct route duplicates</li>
<li>Number of flood route duplicates</li>
<li>Number posted (?)</li>
<li>Number of post pushes (?)</li>
</ul>
<h4 id="get-telemetry">Get Telemetry</h4>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x03 (request sub type)</td>
</tr>
<tr>
<td>permission mask</td>
<td>1</td>
<td>bitwise inverse mask to AND to permissions (0 = get ALL telem values)</td>
</tr>
</tbody>
</table>
<h4 id="get-minmaxave-sensor-nodes">Get Min/Max/Ave (Sensor nodes)</h4>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x04 (request sub type)</td>
</tr>
<tr>
<td>start</td>
<td>4</td>
<td>starting time, seconds ago</td>
</tr>
<tr>
<td>end</td>
<td>4</td>
<td>ending time, seconds ago</td>
</tr>
<tr>
<td>reserved</td>
<td>2</td>
<td>should be zeroes</td>
</tr>
</tbody>
</table>
<h4 id="subscribe-to-telemetry-push-sensor-nodes">Subscribe to Telemetry push - (Sensor nodes)</h4>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x08 (request sub type)</td>
</tr>
<tr>
<td>push tag</td>
<td>4</td>
<td>32-bit tag to be used in telemetry push _REPLY payloads</td>
</tr>
<tr>
<td>timeout secs</td>
<td>2</td>
<td>subscription timeout (seconds)</td>
</tr>
<tr>
<td>reserved</td>
<td>1</td>
<td>should be zero</td>
</tr>
<tr>
<td>min deltas len</td>
<td>1</td>
<td>byte length of LPP encoded min_deltas</td>
</tr>
<tr>
<td>min deltas</td>
<td>(variable)</td>
<td>LPP encoded min_deltas</td>
</tr>
</tbody>
</table>
<h4 id="unsubscribe-from-telemetry-push-sensor-nodes">Unsubscribe from Telemetry push - (Sensor nodes)</h4>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x09 (request sub type)</td>
</tr>
</tbody>
</table>
<h4 id="get-access-list">Get Access List</h4>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x05 (request sub type)</td>
</tr>
<tr>
<td>reserved</td>
<td>2</td>
<td>should be zeroes</td>
</tr>
</tbody>
</table>
<h4 id="get-neighbors">Get Neighbors</h4>
<p>Not defined in <code>BaseChatMesh</code>.</p>
<h4 id="get-owner-info">Get Owner Info</h4>
<p>Not defined in <code>BaseChatMesh</code>.</p>
<h3 id="response">Response</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>content</td>
<td>rest of payload</td>
<td>application-defined response body</td>
</tr>
</tbody>
</table>
<p>Response contents are opaque application data. There is no single generic response envelope beyond the encrypted payload wrapper shown above.</p>
<h3 id="plain-text-message">Plain text message</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>send time (unix timestamp)</td>
</tr>
<tr>
<td>txt_type + attempt</td>
<td>1</td>
<td>upper six bits are txt_type (see below), lower two bits are attempt number (0..3)</td>
</tr>
<tr>
<td>message</td>
<td>rest of payload</td>
<td>the message content, see next table</td>
</tr>
</tbody>
</table>
<p>txt_type</p>
<table>
<thead>
<tr>
<th>Value</th>
<th>Description</th>
<th>Message content</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x00</code></td>
<td>plain text message</td>
<td>the plain text of the message</td>
</tr>
<tr>
<td><code>0x01</code></td>
<td>CLI data</td>
<td>CLI command OR reply text</td>
</tr>
<tr>
<td><code>0x02</code></td>
<td>signed plain text message</td>
<td>first four bytes is sender pubkey prefix, followed by plain text message</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td>CLI command</td>
<td>(since v1.18+) CLI command text (explicit)</td>
</tr>
</tbody>
</table>
<p>For a room post, companion firmware uses its own monotonic clock for the
on-air timestamp and preserves that timestamp across application retries. Room
servers track post timestamps separately from login, request, and CLI traffic.
They also remember recent accepted posts by sender, timestamp, and text: an
exact retry is ACKed again without storing a duplicate, while stale or
same-timestamp mismatches are rejected.</p>
<h2 id="anonymous-request">Anonymous request</h2>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>destination hash</td>
<td>1</td>
<td>first byte of destination node public key</td>
</tr>
<tr>
<td>public key</td>
<td>32</td>
<td>sender's Ed25519 public key</td>
</tr>
<tr>
<td>cipher MAC</td>
<td>2</td>
<td>MAC for encrypted data in next field</td>
</tr>
<tr>
<td>ciphertext</td>
<td>rest of payload</td>
<td>encrypted message, see below for details</td>
</tr>
</tbody>
</table>
<h3 id="companion-one-key-dm-introduction">Companion one-key DM introduction</h3>
<p>A Companion may send this request immediately before a normal private text
packet when it has not received an ACK from that chat contact, and on each
application retry. It lets the recipient learn the sender's full public key
without a broadcast advert. The ciphertext contains:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th style="text-align: right;">Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>tag</td>
<td style="text-align: right;">4</td>
<td>unique sender timestamp</td>
</tr>
<tr>
<td>marker</td>
<td style="text-align: right;">4</td>
<td>ASCII <code>DMK1</code></td>
</tr>
<tr>
<td>name</td>
<td style="text-align: right;">1–32</td>
<td>sender name followed by NUL</td>
</tr>
<tr>
<td>signature</td>
<td style="text-align: right;">64</td>
<td>Ed25519 signature by the sender</td>
</tr>
</tbody>
</table>
<p>The signed bytes are the recipient's full public key followed by the tag,
marker, and NUL-terminated name. The recipient verifies that signature against
the 32-byte sender key in the anonymous request header before offering a chat
contact for manual acceptance, or auto-adding it if <code>dm.one_key</code> is enabled.
A receiver that does not implement <code>DMK1</code> ignores the introduction;
the following normal text packet still works when it already has the sender's
key. The recipient's manual advert auto-add setting does not suppress the
synthetic advert for a verified, addressed <code>DMK1</code> introduction. The sender's
full public key remains
visible in the radio packet header, as with other anonymous requests.</p>
<p>With <code>dm.one_key</code> off, the recipient replies with an encrypted <code>DMR1</code> response:
the original 4-byte tag, ASCII <code>DMR1</code>, then its 64-byte Ed25519 signature
over the sender's full key followed by that tag and marker. Only a matching
pending introduction and verified signature stops repeat introductions.</p>
<h3 id="room-server-login">Room server login</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>sync timestamp</td>
<td>4</td>
<td>sender's "sync messages SINCE x" timestamp</td>
</tr>
<tr>
<td>password</td>
<td>rest of message</td>
<td>password for room</td>
</tr>
</tbody>
</table>
<h3 id="repeatersensor-login">Repeater/Sensor login</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>password</td>
<td>rest of message</td>
<td>password for repeater/sensor</td>
</tr>
</tbody>
</table>
<h3 id="repeater-regions-request">Repeater - Regions request</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x01 (request sub type)</td>
</tr>
<tr>
<td>reply path len</td>
<td>1</td>
<td>path len for reply</td>
</tr>
<tr>
<td>reply path</td>
<td>(variable)</td>
<td>reply path</td>
</tr>
</tbody>
</table>
<h3 id="repeater-owner-info-request">Repeater - Owner info request</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x02 (request sub type)</td>
</tr>
<tr>
<td>reply path len</td>
<td>1</td>
<td>path len for reply</td>
</tr>
<tr>
<td>reply path</td>
<td>(variable)</td>
<td>reply path</td>
</tr>
</tbody>
</table>
<h3 id="repeater-clock-and-status-request">Repeater - Clock and status request</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>timestamp</td>
<td>4</td>
<td>sender time (unix timestamp)</td>
</tr>
<tr>
<td>req type</td>
<td>1</td>
<td>0x03 (request sub type)</td>
</tr>
<tr>
<td>reply path len</td>
<td>1</td>
<td>path len for reply</td>
</tr>
<tr>
<td>reply path</td>
<td>(variable)</td>
<td>reply path</td>
</tr>
</tbody>
</table>
<h2 id="group-text-message">Group text message</h2>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>channel hash</td>
<td>1</td>
<td>first byte of SHA256 of channel's shared key</td>
</tr>
<tr>
<td>cipher MAC</td>
<td>2</td>
<td>MAC for encrypted data in next field</td>
</tr>
<tr>
<td>ciphertext</td>
<td>rest of payload</td>
<td>encrypted message, see below for details</td>
</tr>
</tbody>
</table>
<p>The plaintext contained in the ciphertext matches the format described in <a href="#plain-text-message">plain text message</a>. Specifically, it consists of a four byte timestamp, a flags byte, and the message. The flags byte will generally be <code>0x00</code> because it is a "plain text message". The message will be of the form <code>&lt;sender name&gt;: &lt;message body&gt;</code> (eg., <code>user123: I'm on my way</code>).</p>
<p>The sender name is unverified message text. Group messages contain no sender
signature, so any channel-key holder can choose any sender name.</p>
<h2 id="group-datagram">Group datagram</h2>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>channel hash</td>
<td>1</td>
<td>first byte of SHA256 of channel's shared key</td>
</tr>
<tr>
<td>cipher MAC</td>
<td>2</td>
<td>MAC for encrypted data in next field</td>
</tr>
<tr>
<td>ciphertext</td>
<td>rest of payload</td>
<td>encrypted data, see below for details</td>
</tr>
</tbody>
</table>
<p>The data contained in the ciphertext uses the format below:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>data type</td>
<td>2</td>
<td>Identifier for type of data. (See number_allocations.md)</td>
</tr>
<tr>
<td>data len</td>
<td>1</td>
<td>byte length of data</td>
</tr>
<tr>
<td>data</td>
<td>rest of payload</td>
<td>(depends on data type)</td>
</tr>
</tbody>
</table>
<h2 id="control-data">Control data</h2>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>flags</td>
<td>1</td>
<td>upper 4 bits is sub_type</td>
</tr>
<tr>
<td>data</td>
<td>rest of payload</td>
<td>typically unencrypted data</td>
</tr>
</tbody>
</table>
<h3 id="discover_req-sub_type">DISCOVER_REQ (sub_type)</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>flags</td>
<td>1</td>
<td>0x8 (upper 4 bits), prefix_only (lowest bit)</td>
</tr>
<tr>
<td>type_filter</td>
<td>1</td>
<td>bit for each ADV_TYPE_*</td>
</tr>
<tr>
<td>tag</td>
<td>4</td>
<td>randomly generate by sender</td>
</tr>
<tr>
<td>since</td>
<td>4</td>
<td>(optional) epoch timestamp (0 by default)</td>
</tr>
</tbody>
</table>
<h3 id="discover_resp-sub_type">DISCOVER_RESP (sub_type)</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>flags</td>
<td>1</td>
<td>0x9 (upper 4 bits), node_type (lower 4)</td>
</tr>
<tr>
<td>snr</td>
<td>1</td>
<td>signed, SNR*4</td>
</tr>
<tr>
<td>tag</td>
<td>4</td>
<td>reflected back from DISCOVER_REQ</td>
</tr>
<tr>
<td>pubkey</td>
<td>8 or 32</td>
<td>node's ID (or prefix)</td>
</tr>
</tbody>
</table>
<h2 id="trace">Trace</h2>
<p>Trace packets use direct routing. Their normal direct-path header is empty;
instead, the intended route follows a fixed nine-byte trace header in the
payload. Each forwarding node appends its received SNR multiplied by four to
the packet's route-accumulator field.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>tag</td>
<td>4</td>
<td>Sender-selected trace identifier.</td>
</tr>
<tr>
<td>auth code</td>
<td>4</td>
<td>Application-defined authentication/correlation value.</td>
</tr>
<tr>
<td>flags</td>
<td>1</td>
<td>Low two bits encode the route hash size. Current senders use the legacy <code>1 &lt;&lt; value</code> interpretation (1, 2, 4, or 8 bytes); receivers also accept the packed 1-4-byte interpretation where it is unambiguous.</td>
</tr>
<tr>
<td>route</td>
<td>rest</td>
<td>Concatenated node-hash prefixes for the requested direct route.</td>
</tr>
</tbody>
</table>
<p>At the destination, the application receives the tag, auth code, flags,
accumulated SNR bytes, and original route bytes. Trace therefore differs from a
normal direct packet whose path is carried entirely in the packet route field.</p>
<h2 id="multipart">Multipart</h2>
<p>The first payload byte identifies the inner payload and how many packets remain:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>remaining + type</td>
<td>1</td>
<td>Upper nibble is the remaining-packet count; lower nibble is the inner payload type.</td>
</tr>
<tr>
<td>inner data</td>
<td>rest</td>
<td>Data for the inner payload type.</td>
</tr>
</tbody>
</table>
<p>The core currently creates and consumes multipart acknowledgments. For that
form, the low nibble is <code>0x03</code> and the next four bytes are the acknowledgment
CRC. Other multipart inner types are reserved for application or future use.</p>
<h2 id="ota">OTA</h2>
<p>An OTA payload contains one OTA protocol message and is normally sent by flood.
Its message types, integrity fields, and transfer state are defined in the
<a href="../ota_protocol/">OTA-over-LoRa protocol</a>. Builds without OTA support can still
relay an opaque OTA packet when their routing policy permits it.</p>
<h2 id="custom-packet">Custom packet</h2>
<p>Custom packets have no defined format.</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/hosted_doc_links.js?v=20261007-1"></script>
<script src="../_javascript/notification_builder.js?v=20261006-channel9"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="../_javascript/firmware_picker.js?v=20261018-variant-consolidation-1"></script>
<script src="../_javascript/telemetry_decoder.js?v=20261007-hosted-form"></script>
<script src="../_javascript/management_decoder.js"></script>
<script src="../_javascript/filter_tool.js?v=20261002-hashbytes-2plus"></script>
<script src="../_javascript/preset_test.js?v=20260923-2"></script>
<script src="../_javascript/esp32_partition_catalog.js?v=20261001-1"></script>
</body>
</html>