Public Access
Settings had grown to 21 rows in one list. It opens on five groups (This device, Display, GNSS and radio, Network, System); Enter opens one, Back returns to the groups, and Back from the groups leaves Settings. SettingsMenu holds the groups and which one is open (host-tested: every setting is in exactly one group). The guide, the how-tos, the README, the scripts' messages and the firmware's own name the new paths, such as "Settings > System > Firmware". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
73 lines
5.1 KiB
Markdown
73 lines
5.1 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) |
|
|
| `Alice: hello 1h` | A message on the **public channel**, read: who says they sent it, and the start of what it says |
|
|
| `chan #5c 1h` | A message on another channel, still encrypted; `#5c` is the channel's byte |
|
|
| `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: **MeshCore** (the default), or one of the 7 Meshtastic presets allowed in EU868 |
|
|
| <kbd>c</kbd> | Starts or stops a **capture** |
|
|
| <kbd>Tab</kbd> | Switches to the Sweep |
|
|
|
|
The Scanner shows the header and the bytes. Meshtastic and MeshCore both encrypt the message itself, and the Scanner reads only one kind: what is said on MeshCore's public channel, whose key is published.
|
|
|
|
**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 on the **public channel**: the name the sender gives, when the sender's clock says it was sent (UTC), and the text;
|
|
- for any other message: the first byte of the sender's and the receiver's keys, or the channel's byte, and how many bytes are encrypted.
|
|
|
|
The public channel is the one every MeshCore node starts with, and its key is the same everywhere, so anyone listening can read it. Private messages and other channels stay encrypted. The sender's name is part of the message and is not signed: anyone can write any name. Letters outside plain ASCII (accents, emoji) show as `?`.
|
|
|
|
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 → GNSS and radio → 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"]) }}
|