Skip to content

SecuRTRest Plugin

Description

SecuRTRest is a comprehensive REST API plugin designed specifically for the SecuRT security solution. It provides enterprise-grade HTTP-based API endpoints for security system integration, real-time analytics configuration, instance management, and seamless VMS integration through a fully documented OpenAPI 3.0 specification.

Key Features

  • Complete REST API: 68+ endpoints covering all SecuRT functionality
  • OpenAPI 3.0 Compliant: Auto-generated, fully documented API specification
  • Real-Time Configuration: Dynamic analytics configuration without system restart
  • VMS Integration Ready: Standardized REST interface for security management systems
  • Comprehensive Analytics: 12+ area types and 3 line types for security analytics
  • Instance Lifecycle Management: Full control over SecuRT instance creation, configuration, and monitoring
  • Enterprise Security: Production-ready error handling and input validation

Use Cases

  • VMS Integration: Integrate SecuRT with existing Video Management Systems
  • Security Platform Integration: Connect with PSIM and security management platforms
  • Custom Applications: Build custom security applications using the REST API
  • Remote Configuration: Manage SecuRT instances remotely through HTTP API
  • Analytics Management: Configure and monitor security analytics in real-time
  • Multi-Instance Deployment: Manage multiple SecuRT instances from centralized systems

Requirements

Software Dependencies

Core Requirements: - CVEDIA-RT SecuRT solution - httplib HTTP server framework - nlohmann/json for JSON serialization - RTCORE (CVEDIA-RT core libraries)

Platform Support: - Primary: Windows (full support) - Secondary: Linux (compatible)

Network Requirements

Server Configuration: - Default Port: 3546 - Protocol: HTTP/1.1 - Content-Type: application/json - Base URL: http://localhost:3546/v1/securt/

Firewall Configuration:

# Allow inbound connections on SecuRTRest port
# Windows Firewall
netsh advfirewall firewall add rule name="SecuRTRest" dir=in action=allow protocol=TCP localport=3546

# Linux iptables
sudo iptables -A INPUT -p tcp --dport 3546 -j ACCEPT

REST API Overview

API Structure

The SecuRTRest plugin provides three main API categories:

1. Instance Management API - Instance lifecycle operations (create, update, delete) - Configuration management (motion areas, performance profiles) - Feature control (LPR, face detection, feature extraction) - Statistics and monitoring

2. Areas Management API - 12+ security analytics area types - Dynamic area configuration - Real-time area management

3. Lines Management API - 3 line-based analytics types - Crossing and counting line configuration - Directional analytics setup

Supported Analytics Types

Area-Based Analytics

Area Type Description Key Parameters
Intrusion Detection Detect unauthorized entry Duration threshold, object classes
Crossing Areas Monitor area crossing events Entry/exit detection, dwell time
Loitering Detect prolonged presence Duration threshold, sensitivity
Crowding Monitor crowd density Person count thresholds, density
Occupancy Track area occupancy Max occupancy, duration
Dwelling Detect stationary objects/people Duration threshold, object classes
Crowd Estimation Estimate crowd size Density calculation, count estimation
Armed Person Detection Detect weapons Weapon classification, confidence
Object Left/Removed Detect abandoned/removed objects Duration, object persistence
Fallen Person Detect fallen people Pose analysis, duration threshold
ALPR License plate recognition OCR confidence, plate format
Vehicle Guard Vehicle-specific detection Vehicle classification, loitering
Face Covered Detect masked faces Face analysis, coverage detection

Line-Based Analytics

Line Type Description Key Parameters
Crossing Lines Count objects crossing lines Direction, object classes
Counting Lines Bidirectional counting In/out counting, object filtering
Tailgating Detect tailgating behavior Time threshold, person separation

Configuration

Basic Server Configuration

