Skip to content

Platforms and Devices

Mobile application

Current shape

  • Built from the shared Nuxt app with Capacitor
  • Android and iOS projects live under nuxt-frontend/android and nuxt-frontend/ios
  • Capacitor config points at .output/public
  • Native BLE support is provided through @capacitor-community/bluetooth-le

Status

AreaCurrent state
AndroidGitHub workflow builds debug APKs and creates GitHub releases
iOSCapacitor scripts exist; build/sign flow is manual through Xcode
Mobile UXDedicated mobile layout and mobile domain views are active
App-store readinessNot complete in repo state; enrollment page still shows disabled store buttons

Useful commands

bash
cd nuxt-frontend
npm run cap:sync
npm run cap:android
npm run cap:ios
npm run cap:build:ios

Phone badge / phone beacon notes

  • /phone-badge-onboarding is the admin/operator tooling surface for generating enrollment tokens
  • /scan-qr is the employee self-service entry point (QR scan or manual token paste)
  • /phone-beacon-enroll is the public token-driven enrollment flow
  • /ble-scanner covers all BLE diagnostics, including verifying that an enrollment station is broadcasting
  • Enrollment expects the native app for Bluetooth pairing

Windows desktop gateway

Current shape

  • DesktopGateway.Agent is a .NET 8 Windows service
  • DesktopGateway.Core holds runtime logic, contracts, site detection, API client, RSSI filtering
  • DesktopGateway.Msi packages the service installer

What it does

  • detects whether the machine is on an approved site network
  • scans BLE devices
  • optionally advertises a desktop beacon identity
  • registers/updates receiver and asset records
  • posts heartbeats and observation batches back to the API

Useful commands

bash
cd windows-desktop-gateway
dotnet build DesktopGateway.Agent/DesktopGateway.Agent.csproj --configuration Release
dotnet test DesktopGateway.Core.Tests/DesktopGateway.Core.Tests.csproj --configuration Release

ESP32 gateway

Current shape

  • PlatformIO/ESP-IDF project in esp32-gateway/
  • BLE scan + MQTT/TLS pipeline in src/main.cpp (legacy IoT Hub target; prefer the Aruba Event Hub path for new field deployments — see Architecture)
  • Sample secret template in include/secrets.h.example

Role

This is a hardware ingestion path for BLE telemetry. It is not the main day-to-day developer surface, but it matters for full-system understanding and field hardware work.

Virtual gateway (browser-based BLE scanner)

Current shape

useVirtualGateway.ts composable turns any Chrome browser or Android WebView into a BLE gateway without a dedicated hardware device.

Scan strategy (in priority order):

  1. navigator.bluetooth.requestLEScan() with 5-second timeout — passive scan (requires Chrome flag or Android)
  2. navigator.bluetooth.getDevices() — loads previously-granted devices without a picker
  3. navigator.bluetooth.requestDevice() — picker as last resort

Signal processing:

  • RSSI sliding-window averaging (configurable window size via useRssiFilter)
  • Log-distance path loss model with environment presets (office, warehouse, outdoor)
  • RPA resolution via useDeviceIdentifier

Observations are POSTed to the same /api/raddec/ingest route used by hardware gateways. The ble-scanner page in the UI surfaces this composable.

Serial BLE scanner (Web Serial API)

useSerialBleScanner.ts provides BLE scanning via the Web Serial API on Chrome desktop. Useful for connecting serial-attached BLE sniffer hardware (e.g., Nordic Sniffer dongle) without installing native drivers.

Node BLE scanner utility

Current shape

  • standalone Node script in ble-scanner/scanner.js
  • authenticates against the main API
  • posts to the same ingest path used by hardware gateways

Role

Useful for commissioning, debugging, and verifying ingestion without dedicated gateway hardware.

MikroTik KNOT hardware path

MikroTik KNOT routers are a supported hardware BLE ingestion path. They post directly to /api/knot/ingest using API key authentication. See the Data and Business Logic page for configuration details.

Legacy surfaces

PathStatus
archived/static-web-app-frontendLegacy frontend retained for history
static-web-app/negotiateConnectionLegacy root Azure Function artifact
static-web-app/processIoTHubMessagesLegacy root Azure Function artifact

Treat these as reference material only unless a migration or rollback task explicitly requires them.

NISC Muster Tracking Documentation