Carrier-grade TR-069 (CWMP) and TR-369 (USP) device management system built with Laravel 11
- β TR-069 (CWMP) - Legacy device management protocol
- β TR-369 (USP) - Next-generation User Services Platform
- β Dual Protocol - Devices can operate with both protocols
- π MQTT - Broker-based pub/sub communication
- π WebSocket - Direct device connections (RFC 6455 compliant)
- π‘ HTTP - Polling-based for restricted networks
- π 100,000+ Device Management - Scalable architecture
- β‘ Zero-Touch Provisioning - Automated device configuration
- π Firmware Management - Upload, version, and deploy firmware
- π Real-time Monitoring - Dashboard with metrics and charts
- π Subscribe/Notify - Event-based device notifications
- π§ͺ Remote Diagnostics - Ping, traceroute, speed tests (TR-143)
- π API Security - Key-based authentication
- π‘ Queue Processing - Laravel Horizon for async tasks
- PHP 8.3+
- PostgreSQL 16+ (or SQLite for development)
- Redis (for queue processing)
- Composer
- MQTT Broker (optional, test.mosquitto.org available)
git clone https://github.com/dexter939/EvoAcs.git
cd EvoAcs
composer install# Run interactive setup wizard
./scripts/setup-env.shOr Manual Setup:
cp .env.example .env
php artisan key:generate
# Edit .env with your configuration
nano .envSee Environment Setup Guide for detailed configuration.
# Run database migrations
php artisan migrate
# Optional: Seed sample data
php artisan db:seedDevelopment Server:
php artisan serve --host=0.0.0.0 --port=5000Background Services (Optional):
# Terminal 1: MQTT Subscriber (for MQTT transport)
php artisan usp:mqtt-subscribe
# Terminal 2: WebSocket Server (for WebSocket transport)
php artisan usp:websocket-server
# Terminal 3: Queue Worker (for async tasks)
php artisan horizonhttp://localhost:5000/acs/dashboard
# Application
APP_KEY= # Auto-generated
# Database
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_DATABASE=acs_database
DB_USERNAME=acs_user
DB_PASSWORD=your_password
# ACS API Key (REQUIRED)
ACS_API_KEY=your-secret-api-key
# TR-369 USP
USP_CONTROLLER_ENDPOINT_ID=proto::acs-controller
USP_WEBSOCKET_PORT=9000
# MQTT Broker
MQTT_HOST=test.mosquitto.org
MQTT_PORT=1883
# Redis (for queues & WebSocket)
REDIS_HOST=127.0.0.1
QUEUE_CONNECTION=redisπ Complete Reference: Environment Variables Documentation
POST /tr069
SOAP-based endpoint for TR-069 device communication.
POST /usp
Binary protobuf endpoint for USP Records (HTTP MTP).
POST /api/v1/usp/devices/{device}/get-params
POST /api/v1/usp/devices/{device}/set-params
POST /api/v1/usp/devices/{device}/operate
POST /api/v1/usp/devices/{device}/add-object
DELETE /api/v1/usp/devices/{device}/delete-object
POST /api/v1/usp/devices/{device}/reboot
POST /api/v1/usp/devices/{device}/subscribe
DELETE /api/v1/usp/devices/{device}/subscriptions/{id}
Authentication: API Key required in X-API-Key header.
π Complete API Docs: USP API Documentation
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ACS Controller β
β β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββ β
β β TR-069 SOAP β β TR-369 USP β β RESTful β β
β β Endpoint β β Endpoint β β API β β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Transport Layer (MTP) β β
β β ββββββββ ββββββββββββ ββββββββββββββββββ β β
β β β MQTT β β WebSocketβ β HTTP Polling β β β
β β ββββββββ ββββββββββββ ββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Queue System (Laravel Horizon) β β
β β Database (PostgreSQL) β β
β β Cache & Session (Redis) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CPE Devices (100K+) β
β TR-069 CWMP Devices β TR-369 USP Devices β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Backend: Laravel 11, PHP 8.3
- Database: PostgreSQL 16 (optimized for 100K+ devices)
- Queue: Redis + Laravel Horizon
- Protocols: Protocol Buffers (TR-369), SOAP (TR-069)
- Transport: MQTT (php-mqtt/laravel-client), WebSocket (native PHP), HTTP
- Frontend: Soft UI Dashboard, Chart.js
- Icons: FontAwesome 6
# Test USP API endpoints
./tests/test_usp_api.sh
# Test Subscribe/Notify pattern
./tests/test_subscribe_notify.sh# Test message encoding/decoding
php artisan usp:test-message
# Test MQTT communication
php artisan usp:test-mqtt
# Test controller functionality
php artisan usp:test-controller- Legacy Metrics: Devices Online, Tasks Pending, Firmware Deploys, Tests, etc.
- TR-069 Metrics: CWMP device count
- TR-369 Metrics: USP device count, MQTT/HTTP transport statistics
- Device Status (Doughnut Chart)
- Provisioning Tasks (Bar Chart)
- Diagnostics (Polar Area Chart)
- Firmware Deployments (Line Chart)
- Protocol filtering (TR-069 / TR-369)
- MTP transport filtering (MQTT / WebSocket / HTTP)
- Status badges and icons
- Real-time auto-refresh (30s)
- Environment Setup Guide - Detailed configuration
- Environment Variables - Complete variable reference
- USP API Documentation - RESTful API guide
- Postman Collection - API testing
- Change
ACS_API_KEYto strong random value (32+ chars) - Set
APP_ENV=productionandAPP_DEBUG=false - Enable SSL/TLS for MQTT (port 8883)
- Enable WebSocket SSL (
USP_WEBSOCKET_SSL=true) - Configure trusted proxies for load balancer
- Implement multi-tenant authentication (roadmap)
- Enable rate limiting
- Configure monitoring (Sentry, metrics)
All /api/v1/* endpoints require API key:
curl -H "X-API-Key: your-api-key" \
http://localhost:5000/api/v1/usp/devicesUse a process manager (systemd, supervisor, or PM2):
# /etc/systemd/system/acs-mqtt.service
[Unit]
Description=ACS MQTT Subscriber
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/acs
ExecStart=/usr/bin/php artisan usp:mqtt-subscribe
Restart=always
[Install]
WantedBy=multi-user.targetRepeat for:
acs-websocket.serviceβphp artisan usp:websocket-serveracs-horizon.serviceβphp artisan horizon
# Cache configuration
php artisan config:cache
php artisan route:cache
php artisan view:cache
# Optimize autoloader
composer install --optimize-autoloader --no-dev1. WebSocket connection failed
# Check if port is configured
grep USP_WEBSOCKET_PORT .env
# Start WebSocket server
php artisan usp:websocket-server2. MQTT connection failed
# Test MQTT connection
php artisan usp:test-mqtt
# Check broker settings
grep MQTT_ .env3. Queue not processing
# Check queue configuration
grep QUEUE_CONNECTION .env
# Start Horizon
php artisan horizon4. API authentication failed
# Verify API key is set
grep ACS_API_KEY .env
# Use in request
curl -H "X-API-Key: your-key" http://localhost:5000/api/v1/...- β TR-069 CWMP support
- β TR-369 USP support
- β MQTT/WebSocket/HTTP transport
- β Subscribe/Notify pattern
- β RESTful API
- β Web dashboard
- Multi-tenant authentication system
- Bulk device operations
- Device grouping and tagging
- Scheduled provisioning (cron-based)
- Advanced analytics and reporting
- Prometheus metrics export
- High-availability clustering
- Rate limiting and throttling
This project is licensed under the MIT License.
- Broadband Forum - TR-069 and TR-369 specifications
- Laravel - PHP framework
- Soft UI Dashboard - Admin template
- Chart.js - Charting library
For issues and questions:
- Open an issue on GitHub
- Check Documentation
- Review Troubleshooting Guide
Built with β€οΈ for telecom operators managing large-scale CPE deployments