{
  "securtrest": {
    "server": {
      "host": "localhost",
      "port": 3546,
      "base_path": "/v1/securt",
      "max_connections": 100,
      "timeout_seconds": 30
    },
    "security": {
      "enable_cors": true,
      "allowed_origins": ["*"],
      "enable_logging": true,
      "log_requests": true
    },
    "performance": {
      "thread_pool_size": 4,
      "keep_alive": true,
      "compression": true
    }
  }
}

Instance Configuration Schema

{
  "instance_config": {
    "name": "Security Camera 1",
    "detector_mode": "SmartDetection",
    "sensitivity": "Medium",
    "sensor_modality": "RGB",
    "metadata_mode": true,
    "statistics_mode": true,
    "debug_mode": false,
    "diagnostics_mode": false,
    "max_fps": 30,
    "motion_area": {
      "coordinates": [
        {"x": 0.1, "y": 0.1},
        {"x": 0.9, "y": 0.1},
        {"x": 0.9, "y": 0.9},
        {"x": 0.1, "y": 0.9}
      ]
    },
    "performance_profile": "Balanced"
  }
}

Area Configuration Example

{
  "intrusion_area": {
    "id": "area_001",
    "name": "Main Entrance",
    "coordinates": [
      {"x": 0.2, "y": 0.3},
      {"x": 0.8, "y": 0.3},
      {"x": 0.8, "y": 0.7},
      {"x": 0.2, "y": 0.7}
    ],
    "classes": ["Person", "Vehicle"],
    "color": "#FF0000",
    "duration_threshold": 5.0,
    "sensitivity": "High"
  }
}

Configuration Schema

Parameter Type Default Description
server.host string "localhost" HTTP server bind address
server.port integer 3546 HTTP server port
server.base_path string "/v1/securt" API base path
server.max_connections integer 100 Maximum concurrent connections
server.timeout_seconds integer 30 Request timeout
security.enable_cors boolean true Enable CORS headers
security.allowed_origins array ["*"] Allowed CORS origins
security.enable_logging boolean true Enable request logging
performance.thread_pool_size integer 4 HTTP server thread pool size
performance.keep_alive boolean true Enable HTTP keep-alive
performance.compression boolean true Enable response compression

API Reference

Core Data Models

Basic Types

// Coordinate system (normalized 0.0-1.0)
struct Coordinate {
    double x;  // Horizontal position (0.0 = left, 1.0 = right)
    double y;  // Vertical position (0.0 = top, 1.0 = bottom)
};

// Object classification
enum class ObjectClass {
    Person,
    Animal, 
    Vehicle,
    Face,
    Unknown
};

// Detection sensitivity
enum class Sensitivity {
    Low,
    Medium,
    High
};

// Movement direction
enum class Direction {
    Up,
    Down, 
    Both
};

Instance Management

// Instance configuration
struct SecuRTInstanceWrite {
    std::string name;
    DetectorMode detectorMode;
    Sensitivity sensitivity;
    SensorModality sensorModality;
    bool metadataMode;
    bool statisticsMode;
    bool debugMode;
    bool diagnosticsMode;
    std::optional<int> maxFps;
};

// Instance response
struct SecuRTInstanceRead {
    std::string id;
    std::string name;
    DetectorMode detectorMode;
    Sensitivity sensitivity;
    // ... additional read-only fields
};

Area Management

// Base area structure
struct AreaBase {
    std::string id;
    std::string name;
    std::vector<Coordinate> coordinates;
    std::vector<ObjectClass> classes;
    std::string color;  // Hex color code
};

// Intrusion detection area
struct IntrusionAreaWrite : AreaBase {
    double durationThreshold;  // Seconds
    Sensitivity sensitivity;
};

// Loitering area
struct LoiteringAreaWrite : AreaBase {
    double durationThreshold;  // Seconds
    Sensitivity sensitivity;
};

// Crowding area
struct CrowdingAreaWrite : AreaBase {
    int maxPersons;
    double durationThreshold;
    Sensitivity sensitivity;
};

Line Management

