Work / Embedded · mesh networking · fleet operations

RFID scanners on a Thread mesh

Battery-powered RFID scanners, Raspberry Pi gateways that look after themselves, and a live dashboard, for multi-day outdoor events where the network can't be trusted. Plus a countertop check-in kiosk that grew out of it.

The setup

Outdoors there's no reliable network, power comes and goes, and nobody on site is going to debug a Linux box. So scanners have to last days on a battery, gateways have to come back from a power cut on their own without losing anything, and the whole thing has to be watchable from one screen.

Scanners

nRF52840, Zephyr, RC522 reader. Each one joins the OpenThread mesh as a sleepy end device and polls its parent every 10 seconds, which gets it to about nine days on a charge. Scanners name themselves from their hardware ID.

A handheld scanner in an orange printed case, held in one hand
A scanner.

Gateways

Several Pis as Thread border routers, and none of them is the server. Each runs a relay that swaps scans and peer lists with the others over the mesh, so any gateway has the full picture and losing one loses nothing. Anything reading from a gateway keeps a cursor and replays missed scans after a reconnect.

A gateway: Raspberry Pi in a printed box with an external-antenna radio dongle and a camera on a mount
A gateway, with the external-antenna dongle. The camera is the ring sync test rig from the LED project.
Dashboard: four gateways, their scanners with signal strength, a grid of system health checks and the mesh topology
The gateway dashboard, demo data.

Things that went wrong

  • The updater that emptied files. Gateways update themselves by checking the repo every minute. The first version reset the working tree on every check, and a power cut mid-reset left 89 files at zero bytes. Now it only touches the tree when the remote has changed, and swaps files atomically.
  • Range. The stock radio dongle couldn't hold the mesh across the site. Building radio co-processor firmware for a dongle with an external antenna got 20 to 33 dB more link margin.
  • Power. Gateways on battery backup only shut down after three readings in a row below 20%, so one bad sample doesn't take one offline.

Four gateways ran in the field.

The kiosk

The same idea as a product for a client: tap a wristband, get a clear yes or no. Pi 5, NFC reader, 3.5 inch touchscreen, LED ring, speaker and battery backup, in a seven-part printed enclosure generated from code.

It works offline. Every scan is written to a local SQLite store before the screen answers, with an outbox that drains when the network comes back. Staff settings are behind a PIN. The software and fleet tooling have 114 tests in CI.

Nine kiosk screens: staff settings, PIN entry, scan settings, display fit, device name, Bluetooth speakers, device status, pre-event checks, sync and offline queue
Staff screens, demo mode.

Not shown

The code. This was built for a client and runs at real events, so it stays private. Two prototypes built so far. A collaborator wrote the battery and servo drivers.