mirror of
https://github.com/meshtastic/firmware.git
synced 2026-10-07 21:52:35 -04:00
Adds the standard Meshtastic BLE service (toRadio/fromRadio/fromNum/logRadio) to the Linux native target, so a Raspberry Pi running meshtasticd can be paired and used over BLE like any other Meshtastic device. Implementation: a new LinuxBluetooth backend registers a GATT application, LE advertisement and pairing agent with bluetoothd over the org.bluez D-Bus APIs, using sdbus-c++ (both the 1.x and 2.x major versions, via a small compat shim - Debian bookworm/Ubuntu 24.04 ship 1.x, trixie/Fedora ship 2.x). When the sdbus-c++ dev package is absent the whole backend compiles out via __has_include, the same optional-dependency idiom as the ulfius webserver. Threading follows the NimbleBluetooth model, simplified: the sdbus event loop runs its own thread, and all PhoneAPI calls happen on the main thread. Writes queue to the main loop; reads park the D-Bus reply and are completed from the main thread after queued writes, so write-then-read clients see their answer without any busy-waiting. Enablement is a double opt-in: a new `Bluetooth:` config.yaml section (Enabled, default false; AdapterId, default hci0) must turn BLE on for the host, and the regular device config bluetooth.enabled must be on. The config-check schema and fixtures cover the new section. Pairing honors config.bluetooth.mode: NO_PIN maps to a NoInputNoOutput just-works agent; RANDOM_PIN to DisplayOnly with the kernel-generated passkey shown on screen/log via the existing BluetoothStatus plumbing. FIXED_PIN falls back to random-passkey semantics with a warning - BlueZ does not support forcing a passkey. PIN modes enforce encrypt-authenticated-read/write on all mesh characteristics. Packaging: install a D-Bus system policy so the meshtasticd user may talk to org.bluez, add it to the bluetooth group, order the unit after bluetooth.service, and add libsdbus-c++-dev to debian/rpm/docker/CI deps. Verified in-container against a mock bluetoothd: registration flow, GATT tree enumeration, advertisement properties, and a full config download (ToRadio wantConfig -> 47 FromRadio packets) through the D-Bus bridge. Real-hardware pairing/notify testing on a Pi still pending. Known limitations (v1): meshtasticd must be restarted if bluetoothd restarts; FIXED_PIN degrades to a random passkey; getRssi() returns 0 (same as nRF52). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0184v7MyCLuJHW2ebZ9r8NmQ
84 lines
3.6 KiB
INI
84 lines
3.6 KiB
INI
; The Portduino based 'native' environment. Currently supported on Linux targets with real LoRa hardware (or simulated).
|
|
[portduino_base]
|
|
platform =
|
|
# renovate: datasource=git-refs depName=platform-native packageName=https://github.com/meshtastic/platform-native gitBranch=develop
|
|
https://github.com/meshtastic/platform-native/archive/86c62edfb7084d11669aa255411a70580e83823b.zip
|
|
framework = arduino
|
|
|
|
build_src_filter =
|
|
${env.build_src_filter}
|
|
-<platform/>
|
|
+<platform/portduino>
|
|
-<platform/portduino/wasm/> ; emscripten-only sources, built by [env:native-wasm] (pio run -e native-wasm)
|
|
-<nimble/>
|
|
-<mesh/wifi/>
|
|
-<mesh/http/>
|
|
+<mesh/raspihttp/>
|
|
-<mesh/eth/>
|
|
-<modules/esp32>
|
|
|
|
lib_deps =
|
|
${env.lib_deps}
|
|
${networking_base.lib_deps}
|
|
${networking_extra.lib_deps}
|
|
${radiolib_base.lib_deps}
|
|
${environmental_base.lib_deps}
|
|
# renovate: datasource=git-refs depName=meshtastic/Crypto packageName=https://github.com/meshtastic/Crypto gitBranch=main
|
|
https://github.com/meshtastic/Crypto/archive/591ff9a690e8168ccb7a36abde8d7783e448d395.zip
|
|
# renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX
|
|
lovyan03/LovyanGFX@1.2.26
|
|
; # renovate: datasource=git-refs depName=libch341-spi-userspace packageName=https://github.com/meshtastic/libch341-spi-userspace gitBranch=main
|
|
https://github.com/meshtastic/libch341-spi-userspace/archive/03bf505d6e5904092c1c389c45b01098f7a302fe.zip
|
|
# renovate: datasource=custom.pio depName=adafruit/Adafruit seesaw Library packageName=adafruit/library/Adafruit seesaw Library
|
|
adafruit/Adafruit seesaw Library@1.7.9
|
|
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
|
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
|
# renovate: datasource=github-tags depName=Adafruit_BME680 packageName=adafruit/Adafruit_BME680
|
|
https://github.com/adafruit/Adafruit_BME680/archive/refs/tags/2.0.6.zip
|
|
|
|
; Cross-platform build flags shared between native (Linux) and native-macos builds.
|
|
; Anything Linux-only (libbluetooth, libgpiod, libi2c, /sys/class/gpio,
|
|
; PORTDUINO_LINUX_HARDWARE, glibc-style _FORTIFY_SOURCE) goes in `build_flags`
|
|
; instead. UDP multicast also lives there because the firmware's
|
|
; UdpMulticastHandler.h unconditionally `#include <WiFi.h>` on non-NRF52
|
|
; targets, which requires the framework's bundled WiFi shim that we
|
|
; lib_ignore on macOS.
|
|
build_flags_common =
|
|
${arduino_base.build_flags}
|
|
-D ARCH_PORTDUINO
|
|
-fPIC
|
|
-Isrc/platform/portduino
|
|
-DRADIOLIB_EEPROM_UNSUPPORTED
|
|
-lpthread
|
|
-lyaml-cpp
|
|
-ljsoncpp
|
|
!pkg-config --cflags jsoncpp --silence-errors || :
|
|
-luv
|
|
-std=gnu17
|
|
-std=gnu++17
|
|
-DMAX_TFT_COLOR_REGIONS=64
|
|
|
|
build_flags =
|
|
${portduino_base.build_flags_common}
|
|
-DHAS_UDP_MULTICAST=1
|
|
-D_FORTIFY_SOURCE=2
|
|
-fstack-protector-all -Wstack-protector --param ssp-buffer-size=4
|
|
-DPORTDUINO_LINUX_HARDWARE
|
|
; BLE peripheral support via BlueZ D-Bus needs sdbus-c++; when the dev package is
|
|
; absent these lines emit nothing and BLE compiles out (HAS_BLUETOOTH stays 0,
|
|
; see src/platform/portduino/architecture.h). The second line flags the sdbus-c++
|
|
; 2.x API for src/platform/portduino/SdbusCompat.h. Scriptlet lines must not sit
|
|
; last in this list: native_base appends "-I ..." to the final line inline, and a
|
|
; trailing scriptlet would swallow it into the shell command.
|
|
!pkg-config --cflags --libs sdbus-c++ --silence-errors || :
|
|
!pkg-config --exists 'sdbus-c++ >= 2' && echo '-DMESHTASTIC_SDBUS_CPP_V2' || :
|
|
-lstdc++fs
|
|
-lbluetooth
|
|
-lgpiod
|
|
-li2c
|
|
lib_ignore =
|
|
Adafruit NeoPixel
|
|
Adafruit ST7735 and ST7789 Library
|
|
Adafruit SSD1306
|
|
SD
|