// Base line structure
struct LineBase {
    std::string id;
    std::string name;
    std::vector<Coordinate> coordinates;  // Line endpoints
    std::vector<ObjectClass> classes;
    std::string color;
    Direction direction;
};

// Crossing line
struct CrossingLineWrite : LineBase {
    // Inherits all base line properties
};

// Tailgating line
struct TailgatingLineWrite : LineBase {
    double timeThreshold;  // Seconds between crossings
};

REST API Endpoints

Instance Management

# Create new instance
POST /v1/securt/instance
Content-Type: application/json

{
  "name": "Security Camera 1",
  "detectorMode": "SmartDetection",
  "sensitivity": "Medium",
  "sensorModality": "RGB"
}

# Response: 201 Created
{
  "id": "instance_12345",
  "name": "Security Camera 1",
  "detectorMode": "SmartDetection",
  "sensitivity": "Medium",
  "sensorModality": "RGB",
  "createdAt": "2023-11-15T10:30:00Z"
}
# Update instance
PATCH /v1/securt/instance/{instanceId}
Content-Type: application/json

{
  "name": "Updated Camera Name",
  "sensitivity": "High"
}

# Response: 200 OK
{
  "id": "instance_12345",
  "name": "Updated Camera Name",
  "sensitivity": "High"
}
# Get instance statistics
GET /v1/securt/instance/{instanceId}/stats

# Response: 200 OK
{
  "instanceId": "instance_12345",
  "uptime": 3600,
  "framesProcessed": 108000,
  "averageFps": 30.0,
  "detectionCount": 1250,
  "memoryUsage": "256MB",
  "cpuUsage": 25.5
}

Area Management

# Create intrusion detection area
POST /v1/securt/instance/{instanceId}/area/intrusion
Content-Type: application/json

{
  "name": "Main Entrance",
  "coordinates": [
    {"x": 0.2, "y": 0.3},
    {"x": 0.8, "y": 0.3},
    {"x": 0.8, "y": 0.7},
    {"x": 0.2, "y": 0.7}
  ],
  "classes": ["Person"],
  "color": "#FF0000",
  "durationThreshold": 3.0,
  "sensitivity": "High"
}

# Response: 201 Created
{
  "id": "area_001",
  "name": "Main Entrance",
  "type": "intrusion",
  "coordinates": [...],
  "classes": ["Person"],
  "color": "#FF0000",
  "durationThreshold": 3.0,
  "sensitivity": "High",
  "createdAt": "2023-11-15T10:35:00Z"
}
# Create loitering area
POST /v1/securt/instance/{instanceId}/area/loitering
Content-Type: application/json

{
  "name": "Parking Lot",
  "coordinates": [
    {"x": 0.0, "y": 0.0},
    {"x": 1.0, "y": 0.0},
    {"x": 1.0, "y": 0.5},
    {"x": 0.0, "y": 0.5}
  ],
  "classes": ["Person", "Vehicle"],
  "color": "#00FF00",
  "durationThreshold": 30.0,
  "sensitivity": "Medium"
}
# Get all areas for instance
GET /v1/securt/instance/{instanceId}/areas

# Response: 200 OK
{
  "areas": [
    {
      "id": "area_001",
      "type": "intrusion",
      "name": "Main Entrance",
      "coordinates": [...],
      "active": true
    },
    {
      "id": "area_002", 
      "type": "loitering",
      "name": "Parking Lot",
      "coordinates": [...],
      "active": true
    }
  ],
  "totalCount": 2
}

Line Management

# Create crossing line
POST /v1/securt/instance/{instanceId}/line/crossing
Content-Type: application/json

{
  "name": "Entry Gate",
  "coordinates": [
    {"x": 0.3, "y": 0.2},
    {"x": 0.7, "y": 0.8}
  ],
  "classes": ["Person", "Vehicle"],
  "color": "#0000FF",
  "direction": "Both"
}

