552 lines
16 KiB
YAML
552 lines
16 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Travel Router Control API
|
|
description: |
|
|
API for controlling a mini travel router with dual WiFi interfaces and Ethernet connectivity.
|
|
The router can operate as a WiFi repeater, connecting to upstream networks while providing
|
|
a hotspot for client devices.
|
|
version: 1.0.0
|
|
contact:
|
|
name: API Support
|
|
license:
|
|
name: MIT
|
|
|
|
servers:
|
|
- url: http://localhost:8080
|
|
description: Local router API
|
|
|
|
tags:
|
|
- name: WiFi
|
|
description: WiFi client operations (upstream network connection)
|
|
- name: Hotspot
|
|
description: Access point operations (client-facing hotspot)
|
|
- name: Devices
|
|
description: Connected devices management
|
|
- name: System
|
|
description: System status and monitoring
|
|
- name: Logs
|
|
description: System logs and real-time monitoring
|
|
|
|
paths:
|
|
/api/wifi/networks:
|
|
get:
|
|
tags:
|
|
- WiFi
|
|
summary: Get discovered WiFi networks
|
|
description: |
|
|
Returns the list of WiFi networks from the last scan without triggering a new scan.
|
|
Returns an empty list if no scan has been performed yet.
|
|
operationId: getWiFiNetworks
|
|
responses:
|
|
'200':
|
|
description: List of discovered networks
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/WiFiNetwork'
|
|
example:
|
|
- ssid: "Hotel-Guest"
|
|
signal: 5
|
|
security: "WPA2"
|
|
channel: 6
|
|
bssid: "aa:bb:cc:dd:ee:ff"
|
|
- ssid: "Public-WiFi"
|
|
signal: 3
|
|
security: "Open"
|
|
channel: 11
|
|
bssid: "11:22:33:44:55:66"
|
|
'500':
|
|
description: Error retrieving networks
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/wifi/scan:
|
|
get:
|
|
tags:
|
|
- WiFi
|
|
summary: Scan for available WiFi networks
|
|
description: |
|
|
Triggers a WiFi scan using wpa_supplicant via D-Bus and returns all discovered networks
|
|
sorted by signal strength. The scan takes approximately 2 seconds to complete.
|
|
operationId: scanWiFi
|
|
responses:
|
|
'200':
|
|
description: Successfully scanned networks
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/WiFiNetwork'
|
|
example:
|
|
- ssid: "Hotel-Guest"
|
|
signal: 5
|
|
security: "WPA2"
|
|
channel: 6
|
|
bssid: "aa:bb:cc:dd:ee:ff"
|
|
- ssid: "Public-WiFi"
|
|
signal: 3
|
|
security: "Open"
|
|
channel: 11
|
|
bssid: "11:22:33:44:55:66"
|
|
'500':
|
|
description: Scan error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/wifi/connect:
|
|
post:
|
|
tags:
|
|
- WiFi
|
|
summary: Connect to a WiFi network
|
|
description: |
|
|
Connects the router to an upstream WiFi network using wpa_supplicant.
|
|
Supports both open and password-protected networks (WPA/WPA2).
|
|
operationId: connectWiFi
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/WiFiConnectRequest'
|
|
examples:
|
|
protected:
|
|
summary: WPA2 protected network
|
|
value:
|
|
ssid: "Hotel-Guest"
|
|
password: "guest1234"
|
|
open:
|
|
summary: Open network
|
|
value:
|
|
ssid: "Public-WiFi"
|
|
password: ""
|
|
responses:
|
|
'200':
|
|
description: Successfully connected
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'400':
|
|
description: Invalid request data
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
'500':
|
|
description: Connection failed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/wifi/disconnect:
|
|
post:
|
|
tags:
|
|
- WiFi
|
|
summary: Disconnect from WiFi network
|
|
description: |
|
|
Disconnects from the currently connected upstream WiFi network
|
|
and removes all saved network configurations.
|
|
operationId: disconnectWiFi
|
|
responses:
|
|
'200':
|
|
description: Successfully disconnected
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'500':
|
|
description: Disconnection failed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/hotspot/toggle:
|
|
post:
|
|
tags:
|
|
- Hotspot
|
|
summary: Toggle hotspot on/off
|
|
description: |
|
|
Enables or disables the hotspot (access point) by starting/stopping
|
|
the hostapd service. Returns the new enabled state and updates
|
|
the system status with current hostapd_cli information.
|
|
operationId: toggleHotspot
|
|
responses:
|
|
'200':
|
|
description: Hotspot state changed successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
enabled:
|
|
type: boolean
|
|
description: Current hotspot state after toggle
|
|
required:
|
|
- enabled
|
|
example:
|
|
enabled: true
|
|
'500':
|
|
description: Failed to change hotspot state
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/devices:
|
|
get:
|
|
tags:
|
|
- Devices
|
|
summary: Get connected devices
|
|
description: |
|
|
Returns a list of all devices currently connected to the hotspot.
|
|
Device information is gathered from DHCP leases and ARP tables.
|
|
Only devices with active ARP entries are considered connected.
|
|
operationId: getDevices
|
|
responses:
|
|
'200':
|
|
description: List of connected devices
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ConnectedDevice'
|
|
example:
|
|
- name: "iPhone-12"
|
|
type: "mobile"
|
|
mac: "aa:bb:cc:11:22:33"
|
|
ip: "192.168.1.100"
|
|
- name: "MacBook-Pro"
|
|
type: "laptop"
|
|
mac: "dd:ee:ff:44:55:66"
|
|
ip: "192.168.1.101"
|
|
'500':
|
|
description: Failed to retrieve device list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/api/status:
|
|
get:
|
|
tags:
|
|
- System
|
|
summary: Get system status
|
|
description: |
|
|
Returns comprehensive system status including WiFi connection state,
|
|
detailed hotspot status from hostapd_cli, connected device count,
|
|
data usage, and uptime.
|
|
operationId: getStatus
|
|
responses:
|
|
'200':
|
|
description: Current system status
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SystemStatus'
|
|
|
|
/api/logs:
|
|
get:
|
|
tags:
|
|
- Logs
|
|
summary: Get system logs
|
|
description: |
|
|
Returns the last 100 log entries from the system.
|
|
For real-time log streaming, use the WebSocket endpoint.
|
|
operationId: getLogs
|
|
responses:
|
|
'200':
|
|
description: List of log entries
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/LogEntry'
|
|
example:
|
|
- timestamp: "2025-10-28T14:32:10Z"
|
|
source: "WiFi"
|
|
message: "Scan terminé - 5 réseaux trouvés"
|
|
- timestamp: "2025-10-28T14:32:15Z"
|
|
source: "WiFi"
|
|
message: "Tentative de connexion à Hotel-Guest"
|
|
delete:
|
|
tags:
|
|
- Logs
|
|
summary: Clear system logs
|
|
description: Clears all stored log entries (keeps only the "logs cleared" entry)
|
|
operationId: clearLogs
|
|
responses:
|
|
'200':
|
|
description: Logs cleared successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
|
|
/ws/logs:
|
|
get:
|
|
tags:
|
|
- Logs
|
|
summary: WebSocket for real-time logs
|
|
description: |
|
|
WebSocket endpoint for receiving real-time log updates.
|
|
Upon connection, all existing logs are sent, followed by new logs as they occur.
|
|
|
|
This is a WebSocket endpoint - upgrade the HTTP connection to WebSocket protocol.
|
|
operationId: logsWebSocket
|
|
responses:
|
|
'101':
|
|
description: WebSocket connection established
|
|
'400':
|
|
description: WebSocket upgrade failed
|
|
|
|
components:
|
|
schemas:
|
|
WiFiNetwork:
|
|
type: object
|
|
description: Discovered WiFi network information
|
|
properties:
|
|
ssid:
|
|
type: string
|
|
description: Network SSID (name)
|
|
example: "Hotel-Guest"
|
|
signal:
|
|
type: integer
|
|
description: Signal strength (1-5 scale)
|
|
minimum: 1
|
|
maximum: 5
|
|
example: 4
|
|
security:
|
|
type: string
|
|
description: Security type
|
|
enum:
|
|
- Open
|
|
- WEP
|
|
- WPA
|
|
- WPA2
|
|
example: "WPA2"
|
|
channel:
|
|
type: integer
|
|
description: WiFi channel number
|
|
minimum: 1
|
|
maximum: 165
|
|
example: 6
|
|
bssid:
|
|
type: string
|
|
description: Access point MAC address
|
|
pattern: '^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$'
|
|
example: "aa:bb:cc:dd:ee:ff"
|
|
required:
|
|
- ssid
|
|
- signal
|
|
- security
|
|
- channel
|
|
- bssid
|
|
|
|
WiFiConnectRequest:
|
|
type: object
|
|
description: Request to connect to a WiFi network
|
|
properties:
|
|
ssid:
|
|
type: string
|
|
description: Network SSID to connect to
|
|
example: "Hotel-Guest"
|
|
password:
|
|
type: string
|
|
description: Network password (empty string for open networks)
|
|
example: "guest1234"
|
|
required:
|
|
- ssid
|
|
- password
|
|
|
|
HotspotStatus:
|
|
type: object
|
|
description: Detailed hotspot status from hostapd_cli
|
|
properties:
|
|
state:
|
|
type: string
|
|
description: Hotspot state (ENABLED, DISABLED, etc.)
|
|
example: "ENABLED"
|
|
ssid:
|
|
type: string
|
|
description: Current SSID being broadcast
|
|
example: "TravelRouter"
|
|
bssid:
|
|
type: string
|
|
description: MAC address of the access point
|
|
pattern: '^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$'
|
|
example: "4a:e3:4e:09:57:f8"
|
|
channel:
|
|
type: integer
|
|
description: Current WiFi channel
|
|
minimum: 1
|
|
maximum: 14
|
|
example: 11
|
|
frequency:
|
|
type: integer
|
|
description: Frequency in MHz
|
|
example: 2462
|
|
numStations:
|
|
type: integer
|
|
description: Number of connected stations
|
|
minimum: 0
|
|
example: 2
|
|
hwMode:
|
|
type: string
|
|
description: Hardware mode (g, a, n, ac, etc.)
|
|
example: "g"
|
|
countryCode:
|
|
type: string
|
|
description: Country code
|
|
example: "VN"
|
|
required:
|
|
- state
|
|
|
|
ConnectedDevice:
|
|
type: object
|
|
description: Device connected to the hotspot
|
|
properties:
|
|
name:
|
|
type: string
|
|
description: Device hostname
|
|
example: "iPhone-12"
|
|
type:
|
|
type: string
|
|
description: Detected device type
|
|
enum:
|
|
- mobile
|
|
- tablet
|
|
- laptop
|
|
- desktop
|
|
- unknown
|
|
example: "mobile"
|
|
mac:
|
|
type: string
|
|
description: Device MAC address
|
|
pattern: '^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$'
|
|
example: "aa:bb:cc:11:22:33"
|
|
ip:
|
|
type: string
|
|
description: Assigned IP address
|
|
pattern: '^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$'
|
|
example: "192.168.1.100"
|
|
required:
|
|
- name
|
|
- type
|
|
- mac
|
|
- ip
|
|
|
|
SystemStatus:
|
|
type: object
|
|
description: Overall system status
|
|
properties:
|
|
connected:
|
|
type: boolean
|
|
description: Whether router is connected to upstream WiFi
|
|
example: true
|
|
connectionState:
|
|
type: string
|
|
description: Current WiFi connection state
|
|
enum:
|
|
- connected
|
|
- disconnected
|
|
- connecting
|
|
- disconnecting
|
|
- roaming
|
|
example: "connected"
|
|
connectedSSID:
|
|
type: string
|
|
description: SSID of connected upstream network (empty if not connected)
|
|
example: "Hotel-Guest"
|
|
hotspotStatus:
|
|
allOf:
|
|
- $ref: '#/components/schemas/HotspotStatus'
|
|
nullable: true
|
|
description: Detailed hotspot status (null if hotspot is not running)
|
|
connectedCount:
|
|
type: integer
|
|
description: Number of devices connected to hotspot
|
|
minimum: 0
|
|
example: 3
|
|
dataUsage:
|
|
type: number
|
|
format: double
|
|
description: Total data usage in MB
|
|
example: 145.7
|
|
uptime:
|
|
type: integer
|
|
format: int64
|
|
description: System uptime in seconds
|
|
example: 3600
|
|
connectedDevices:
|
|
type: array
|
|
description: List of devices connected to hotspot
|
|
items:
|
|
$ref: '#/components/schemas/ConnectedDevice'
|
|
required:
|
|
- connected
|
|
- connectionState
|
|
- connectedSSID
|
|
- connectedCount
|
|
- dataUsage
|
|
- uptime
|
|
- connectedDevices
|
|
|
|
LogEntry:
|
|
type: object
|
|
description: System log entry
|
|
properties:
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
description: When the log entry was created
|
|
example: "2025-10-28T14:32:10Z"
|
|
source:
|
|
type: string
|
|
description: Log source component
|
|
enum:
|
|
- Système
|
|
- WiFi
|
|
- Hotspot
|
|
example: "WiFi"
|
|
message:
|
|
type: string
|
|
description: Log message
|
|
example: "Scan terminé - 5 réseaux trouvés"
|
|
required:
|
|
- timestamp
|
|
- source
|
|
- message
|
|
|
|
SuccessResponse:
|
|
type: object
|
|
description: Generic success response
|
|
properties:
|
|
status:
|
|
type: string
|
|
enum:
|
|
- success
|
|
example: "success"
|
|
required:
|
|
- status
|
|
|
|
Error:
|
|
type: object
|
|
description: Error response
|
|
properties:
|
|
error:
|
|
type: string
|
|
description: Error message
|
|
example: "Erreur lors du scan WiFi"
|
|
required:
|
|
- error
|