Skip to content

Architecture

System Diagram

┌─────────────┐     ┌─────────────┐
│ md-my-door  │     │md-cloud-    │
│ (mobile app)│     │portal (web) │
└──────┬──────┘     └──────┬──────┘
       │    ┌──────────┐   │
       └────┤ md-npm   ├───┘   (shared Vue components)
            └──────────┘

          HTTPS / REST

            ┌────▼────┐
            │md-cloud  │◄──── Keycloak (auth)
            │ (API)    │◄──── PostgreSQL
            └────┬─────┘

            ┌────▼────┐
            │ md-hub   │◄──── PostgreSQL
            │(MQTT/CAN)│
            └────┬─────┘

              MQTT

         ┌───────▼───────┐
         │  md-firmware   │
         │(ESP32-S3 GW)   │
         └───────┬────────┘

              CAN bus

    ┌────────────▼────────────┐
    │  Door Controllers       │
    │  + doorson_ble_smartswitch│
    └─────────────────────────┘

Data Flow

  1. Door → Cloud: Door controllers send CAN frames → ESP32 gateway translates to MQTT → md-hub processes and stores → md-cloud exposes via REST API
  2. Cloud → Door: User sends command via portal/app → md-cloud → md-hub publishes MQTT → gateway translates to CAN command → door controller executes
  3. Auth: All API requests authenticated via Keycloak OAuth2 tokens. Backend services are resource servers validating JWT tokens.

Backend Services

Both md-cloud and md-hub run as Spring Boot 3 applications on JDK 21:

  • Docker images: eclipse-temurin:21-jdk-alpine
  • Database: PostgreSQL with Flyway-managed migrations
  • Scheduling: ShedLock for distributed task locking
  • Logging: Log4j2

md-cloud

Core API service. Handles door management, scheduling, holidays, user provisioning. Integrates with Keycloak admin API for user management.

  • Debug port: 9110
  • Dev setup requires AUTH_HOST=doorson-auth in /etc/hosts

md-hub

Processes CAN controller data packets arriving via MQTT. Manages door controller settings and phone numbers.

  • Debug port: 9111
  • Uses Eclipse Paho MQTT v5 client + Spring Integration

Frontend Apps

Both md-cloud-portal and md-my-door are built with Vue 3 + Quasar 2 + Vite:

  • Auth: Keycloak JS adapter
  • State: Pinia stores
  • Shared code: md-npm package (consumed as local .tgz)
  • md-my-door additionally uses Cordova for native Android/iOS builds

Firmware

md-firmware (Gateway)

ESP-IDF v5.5.2 targeting ESP32-S3. Bridges CAN bus (TWAI) to cloud via MQTT. Features:

  • BLE WiFi provisioning (NimBLE)
  • OTA firmware updates
  • HTTP config server with basic auth
  • LED status indicators + button hold actions
  • CI/CD: GitHub Actions builds on tag push (v*.* or v*.*-rc*)

doorson_ble_smartswitch

nRF Connect SDK (Zephyr) targeting nRF52840. BLE peripheral with Acconeer A121 radar for presence detection.

  • Advertises as "Doorson SmartSwitch" over BLE
  • Flash via J-Link SWD or UART DFU