# Response: 201 Created
{
  "id": "line_001",
  "type": "crossing",
  "name": "Entry Gate",
  "coordinates": [
    {"x": 0.3, "y": 0.2},
    {"x": 0.7, "y": 0.8}
  ],
  "classes": ["Person", "Vehicle"],
  "color": "#0000FF",
  "direction": "Both",
  "createdAt": "2023-11-15T10:40:00Z"
}

Error Handling

HTTP Status Codes

Status Code Description Usage
200 OK Success GET, PATCH operations
201 Created Resource created POST operations
400 Bad Request Invalid request data Validation errors
404 Not Found Resource not found Invalid IDs
409 Conflict Resource already exists Duplicate creation
500 Internal Server Error Server error System failures

Error Response Format

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid coordinate values",
    "details": {
      "field": "coordinates",
      "value": "x coordinate must be between 0.0 and 1.0"
    },
    "timestamp": "2023-11-15T10:45:00Z"
  }
}

Examples

Complete Instance Setup

#!/bin/bash
# Complete SecuRT instance configuration script

BASE_URL="http://localhost:3546/v1/securt"
INSTANCE_ID=""

# 1. Create instance
echo "Creating SecuRT instance..."
INSTANCE_RESPONSE=$(curl -s -X POST "$BASE_URL/instance" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Main Security Camera",
    "detectorMode": "SmartDetection",
    "sensitivity": "Medium",
    "sensorModality": "RGB",
    "metadataMode": true,
    "statisticsMode": true,
    "maxFps": 30
  }')

INSTANCE_ID=$(echo $INSTANCE_RESPONSE | jq -r '.id')
echo "Created instance: $INSTANCE_ID"

# 2. Configure motion detection area
echo "Setting up motion detection area..."
curl -s -X POST "$BASE_URL/instance/$INSTANCE_ID/motion_area" \
  -H "Content-Type: application/json" \
  -d '{
    "coordinates": [
      {"x": 0.1, "y": 0.1},
      {"x": 0.9, "y": 0.1},
      {"x": 0.9, "y": 0.9},
      {"x": 0.1, "y": 0.9}
    ]
  }'

# 3. Create intrusion detection area
echo "Creating intrusion detection area..."
curl -s -X POST "$BASE_URL/instance/$INSTANCE_ID/area/intrusion" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Restricted Zone",
    "coordinates": [
      {"x": 0.3, "y": 0.3},
      {"x": 0.7, "y": 0.3},
      {"x": 0.7, "y": 0.6},
      {"x": 0.3, "y": 0.6}
    ],
    "classes": ["Person"],
    "color": "#FF0000",
    "durationThreshold": 2.0,
    "sensitivity": "High"
  }'

# 4. Create counting line
echo "Creating counting line..."
curl -s -X POST "$BASE_URL/instance/$INSTANCE_ID/line/crossing" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Main Entrance",
    "coordinates": [
      {"x": 0.2, "y": 0.5},
      {"x": 0.8, "y": 0.5}
    ],
    "classes": ["Person"],
    "color": "#00FF00",
    "direction": "Both"
  }'

# 5. Configure performance profile
echo "Setting performance profile..."
curl -s -X POST "$BASE_URL/instance/$INSTANCE_ID/performance_profile" \
  -H "Content-Type: application/json" \
  -d '{"profile": "Balanced"}'

# 6. Get instance statistics
echo "Getting instance statistics..."
curl -s "$BASE_URL/instance/$INSTANCE_ID/stats" | jq .

echo "SecuRT instance setup complete: $INSTANCE_ID"

Python Integration Example

import requests
import json
from typing import Dict, List, Optional

