{"id":48396519,"url":"https://github.com/reboot-required/lorawan-rpi","last_synced_at":"2026-04-06T01:24:58.813Z","repository":{"id":345386394,"uuid":"1180148454","full_name":"reboot-required/lorawan-rpi","owner":"reboot-required","description":"A minimal LoRaWAN implementation for using RF95 on Raspberry Pi","archived":false,"fork":false,"pushed_at":"2026-03-18T21:48:48.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-19T10:53:46.575Z","etag":null,"topics":["cmake","cpp","lorawan","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reboot-required.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-12T18:46:23.000Z","updated_at":"2026-03-18T21:48:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/reboot-required/lorawan-rpi","commit_stats":null,"previous_names":["reboot-required/lorawan-rpi"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/reboot-required/lorawan-rpi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reboot-required%2Florawan-rpi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reboot-required%2Florawan-rpi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reboot-required%2Florawan-rpi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reboot-required%2Florawan-rpi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reboot-required","download_url":"https://codeload.github.com/reboot-required/lorawan-rpi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reboot-required%2Florawan-rpi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31455979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmake","cpp","lorawan","raspberry-pi"],"created_at":"2026-04-06T01:24:58.710Z","updated_at":"2026-04-06T01:24:58.792Z","avatar_url":"https://github.com/reboot-required.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LoRa RPi - Embedded Linux LoRa Communication\n\nMinimal LoRa packet communication on Raspberry Pi using RF95-style\nmodules and C++17.\n\nThis repository contains a small LoRaWAN-inspired packet layer\n(DevAddr/FrameCnt/Port/Payload/CRC16), a radio driver, and two Linux apps:\n`lora_node` (TX) and `lora_gateway` (RX).\n\n## Overview\n\n```text\n┌──────────────┐           LoRa 868 MHz            ┌──────────────┐\n│ Raspberry Pi │  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  │ Raspberry Pi │\n│   (Node)     │ ──── RFM95 + antenna ──────────── │  (Gateway)   │\n└──────────────┘                                   └──────────────┘\n```\n\n- `lora_node`: creates packets periodically and sends them over LoRa.\n- `lora_gateway`: listens continuously, validates packets, prints RSSI/SNR.\n\n## Repository Layout\n\n```text\nlorawan-rpi/\n├── CMakeLists.txt\n├── setup.sh\n├── common/\n│   ├── include/\n│   │   ├── hal/{spi_hal.h,gpio_hal.h,delay_hal.h}\n│   │   ├── rf95_lora.h\n│   │   ├── lora_packet.h\n│   │   └── logger.h\n│   └── src/\n│       ├── rf95_lora.cpp\n│       ├── lora_packet.cpp\n│       └── logger.cpp\n└── platform_linux/\n    ├── CMakeLists.txt\n    ├── include/{linux_spi.h,linux_gpio.h,linux_delay.h}\n    └── src/\n        ├── node_main.cpp\n        ├── gateway_main.cpp\n        ├── linux_spi.cpp\n        ├── linux_gpio.cpp\n        └── linux_delay.cpp\n```\n\n## Hardware\n\n### Components (per side)\n\n- 1x Raspberry Pi (3B+/4/5/Zero 2 W)\n- 1x RFM95W (868 MHz) module\n- 1x matching antenna for your band\n- jumper wires / breadboard\n\n### Wiring RFM module to Raspberry Pi (BCM)\n\nThe Linux applications use `/dev/spidev0.0` for SPI chip select and request\nGPIO lines `RESET=25` and `DIO0=24` through libgpiod.\n\n```text\nRFM95W                 Raspberry Pi\n------                 -------------\nVCC      -----------\u003e  3.3V   (Pin 1)\nGND      -----------\u003e  GND    (Pin 6)\nMISO     -----------\u003e  GPIO 9 / SPI0_MISO (Pin 21)\nMOSI     -----------\u003e  GPIO 10 / SPI0_MOSI (Pin 19)\nSCK      -----------\u003e  GPIO 11 / SPI0_SCLK (Pin 23)\nNSS/CS   -----------\u003e  GPIO 8 / SPI0_CE0   (Pin 24)\nRESET    -----------\u003e  GPIO 25             (Pin 22)\nDIO0     -----------\u003e  GPIO 24             (Pin 18)\n```\n\nAlways connect an antenna before transmitting.\n\n## Prerequisites\n\nInstall dependencies and enable SPI:\n\n```bash\nsudo apt-get update\nsudo apt-get install -y build-essential cmake libgpiod-dev\nsudo raspi-config nonint do_spi 0\nsudo reboot\n```\n\nFor native x86 development builds, configuration can proceed without\n`libgpiod-dev`. In that case CMake falls back to a stub GPIO backend so the\ncode compiles, but the Linux applications will fail during GPIO initialization\nat runtime.\n\nOr run the project setup script:\n\n```bash\nsudo bash ./setup.sh\nsudo reboot\n```\n\n## Build\n\nThis project builds with CMake from the repository root:\n\n```bash\ncmake -S . -B build\ncmake --build build -j\n```\n\nPreset-based builds are also supported:\n\n```bash\ncmake --preset host-debug\ncmake --build --preset host-debug -j\n```\n\nBinaries are generated at:\n\n- `build/platform_linux/lora_node`\n- `build/platform_linux/lora_gateway`\n\nBuild only one target:\n\n```bash\ncmake --build build --target lora_node -j\ncmake --build build --target lora_gateway -j\n```\n\nClean build directory:\n\n```bash\nrm -rf build\n```\n\n## Cross-Compile For Raspberry Pi\n\nTwo presets cover the two common Raspberry Pi OS variants.\n\n### 32-bit Raspberry Pi OS (Pi 3B+ / Pi Zero 2 W) – `raspi-armhf`\n\nRequires the ARMHF cross-toolchain:\n\n```bash\nsudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf\n```\n\nBuild:\n\n```bash\ncmake --preset raspi-armhf\ncmake --build --preset raspi-armhf -j\n```\n\nBinaries:\n\n- `build/raspi-armhf/platform_linux/lora_node`\n- `build/raspi-armhf/platform_linux/lora_gateway`\n\n### 64-bit (Pi 5 / Pi 4) – `raspi-aarch64`\n\nRaspberry Pi OS for the Pi 5 ships as 64-bit by default. Use the `raspi-aarch64`\npreset instead of `raspi-armhf` to produce a native AArch64 binary.\n\nRequires the AArch64 cross-toolchain:\n\n```bash\nsudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu\n```\n\nBuild:\n\n```bash\ncmake --preset raspi-aarch64\ncmake --build --preset raspi-aarch64 -j\n```\n\nBinaries:\n\n- `build/raspi-aarch64/platform_linux/lora_node`\n- `build/raspi-aarch64/platform_linux/lora_gateway`\n\n### Optional sysroot\n\nIf you have a Raspberry Pi sysroot available for either preset, pass it during configure:\n\n```bash\ncmake --preset raspi-armhf   -DRASPI_SYSROOT=/path/to/raspi-sysroot\ncmake --preset raspi-aarch64 -DRASPI_SYSROOT=/path/to/raspi-sysroot\n```\n\n### Verify output architecture\n\n```bash\nfile build/raspi-armhf/platform_linux/lora_node\nfile build/raspi-armhf/platform_linux/lora_gateway\nfile build/raspi-aarch64/platform_linux/lora_node\nfile build/raspi-aarch64/platform_linux/lora_gateway\n```\n\n## Deploy\n\nCopy the cross-compiled binaries to the target Pi over SSH:\n\n```bash\n# Pi Zero 2 W / 32-bit OS\nscp build/raspi-armhf/platform_linux/lora_node     pi@\u003cNODE_IP\u003e:~/\nscp build/raspi-armhf/platform_linux/lora_gateway  pi@\u003cGATEWAY_IP\u003e:~/\n\n# Pi 5 / 64-bit OS\nscp build/raspi-aarch64/platform_linux/lora_node     pi@\u003cNODE_IP\u003e:~/\nscp build/raspi-aarch64/platform_linux/lora_gateway  pi@\u003cGATEWAY_IP\u003e:~/\n```\n\nReplace `pi@\u003cNODE_IP\u003e` and `pi@\u003cGATEWAY_IP\u003e` with the actual user and IP address\nof each board. After copying, run the binaries directly on the Pi as shown in the\n[Run](#run) section.\n\n## Test\n\nBuild and run CTest from the same build directory:\n\n```bash\ncmake -S . -B build\ncmake --build build -j\nctest --test-dir build --output-on-failure\n```\n\n`lora_packet_tests` validates packet round-trip serialization and CRC checks.\nWhen using an ARM cross-toolchain on a non-ARM host, runtime test execution is\nskipped and a placeholder CTest case is reported instead.\n\n## Run\n\nGateway (receiver):\n\n```bash\nsudo ./build/platform_linux/lora_gateway --spi /dev/spidev0.0 --sf 7\n```\n\nNode (sender):\n\n```bash\nsudo ./build/platform_linux/lora_node --addr 01000001 --interval 10 --spi /dev/spidev0.0 --sf 7 --power 17\n```\n\n`sudo` is typically required for `/dev/spidev*` and libgpiod-based GPIO access.\n\n## Command-Line Options\n\n`lora_node` supports:\n\n- `--addr HEX` (example: `01000001`)\n- `--freq 868.1` (only allowed value)\n- `--interval SEC`\n- `--spi DEV`\n- `--sf N`\n- `--power DBM`\n\n`lora_gateway` supports:\n\n- `--freq 868.1` (only allowed value)\n- `--spi DEV`\n- `--sf N`\n\n## Packet Format\n\n```text\n+----------+----------+------+---------+-------+\n| DevAddr  | FrameCnt | Port | Payload | CRC16 |\n| 4 bytes  | 2 bytes  | 1 B  | N bytes | 2 B   |\n+----------+----------+------+---------+-------+\n```\n\n- multi-byte fields are big-endian\n- CRC is CRC16-CCITT over header + payload\n\n## LoRa Defaults In Code\n\n- Node defaults: `freq=868.1`, `sf=7`, `bw=125`, `cr=4/5`, `power=17`, `sync=0x34`\n- Gateway defaults: `freq=868.1`, `sf=7`, `bw=125`, `cr=4/5`, `power=14`, `sync=0x34`\n\nFrequency policy: this project enforces `868.1 MHz` only. If another\nfrequency is passed via `--freq`, the application exits with an error.\n\n## Regulatory Note (Germany)\n\nFor this project, use only `868.1 MHz`. The applications intentionally accept\nonly that frequency to keep the operating profile narrow and reproducible.\n\nThis is not a substitute for verifying local regulatory requirements such as\nallowed channels, duty-cycle limits, transmit power, and antenna rules before\nyou transmit.\n\n## Notes\n\n- The Linux HAL implementations use `/dev/spidev*` for SPI and `/sys/class/gpio`\n  for GPIO.\n- Packet tests cover serialization round-trips and CRC validation.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freboot-required%2Florawan-rpi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freboot-required%2Florawan-rpi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freboot-required%2Florawan-rpi/lists"}