Files
roro9stack/site/content/guide/lora-scanner.md
T
twislaandClaude Opus 5.5 3339d9ee59 LoRa Scanner: MeshCore searches for nodes and their answers, read
The first two MeshCore packets heard were these: a search for repeaters
and a repeater answering. Both are in clear; they are the test's bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
2026-10-09 20:51:15 +02:00

69 lines
4.4 KiB
Markdown

+++
title = "LoRa Scanner"
description = "Listen to the radio: every packet it hears, a survey of signal strength from 863 to 870 MHz, and captures for Wireshark. It only listens."
weight = 2
[extra]
tag = "LoRa Scanner"
screens = ["sniffer.png", "sweep.png"]
+++
The Scanner uses the **Cap LoRa-1262**. It **never transmits**: it listens and shows.
## Sniffer
The first view lists what the radio hears, newest first: the time, the RSSI (signal strength, in dBm) and the SNR (signal over noise, in dB). For a **Meshtastic** packet it also shows the sender and the receiver (the last four hex digits of their numbers) and the number of hops.
For a **MeshCore** packet it shows what the packet is, who it concerns and how many repeaters are in its path:
| Row | Is |
|---|---|
| `adv Brussels-R1 2h` | A node saying who it is, by its name, heard through 2 repeaters |
| `txt a3>7f` | A private message from the node whose key starts with `a3` to the one starting with `7f` (`req`, `rsp` and `path` look the same) |
| `chan #11 1h` | A message on a channel; `#11` is the channel's byte, and `11` is the public channel's |
| `who's there?` | Someone nearby searching for nodes (repeaters, usually) |
| `here 18a6` | A node answering that search; `18a6` starts its key |
| `ack`, `anon`, `trace`, `ctl` | An acknowledgement, a login, a trace, other control packets |
| Key | Does |
|---|---|
| <kbd>Enter</kbd> | The details of a packet: what is never encrypted (below), and a hex dump |
| <kbd>p</kbd> | Picks what to listen to: one of the 7 Meshtastic presets allowed in EU868 (LongFast by default), or **MeshCore** |
| <kbd>c</kbd> | Starts or stops a **capture** |
| <kbd>Tab</kbd> | Switches to the Sweep |
The Scanner shows the header and the bytes; it does not decrypt the message itself, which Meshtastic and MeshCore both encrypt.
**One network at a time.** The radio listens on one frequency with one setting, and the two networks share neither: on a Meshtastic preset no MeshCore packet is heard, and the other way round.
### MeshCore
The **MeshCore** preset is the setting its networks use in Europe, "EU/UK (Narrow)": 869.618 MHz, 62.5 kHz wide, SF8, coding rate 4/8. A network set up differently needs `lora custom` in the [Shell](/guide/shell/).
<kbd>Enter</kbd> on a MeshCore packet shows:
- what it is and how it travels: **flood** (every repeater passes it on, and adds itself to the path) or **direct** (it carries the route to follow);
- the path, one repeater a hop, each named by the first byte of its key;
- for an **advert**, which is signed and never encrypted: the node's name, its kind (chat node, repeater, room server, sensor), the start of its key, and its position if it gives one;
- for a **search** and its **answers**, also in clear: what kind of node is wanted; and in an answer the node's kind, the start of its key, and how well it heard the search;
- for a message: the first byte of the sender's and the receiver's keys, or the channel's byte, and how many bytes are encrypted.
A byte is all a packet says about who it is from: two nodes can share it. The name comes only with a node's advert, which a node sends now and then, so a quiet network can take a while to show its names.
## Capture
A capture records packets into a **pcap** file with LoRaTap headers in `/captures/lora/` on the SD card, to open in Wireshark. It keeps recording with the App closed (the Status Bar shows `CAP`); the radio sleeps when the App is not open and no capture is running. Captures are never deleted unless you ask, in the [Storage App](/guide/storage/), which can also show a pcap's packets on the device.
## Sweep
<kbd>Tab</kbd> switches to the Sweep: the signal strength across **863 to 870 MHz** in 100 kHz steps, drawn as bars with a mark at each peak, and a waterfall under them. The frequency the Sniffer listens on is marked. The Sniffer is paused during a Sweep and picks up where it was. The Status Bar shows `SW`.
## The GNSS receiver raises the noise
The GNSS receiver on the same Cap makes the radio's noise floor about **8 dB** worse while it runs. **Settings → Pause GNSS for LoRa** (off by default) puts the receiver on standby while the radio listens, except while a Track is being recorded.
## The keys, as the device lists them
What <kbd>Fn</kbd> + <kbd>h</kbd> shows on these screens. These tables are generated from the firmware's own lists, so they are always the current ones.
{{ keys(scopes=["lora", "lora-packet", "lora-presets", "lora-sweep"]) }}