class SecuRTClient:
    def __init__(self, base_url: str = "http://localhost:3546/v1/securt"):
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers.update({
            'Content-Type': 'application/json',
            'User-Agent': 'SecuRT-Python-Client/1.0'
        })

    def create_instance(self, config: Dict) -> str:
        """Create new SecuRT instance"""
        response = self.session.post(f"{self.base_url}/instance", json=config)
        response.raise_for_status()
        return response.json()['id']

    def create_intrusion_area(self, instance_id: str, area_config: Dict) -> str:
        """Create intrusion detection area"""
        url = f"{self.base_url}/instance/{instance_id}/area/intrusion"
        response = self.session.post(url, json=area_config)
        response.raise_for_status()
        return response.json()['id']

    def create_crossing_line(self, instance_id: str, line_config: Dict) -> str:
        """Create crossing line"""
        url = f"{self.base_url}/instance/{instance_id}/line/crossing"
        response = self.session.post(url, json=line_config)
        response.raise_for_status()
        return response.json()['id']

    def get_instance_stats(self, instance_id: str) -> Dict:
        """Get instance statistics"""
        response = self.session.get(f"{self.base_url}/instance/{instance_id}/stats")
        response.raise_for_status()
        return response.json()

    def get_all_areas(self, instance_id: str) -> List[Dict]:
        """Get all configured areas"""
        response = self.session.get(f"{self.base_url}/instance/{instance_id}/areas")
        response.raise_for_status()
        return response.json()['areas']

    def delete_instance(self, instance_id: str) -> None:
        """Delete instance"""
        response = self.session.delete(f"{self.base_url}/instance/{instance_id}")
        response.raise_for_status()

# Usage example
if __name__ == "__main__":
    client = SecuRTClient()

    # Create instance
    instance_config = {
        "name": "Retail Store Camera",
        "detectorMode": "SmartDetection",
        "sensitivity": "Medium",
        "sensorModality": "RGB",
        "metadataMode": True,
        "statisticsMode": True
    }

    instance_id = client.create_instance(instance_config)
    print(f"Created instance: {instance_id}")

    # Create areas
    intrusion_area = {
        "name": "Cash Register Area",
        "coordinates": [
            {"x": 0.4, "y": 0.3},
            {"x": 0.8, "y": 0.3},
            {"x": 0.8, "y": 0.7},
            {"x": 0.4, "y": 0.7}
        ],
        "classes": ["Person"],
        "color": "#FF0000",
        "durationThreshold": 3.0,
        "sensitivity": "High"
    }

    area_id = client.create_intrusion_area(instance_id, intrusion_area)
    print(f"Created intrusion area: {area_id}")

    # Create counting line
    counting_line = {
        "name": "Store Entrance",
        "coordinates": [
            {"x": 0.1, "y": 0.5},
            {"x": 0.9, "y": 0.5}
        ],
        "classes": ["Person"],
        "color": "#00FF00",
        "direction": "Both"
    }

    line_id = client.create_crossing_line(instance_id, counting_line)
    print(f"Created crossing line: {line_id}")

    # Monitor statistics
    stats = client.get_instance_stats(instance_id)
    print(f"Instance stats: {json.dumps(stats, indent=2)}")

    # List all configured areas
    areas = client.get_all_areas(instance_id)
    print(f"Configured areas: {len(areas)}")
    for area in areas:
        print(f"  - {area['name']} ({area['type']})")

VMS Integration Example

// JavaScript/Node.js VMS integration
const axios = require('axios');

class SecuRTVMSIntegration {
    constructor(baseUrl = 'http://localhost:3546/v1/securt') {
        this.baseUrl = baseUrl;
        this.client = axios.create({
            baseURL: baseUrl,
            timeout: 30000,
            headers: {
                'Content-Type': 'application/json'
            }
        });
    }

