+++ 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 | |---|---| | Enter | The details of a packet: what is never encrypted (below), and a hex dump | | p | Picks what to listen to: one of the 7 Meshtastic presets allowed in EU868 (LongFast by default), or **MeshCore** | | c | Starts or stops a **capture** | | Tab | 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/). Enter 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 Tab 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 Fn + h 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"]) }}