Files
MeshCore-Solo/packet_format/index.html
2026-06-14 22:06:34 +00:00

1898 lines
39 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://meshcore-dev.github.io/meshcore/packet_format/">
<link rel="prev" href="../number_allocations/">
<link rel="next" href="../payloads/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Packet Format - MeshCore Docs</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.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">
<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="#packet-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">
Packet Format
</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/meshcore-dev/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">
meshcore-dev/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/meshcore-dev/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">
meshcore-dev/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="../cli_commands/" class="md-nav__link">
<span class="md-ellipsis">
CLI Commands
</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="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Local Documentation
</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="../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="../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 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">
Packet Format
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Packet Format
</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="#version-1-packet-format" class="md-nav__link">
<span class="md-ellipsis">
Version 1 Packet Format
</span>
</a>
<nav class="md-nav" aria-label="Version 1 Packet Format">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#packet-format_1" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#header-format" class="md-nav__link">
<span class="md-ellipsis">
Header Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#route-types" class="md-nav__link">
<span class="md-ellipsis">
Route Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#path-length-encoding" class="md-nav__link">
<span class="md-ellipsis">
Path Length Encoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#payload-types" class="md-nav__link">
<span class="md-ellipsis">
Payload Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#payload-versions" class="md-nav__link">
<span class="md-ellipsis">
Payload Versions
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</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="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
QR Codes
</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="../terminal_chat_cli/" class="md-nav__link">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" >
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-ellipsis">
Design
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
Design
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../design/trail_redesign/" class="md-nav__link">
<span class="md-ellipsis">
Trail (Tools Trail) — analiza i propozycja uporządkowania
</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_15" >
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
<span class="md-ellipsis">
Solo features
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
Solo features
</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_15_1" >
<label class="md-nav__link" for="__nav_15_1" id="__nav_15_1_label" tabindex="0">
<span class="md-ellipsis">
Clock screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_1">
<span class="md-nav__icon md-icon"></span>
Clock screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/clock_screen/clock_screen/" class="md-nav__link">
<span class="md-ellipsis">
Clock screen
</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_15_2" >
<label class="md-nav__link" for="__nav_15_2" id="__nav_15_2_label" tabindex="0">
<span class="md-ellipsis">
Favourites dial
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_2">
<span class="md-nav__icon md-icon"></span>
Favourites dial
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/favourites_dial/favourites_dial/" class="md-nav__link">
<span class="md-ellipsis">
Favourites dial
</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_15_3" >
<label class="md-nav__link" for="__nav_15_3" id="__nav_15_3_label" tabindex="0">
<span class="md-ellipsis">
Message screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_3">
<span class="md-nav__icon md-icon"></span>
Message screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/message_screen/message_screen/" class="md-nav__link">
<span class="md-ellipsis">
Message screen
</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_15_4" >
<label class="md-nav__link" for="__nav_15_4" id="__nav_15_4_label" tabindex="0">
<span class="md-ellipsis">
Screen lock
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_4">
<span class="md-nav__icon md-icon"></span>
Screen lock
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/screen_lock/screen_lock/" class="md-nav__link">
<span class="md-ellipsis">
Screen lock
</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_15_5" >
<label class="md-nav__link" for="__nav_15_5" id="__nav_15_5_label" tabindex="0">
<span class="md-ellipsis">
Settings screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_5">
<span class="md-nav__icon md-icon"></span>
Settings screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/settings_screen/settings_screen/" class="md-nav__link">
<span class="md-ellipsis">
Settings screen
</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_15_6" >
<label class="md-nav__link" for="__nav_15_6" id="__nav_15_6_label" tabindex="0">
<span class="md-ellipsis">
Tools screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_15_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15_6">
<span class="md-nav__icon md-icon"></span>
Tools screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../solo_features/tools_screen/tools_screen/" class="md-nav__link">
<span class="md-ellipsis">
Tools screen
</span>
</a>
</li>
</ul>
</nav>
</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="#version-1-packet-format" class="md-nav__link">
<span class="md-ellipsis">
Version 1 Packet Format
</span>
</a>
<nav class="md-nav" aria-label="Version 1 Packet Format">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#packet-format_1" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#header-format" class="md-nav__link">
<span class="md-ellipsis">
Header Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#route-types" class="md-nav__link">
<span class="md-ellipsis">
Route Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#path-length-encoding" class="md-nav__link">
<span class="md-ellipsis">
Path Length Encoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#payload-types" class="md-nav__link">
<span class="md-ellipsis">
Payload Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#payload-versions" class="md-nav__link">
<span class="md-ellipsis">
Payload Versions
</span>
</a>
</li>
</ul>
</nav>
</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/meshcore-dev/meshcore/edit/main/docs/packet_format.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="packet-format">Packet Format</h1>
<p>This document describes the MeshCore packet format.</p>
<ul>
<li><code>0xYY</code> indicates <code>YY</code> in hex notation.</li>
<li><code>0bYY</code> indicates <code>YY</code> in binary notation.</li>
<li>Bit 0 indicates the bit furthest to the right: <code>0000000X</code></li>
<li>Bit 7 indicates the bit furthest to the left: <code>X0000000</code></li>
</ul>
<h2 id="version-1-packet-format">Version 1 Packet Format</h2>
<p>This is the protocol level packet structure used in MeshCore firmware v1.12.0</p>
<pre><code>[header][transport_codes(optional)][path_length][path][payload]
</code></pre>
<ul>
<li><a href="#header-format">header</a> - 1 byte<ul>
<li>8-bit Format: <code>0bVVPPPPRR</code> - <code>V=Version</code> - <code>P=PayloadType</code> - <code>R=RouteType</code></li>
<li>Bits 0-1 - 2-bits - <a href="#route-types">Route Type</a><ul>
<li><code>0x00</code>/<code>0b00</code> - <code>ROUTE_TYPE_TRANSPORT_FLOOD</code> - Flood Routing + Transport Codes</li>
<li><code>0x01</code>/<code>0b01</code> - <code>ROUTE_TYPE_FLOOD</code> - Flood Routing</li>
<li><code>0x02</code>/<code>0b10</code> - <code>ROUTE_TYPE_DIRECT</code> - Direct Routing</li>
<li><code>0x03</code>/<code>0b11</code> - <code>ROUTE_TYPE_TRANSPORT_DIRECT</code> - Direct Routing + Transport Codes</li>
</ul>
</li>
<li>Bits 2-5 - 4-bits - <a href="#payload-types">Payload Type</a><ul>
<li><code>0x00</code>/<code>0b0000</code> - <code>PAYLOAD_TYPE_REQ</code> - Request (destination/source hashes + MAC)</li>
<li><code>0x01</code>/<code>0b0001</code> - <code>PAYLOAD_TYPE_RESPONSE</code> - Response to <code>REQ</code> or <code>ANON_REQ</code></li>
<li><code>0x02</code>/<code>0b0010</code> - <code>PAYLOAD_TYPE_TXT_MSG</code> - Plain text message</li>
<li><code>0x03</code>/<code>0b0011</code> - <code>PAYLOAD_TYPE_ACK</code> - Acknowledgment</li>
<li><code>0x04</code>/<code>0b0100</code> - <code>PAYLOAD_TYPE_ADVERT</code> - Node advertisement</li>
<li><code>0x05</code>/<code>0b0101</code> - <code>PAYLOAD_TYPE_GRP_TXT</code> - Group text message (unverified)</li>
<li><code>0x06</code>/<code>0b0110</code> - <code>PAYLOAD_TYPE_GRP_DATA</code> - Group datagram (unverified)</li>
<li><code>0x07</code>/<code>0b0111</code> - <code>PAYLOAD_TYPE_ANON_REQ</code> - Anonymous request</li>
<li><code>0x08</code>/<code>0b1000</code> - <code>PAYLOAD_TYPE_PATH</code> - Returned path</li>
<li><code>0x09</code>/<code>0b1001</code> - <code>PAYLOAD_TYPE_TRACE</code> - Trace a path, collecting SNR for each hop</li>
<li><code>0x0A</code>/<code>0b1010</code> - <code>PAYLOAD_TYPE_MULTIPART</code> - Packet is part of a sequence of packets</li>
<li><code>0x0B</code>/<code>0b1011</code> - <code>PAYLOAD_TYPE_CONTROL</code> - Control packet data (unencrypted)</li>
<li><code>0x0C</code>/<code>0b1100</code> - reserved</li>
<li><code>0x0D</code>/<code>0b1101</code> - reserved</li>
<li><code>0x0E</code>/<code>0b1110</code> - reserved</li>
<li><code>0x0F</code>/<code>0b1111</code> - <code>PAYLOAD_TYPE_RAW_CUSTOM</code> - Custom packet (raw bytes, custom encryption)</li>
</ul>
</li>
<li>Bits 6-7 - 2-bits - <a href="#payload-versions">Payload Version</a><ul>
<li><code>0x00</code>/<code>0b00</code> - v1 - 1-byte src/dest hashes, 2-byte MAC</li>
<li><code>0x01</code>/<code>0b01</code> - v2 - Future version (e.g., 2-byte hashes, 4-byte MAC)</li>
<li><code>0x02</code>/<code>0b10</code> - v3 - Future version</li>
<li><code>0x03</code>/<code>0b11</code> - v4 - Future version</li>
</ul>
</li>
</ul>
</li>
<li><code>transport_codes</code> - 4 bytes (optional)<ul>
<li>Only present for <code>ROUTE_TYPE_TRANSPORT_FLOOD</code> and <code>ROUTE_TYPE_TRANSPORT_DIRECT</code></li>
<li><code>transport_code_1</code> - 2 bytes - <code>uint16_t</code> - calculated from region scope</li>
<li><code>transport_code_2</code> - 2 bytes - <code>uint16_t</code> - reserved</li>
</ul>
</li>
<li><code>path_length</code> - 1 byte - Encoded path metadata<ul>
<li>Bits 0-5 store path hash count / hop count (<code>0-63</code>)</li>
<li>Bits 6-7 store path hash size minus 1<ul>
<li><code>0b00</code>: 1-byte path hashes</li>
<li><code>0b01</code>: 2-byte path hashes</li>
<li><code>0b10</code>: 3-byte path hashes</li>
<li><code>0b11</code>: reserved / unsupported</li>
</ul>
</li>
</ul>
</li>
<li><code>path</code> - <code>hop_count * hash_size</code> bytes - Path to use for Direct Routing or flood path tracking<ul>
<li>Up to a maximum of 64 bytes, defined by <code>MAX_PATH_SIZE</code></li>
<li>Effective byte length is calculated from the encoded hop count and hash size, not taken directly from <code>path_length</code></li>
<li>v1.12.0 firmware and older only handled legacy 1-byte path hashes and dropped packets whose path bytes exceeded <a href="https://github.com/meshcore-dev/MeshCore/blob/e812632235274ffd2382adf5354168aec765d416/src/Dispatcher.cpp#L144">64 bytes</a></li>
</ul>
</li>
<li><code>payload</code> - variable length - Payload Data<ul>
<li>Up to a maximum 184 bytes, defined by <code>MAX_PACKET_PAYLOAD</code></li>
<li>Generally this is the remainder of the raw packet data</li>
<li>The firmware parses this data based on the provided Payload Type</li>
<li>v1.12.0 firmware and older drops packets with <code>payload</code> sizes <a href="https://github.com/meshcore-dev/MeshCore/blob/e812632235274ffd2382adf5354168aec765d416/src/Dispatcher.cpp#L152">larger than 184</a></li>
</ul>
</li>
</ul>
<h3 id="packet-format_1">Packet Format</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Size (bytes)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>header</td>
<td>1</td>
<td>Contains routing type, payload type, and payload version</td>
</tr>
<tr>
<td>transport_codes</td>
<td>4 (optional)</td>
<td>2x 16-bit transport codes (if ROUTE_TYPE_TRANSPORT_*)</td>
</tr>
<tr>
<td>path_length</td>
<td>1</td>
<td>Encodes path hash size in bits 6-7 and hop count in bits 0-5</td>
</tr>
<tr>
<td>path</td>
<td>up to 64 (<code>MAX_PATH_SIZE</code>)</td>
<td>Stores <code>hop_count * hash_size</code> bytes of path data if applicable</td>
</tr>
<tr>
<td>payload</td>
<td>up to 184 (<code>MAX_PACKET_PAYLOAD</code>)</td>
<td>Data for the provided Payload Type</td>
</tr>
</tbody>
</table>
<blockquote>
<p>NOTE: see the <a href="../payloads/">Payloads</a> documentation for more information about the content of specific payload types.</p>
</blockquote>
<h3 id="header-format">Header Format</h3>
<p>Bit 0 means the lowest bit (1s place)</p>
<table>
<thead>
<tr>
<th>Bits</th>
<th>Mask</th>
<th>Field</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>0-1</td>
<td><code>0x03</code></td>
<td>Route Type</td>
<td>Flood, Direct, etc</td>
</tr>
<tr>
<td>2-5</td>
<td><code>0x3C</code></td>
<td>Payload Type</td>
<td>Request, Response, ACK, etc</td>
</tr>
<tr>
<td>6-7</td>
<td><code>0xC0</code></td>
<td>Payload Version</td>
<td>Versioning of the payload format</td>
</tr>
</tbody>
</table>
<h3 id="route-types">Route Types</h3>
<table>
<thead>
<tr>
<th>Value</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x00</code></td>
<td><code>ROUTE_TYPE_TRANSPORT_FLOOD</code></td>
<td>Flood Routing + Transport Codes</td>
</tr>
<tr>
<td><code>0x01</code></td>
<td><code>ROUTE_TYPE_FLOOD</code></td>
<td>Flood Routing</td>
</tr>
<tr>
<td><code>0x02</code></td>
<td><code>ROUTE_TYPE_DIRECT</code></td>
<td>Direct Routing</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td><code>ROUTE_TYPE_TRANSPORT_DIRECT</code></td>
<td>Direct Routing + Transport Codes</td>
</tr>
</tbody>
</table>
<h3 id="path-length-encoding">Path Length Encoding</h3>
<p><code>path_length</code> is not a raw byte count. It packs both hash size and hop count:</p>
<table>
<thead>
<tr>
<th>Bits</th>
<th>Field</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>0-5</td>
<td>Hop Count</td>
<td>Number of path hashes (<code>0-63</code>)</td>
</tr>
<tr>
<td>6-7</td>
<td>Hash Size Code</td>
<td>Stored as <code>hash_size - 1</code></td>
</tr>
</tbody>
</table>
<p>Hash size codes:</p>
<table>
<thead>
<tr>
<th>Bits 6-7</th>
<th>Hash Size</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0b00</code></td>
<td>1 byte</td>
<td>Legacy / default mode</td>
</tr>
<tr>
<td><code>0b01</code></td>
<td>2 bytes</td>
<td>Supported in current firmware</td>
</tr>
<tr>
<td><code>0b10</code></td>
<td>3 bytes</td>
<td>Supported in current firmware</td>
</tr>
<tr>
<td><code>0b11</code></td>
<td>4 bytes</td>
<td>Reserved / invalid</td>
</tr>
</tbody>
</table>
<p>Examples:</p>
<ul>
<li><code>0x00</code>: zero-hop packet, no path bytes</li>
<li><code>0x05</code>: 5 hops using 1-byte hashes, so path is 5 bytes</li>
<li><code>0x45</code>: 5 hops using 2-byte hashes, so path is 10 bytes</li>
<li><code>0x8A</code>: 10 hops using 3-byte hashes, so path is 30 bytes</li>
</ul>
<h3 id="payload-types">Payload Types</h3>
<table>
<thead>
<tr>
<th>Value</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x00</code></td>
<td><code>PAYLOAD_TYPE_REQ</code></td>
<td>Request (destination/source hashes + MAC)</td>
</tr>
<tr>
<td><code>0x01</code></td>
<td><code>PAYLOAD_TYPE_RESPONSE</code></td>
<td>Response to <code>REQ</code> or <code>ANON_REQ</code></td>
</tr>
<tr>
<td><code>0x02</code></td>
<td><code>PAYLOAD_TYPE_TXT_MSG</code></td>
<td>Plain text message</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td><code>PAYLOAD_TYPE_ACK</code></td>
<td>Acknowledgment</td>
</tr>
<tr>
<td><code>0x04</code></td>
<td><code>PAYLOAD_TYPE_ADVERT</code></td>
<td>Node advertisement</td>
</tr>
<tr>
<td><code>0x05</code></td>
<td><code>PAYLOAD_TYPE_GRP_TXT</code></td>
<td>Group text message (unverified)</td>
</tr>
<tr>
<td><code>0x06</code></td>
<td><code>PAYLOAD_TYPE_GRP_DATA</code></td>
<td>Group datagram (unverified)</td>
</tr>
<tr>
<td><code>0x07</code></td>
<td><code>PAYLOAD_TYPE_ANON_REQ</code></td>
<td>Anonymous request</td>
</tr>
<tr>
<td><code>0x08</code></td>
<td><code>PAYLOAD_TYPE_PATH</code></td>
<td>Returned path</td>
</tr>
<tr>
<td><code>0x09</code></td>
<td><code>PAYLOAD_TYPE_TRACE</code></td>
<td>Trace a path, collecting SNR for each hop</td>
</tr>
<tr>
<td><code>0x0A</code></td>
<td><code>PAYLOAD_TYPE_MULTIPART</code></td>
<td>Packet is part of a sequence of packets</td>
</tr>
<tr>
<td><code>0x0B</code></td>
<td><code>PAYLOAD_TYPE_CONTROL</code></td>
<td>Control packet data (unencrypted)</td>
</tr>
<tr>
<td><code>0x0C</code></td>
<td>reserved</td>
<td>reserved</td>
</tr>
<tr>
<td><code>0x0D</code></td>
<td>reserved</td>
<td>reserved</td>
</tr>
<tr>
<td><code>0x0E</code></td>
<td>reserved</td>
<td>reserved</td>
</tr>
<tr>
<td><code>0x0F</code></td>
<td><code>PAYLOAD_TYPE_RAW_CUSTOM</code></td>
<td>Custom packet (raw bytes, custom encryption)</td>
</tr>
</tbody>
</table>
<h3 id="payload-versions">Payload Versions</h3>
<table>
<thead>
<tr>
<th>Value</th>
<th>Version</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x00</code></td>
<td>1</td>
<td>1-byte src/dest hashes, 2-byte MAC</td>
</tr>
<tr>
<td><code>0x01</code></td>
<td>2</td>
<td>Future version (e.g., 2-byte hashes, 4-byte MAC)</td>
</tr>
<tr>
<td><code>0x02</code></td>
<td>3</td>
<td>Future version</td>
</tr>
<tr>
<td><code>0x03</code></td>
<td>4</td>
<td>Future version</td>
</tr>
</tbody>
</table>
</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.79ae519e.min.js"></script>
</body>
</html>