    async deploySecurityConfiguration(cameraId, config) {
        try {
            // 1. Create SecuRT instance for camera
            const instanceResponse = await this.client.post('/instance', {
                name: `Camera_${cameraId}`,
                detectorMode: config.detectorMode || 'SmartDetection',
                sensitivity: config.sensitivity || 'Medium',
                sensorModality: config.sensorType || 'RGB',
                metadataMode: true,
                statisticsMode: true
            });

            const instanceId = instanceResponse.data.id;
            console.log(`Created instance ${instanceId} for camera ${cameraId}`);

            // 2. Configure motion detection
            if (config.motionArea) {
                await this.client.post(`/instance/${instanceId}/motion_area`, {
                    coordinates: config.motionArea.coordinates
                });
            }

            // 3. Deploy security areas
            const areaIds = [];
            for (const areaConfig of config.securityAreas || []) {
                const response = await this.client.post(
                    `/instance/${instanceId}/area/${areaConfig.type}`,
                    areaConfig
                );
                areaIds.push(response.data.id);
                console.log(`Created ${areaConfig.type} area: ${response.data.id}`);
            }

            // 4. Deploy counting lines
            const lineIds = [];
            for (const lineConfig of config.countingLines || []) {
                const response = await this.client.post(
                    `/instance/${instanceId}/line/${lineConfig.type}`,
                    lineConfig
                );
                lineIds.push(response.data.id);
                console.log(`Created ${lineConfig.type} line: ${response.data.id}`);
            }

            // 5. Configure performance profile
            if (config.performanceProfile) {
                await this.client.post(`/instance/${instanceId}/performance_profile`, {
                    profile: config.performanceProfile
                });
            }

            return {
                instanceId,
                areaIds,
                lineIds,
                status: 'deployed'
            };

        } catch (error) {
            console.error(`Failed to deploy security configuration for camera ${cameraId}:`, error.message);
            throw error;
        }
    }

    async monitorInstance(instanceId) {
        try {
            const stats = await this.client.get(`/instance/${instanceId}/stats`);
            const areas = await this.client.get(`/instance/${instanceId}/areas`);
            const lines = await this.client.get(`/instance/${instanceId}/lines`);

            return {
                statistics: stats.data,
                areas: areas.data.areas,
                lines: lines.data.lines,
                timestamp: new Date().toISOString()
            };
        } catch (error) {
            console.error(`Failed to monitor instance ${instanceId}:`, error.message);
            throw error;
        }
    }

    async updateSecurityArea(instanceId, areaId, updates) {
        try {
            // Note: This would require a PATCH endpoint for area updates
            // Currently, the API supports DELETE and recreate pattern
            await this.client.delete(`/instance/${instanceId}/area/${areaId}`);

            // Recreate with updates
            const response = await this.client.post(
                `/instance/${instanceId}/area/${updates.type}`,
                updates
            );

            return response.data.id;
        } catch (error) {
            console.error(`Failed to update area ${areaId}:`, error.message);
            throw error;
        }
    }
}

// Usage in VMS integration
const vmsIntegration = new SecuRTVMSIntegration();

// Deploy configuration for multiple cameras
const cameras = [
    {
        id: 'CAM001',
        config: {
            detectorMode: 'SmartDetection',
            sensitivity: 'High',
            sensorType: 'RGB',
            motionArea: {
                coordinates: [
                    {x: 0.0, y: 0.0},
                    {x: 1.0, y: 0.0},
                    {x: 1.0, y: 1.0},
                    {x: 0.0, y: 1.0}
                ]
            },
            securityAreas: [
                {
                    type: 'intrusion',
                    name: 'Secure Area',
                    coordinates: [{x: 0.3, y: 0.3}, {x: 0.7, y: 0.3}, {x: 0.7, y: 0.7}, {x: 0.3, y: 0.7}],
                    classes: ['Person'],
                    color: '#FF0000',
                    durationThreshold: 2.0,
                    sensitivity: 'High'
                }
            ],
            countingLines: [
                {
                    type: 'crossing',
                    name: 'Main Door',
                    coordinates: [{x: 0.2, y: 0.5}, {x: 0.8, y: 0.5}],
                    classes: ['Person'],
                    color: '#00FF00',
                    direction: 'Both'
                }
            ],
            performanceProfile: 'Balanced'
        }
    }
];

