LoRa Tracker is a low-power GNSS tracking system with battery-powered tracker firmware, a Wi-Fi/MQTT gateway, a SQLite history service, a browser/Android app and a deterministic cross-component simulator. Optional keyless repeaters extend encrypted history traffic and receiver ACKs across bounded multi-hop paths.
The repository is suitable for development and controlled field trials, but is not approved for unattended production deployment. LoRa telemetry/ACKs now use per-tracker AES-256-GCM and device management requires an owner-key- authenticated custom BLE or local HTTP session. Gateway ACKs require an authenticated packet and successful MQTT hand-off; the SQLite archiver is optional and all transmitters enforce the supported Germany radio profile. Remaining release blockers include signed firmware with ESP32 secure boot, a power-loss-safe tracker queue, key custody/rotation and hardware-in-the-loop qualification. See production readiness and security.
| Component | Purpose |
|---|---|
components/tracker-firmware |
GNSS acquisition, motion-aware sleep, offline history and LoRa transport |
components/gateway-firmware |
Multi-tracker LoRa reception, ACKs, deduplication and MQTT routing |
components/repeater-firmware |
Keyless bounded forwarding of encrypted history and ACK frames |
components/archiver |
Validated MQTT ingestion, SQLite retention and paginated history |
components/web-app |
Shared MQTT-over-WebSocket PWA and Android application |
components/firmware-core |
Portable C++ policies shared by firmware and WebAssembly |
components/firmware-simulator |
Native embedded contract tests |
components/simulator-web |
Interactive deterministic WASM network lab |
Only the current protocol and JSON schemas are accepted. Older packet, history, point and request schemas are deliberately rejected.
Run the brokerless system and embedded contract simulation:
cd components/archiver
python -m lora_tracker_archiver.simulator \
--trackers 2 --points 12 --service-suite --embedded-suiteBuild and serve the interactive WASM Network Lab:
cd components/simulator-web
npm ci
npm run build
npx playwright install chromium
npm run test:browser
python3 -m http.server 8080 -d appBuild every firmware target with the pinned PlatformIO toolchain:
pio run -d components/tracker-firmware -e heltec_wifi_lora_32_v2
pio run -d components/tracker-firmware -e heltec_wireless_tracker
pio run -d components/gateway-firmware -e heltec_wifi_lora_32_v2
pio run -d components/repeater-firmware -e heltec_wifi_lora_32_v2
pio run -d components/repeater-firmware -e heltec_wireless_trackerCopy secrets.example.h to git-ignored secrets.h for tracker and gateway
source builds; the repeater has no factory secret header. Generic devices are
claimed with a 256-bit app-generated owner key after erased first boot; no PIN,
password, bond, or OTA-only secret is generated. Provision the
gateway broker's PEM root CA through the authenticated setup API or a per-device
factory build. Plain MQTT is disabled by default.
The complete reader-facing documentation is rendered on GitHub Pages.
- Architecture
- Onboarding and configuration
- Configuration reference
- Build and deployment
- Browser flashing
- Hardware recommendations
- Germany radio compliance
- Repeaters
- Operations
- Simulation coverage
- Production readiness
- Protocol specifications
- Roadmap and larger refactors
The browser Network Lab uses the production C++ policy core compiled to WebAssembly. It visualizes trackers, repeaters, receivers, obstacles, RF link budgets, collisions, day/night conditions, MQTT archival and gateway ACK paths. The separate brokerless suite continues to execute production archiver and embedded contracts. Both are engineering evidence rather than RF, power, infrastructure or regulatory qualification; see simulation coverage.
New installations publish below lora-tracker/v1. Device IDs are canonical
lowercase identifiers; routing uses the derived 64-bit public device hash. The
hash is not a secret or an authentication credential.