// Deploy configurations
Promise.all(cameras.map(camera => 
    vmsIntegration.deploySecurityConfiguration(camera.id, camera.config)
)).then(results => {
    console.log('All camera configurations deployed successfully');

    // Start monitoring
    results.forEach(result => {
        setInterval(async () => {
            try {
                const monitor = await vmsIntegration.monitorInstance(result.instanceId);
                console.log(`Instance ${result.instanceId} stats:`, monitor.statistics);
            } catch (error) {
                console.error('Monitoring error:', error.message);
            }
        }, 30000); // Monitor every 30 seconds
    });
}).catch(error => {
    console.error('Deployment failed:', error.message);
});

Performance Optimization

HTTP Server Tuning

// Custom HTTP server configuration
class OptimizedSecuRTServer {
public:
    void configureServer() {
        // Thread pool optimization
        server_.set_thread_pool_count(std::thread::hardware_concurrency());

        // Connection management
        server_.set_keep_alive_max_count(100);
        server_.set_keep_alive_timeout_sec(30);

        // Request size limits
        server_.set_payload_max_length(10 * 1024 * 1024); // 10MB

        // Enable compression
        server_.set_compress_threshold(1024);

        // Timeout configuration
        server_.set_read_timeout(30, 0);   // 30 seconds
        server_.set_write_timeout(30, 0);  // 30 seconds
    }

    void enableRequestLogging() {
        server_.set_logger([](const httplib::Request& req, const httplib::Response& res) {
            PLOG_INFO << "[" << res.status << "] " << req.method << " " << req.path 
                      << " - " << res.body.length() << " bytes";
        });
    }

private:
    httplib::Server server_;
};

Caching and Performance

// Response caching for frequently accessed data
class ResponseCache {
public:
    void cacheResponse(const std::string& key, const std::string& response) {
        std::lock_guard<std::mutex> lock(cache_mutex_);

        CacheEntry entry;
        entry.response = response;
        entry.timestamp = std::chrono::steady_clock::now();

        cache_[key] = entry;

        // Cleanup old entries
        if (cache_.size() > max_cache_size_) {
            cleanupCache();
        }
    }

    std::optional<std::string> getResponse(const std::string& key) {
        std::lock_guard<std::mutex> lock(cache_mutex_);

        auto it = cache_.find(key);
        if (it != cache_.end()) {
            auto age = std::chrono::steady_clock::now() - it->second.timestamp;
            if (age < cache_ttl_) {
                return it->second.response;
            } else {
                cache_.erase(it);
            }
        }

        return std::nullopt;
    }

private:
    struct CacheEntry {
        std::string response;
        std::chrono::steady_clock::time_point timestamp;
    };

    std::unordered_map<std::string, CacheEntry> cache_;
    std::mutex cache_mutex_;
    size_t max_cache_size_ = 1000;
    std::chrono::minutes cache_ttl_{5};

    void cleanupCache() {
        auto now = std::chrono::steady_clock::now();
        auto it = cache_.begin();

        while (it != cache_.end()) {
            if (now - it->second.timestamp > cache_ttl_) {
                it = cache_.erase(it);
            } else {
                ++it;
            }
        }
    }
};

Troubleshooting

Common Issues

Connection Refused

# Check if SecuRTRest is running
curl -f http://localhost:3546/v1/securt/health 2>/dev/null && echo "Server is running" || echo "Server is not responding"

# Check port availability
netstat -an | grep :3546

Invalid Coordinates

// Ensure coordinates are normalized (0.0-1.0)
{
  "error": "Coordinates must be between 0.0 and 1.0",
  "solution": "Convert pixel coordinates to normalized coordinates by dividing by image dimensions"
}

// Example conversion
// pixelX = 640, imageWidth = 1920 -> normalizedX = 640/1920 = 0.333
// pixelY = 360, imageHeight = 1080 -> normalizedY = 360/1080 = 0.333

Instance Not Found

# List all instances to verify IDs
curl http://localhost:3546/v1/securt/instances

# Check instance status
curl http://localhost:3546/v1/securt/instance/{instanceId}/stats

Error Recovery

# Python error handling example
class SecuRTErrorHandler:
    def __init__(self, client):
        self.client = client
        self.max_retries = 3
        self.retry_delay = 1.0

    def robust_request(self, method, url, **kwargs):
        for attempt in range(self.max_retries):
            try:
                response = getattr(self.client, method)(url, **kwargs)
                response.raise_for_status()
                return response

            except requests.exceptions.ConnectionError:
                if attempt < self.max_retries - 1:
                    print(f"Connection failed, retrying in {self.retry_delay}s...")
                    time.sleep(self.retry_delay)
                    self.retry_delay *= 2  # Exponential backoff
                else:
                    raise

            except requests.exceptions.HTTPError as e:
                if e.response.status_code in [500, 502, 503, 504]:
                    # Server errors - retry
                    if attempt < self.max_retries - 1:
                        time.sleep(self.retry_delay)
                        continue
                else:
                    # Client errors - don't retry
                    raise

        raise Exception("Max retries exceeded")

Monitoring and Diagnostics

#!/bin/bash
# SecuRTRest health check script

BASE_URL="http://localhost:3546/v1/securt"

check_server_health() {
    echo "Checking server connectivity..."

    if curl -f -s "$BASE_URL/health" >/dev/null; then
        echo "✓ Server is responding"
    else
        echo "✗ Server is not responding"
        return 1
    fi
}

check_instance_health() {
    local instance_id=$1
    echo "Checking instance health: $instance_id"

    response=$(curl -s "$BASE_URL/instance/$instance_id/stats")

    if [ $? -eq 0 ]; then
        echo "✓ Instance is active"
        echo "Stats: $(echo $response | jq -r '.framesProcessed // "N/A"') frames processed"
    else
        echo "✗ Instance is not responding"
        return 1
    fi
}

monitor_performance() {
    local instance_id=$1

    while true; do
        stats=$(curl -s "$BASE_URL/instance/$instance_id/stats")

        if [ $? -eq 0 ]; then
            fps=$(echo $stats | jq -r '.averageFps // 0')
            cpu=$(echo $stats | jq -r '.cpuUsage // 0')
            memory=$(echo $stats | jq -r '.memoryUsage // "Unknown"')

            echo "$(date): FPS=$fps, CPU=${cpu}%, Memory=$memory"
        else
            echo "$(date): Failed to get statistics"
        fi

        sleep 10
    done
}

# Usage
check_server_health
if [ $? -eq 0 ]; then
    # Add your instance ID here
    INSTANCE_ID="instance_12345"
    check_instance_health $INSTANCE_ID

    # Uncomment to start monitoring
    # monitor_performance $INSTANCE_ID
fi

Best Practices

API Integration Guidelines

  1. Error Handling: Implement comprehensive error handling with retry logic for server errors
  2. Rate Limiting: Respect server resources by implementing appropriate request intervals
  3. Validation: Validate coordinate ranges (0.0-1.0) before sending requests
  4. Monitoring: Implement health checks and performance monitoring

Security Considerations

  1. Network Security: Use HTTPS in production environments
  2. Access Control: Implement authentication and authorization
  3. Input Validation: Always validate input data before sending to API
  4. Logging: Monitor and log API access for security auditing

Performance Optimization

  1. Connection Pooling: Use HTTP connection pooling for multiple requests
  2. Caching: Cache frequently accessed configuration data
  3. Batch Operations: Group related operations when possible
  4. Resource Management: Clean up unused instances and areas

Integration Patterns

  1. VMS Integration: Use standardized REST API for VMS system integration
  2. Event Handling: Implement proper event handling and callbacks
  3. Configuration Management: Centralize security configuration management
  4. Monitoring: Implement comprehensive monitoring and alerting

See Also