GodEye Backend API Documentation
Обзор
Backend сервер системы сигнального центра "GodEye" предоставляет WebSocket и REST API для управления соединениями между Android устройствами и операторами desktop приложений.
Архитектура
Основные компоненты
- WebSocket Server - для real-time коммуникации
- REST API - для операций CRUD и администрирования
- SessionManager - управление сессиями подключения к камерам
- DeviceManager - управление Android устройствами и операторами
Потоки данных
Android Device <--WebSocket--> Backend <--WebSocket--> Desktop Operator
<--WebRTC Signaling--> <--REST API--> Admin Panel
WebSocket API
Регистрация Android клиента
socket.emit('register:android', {
deviceId: "unique_device_id",
deviceInfo: {
model: "Samsung Galaxy S21",
manufacturer: "Samsung",
androidVersion: "12",
availableCameras: "back,front,ultra_wide,telephoto"
}
});
// Response
socket.on('register:success', (data) => {
console.log(data.deviceId); // подтверждение регистрации
});
Регистрация оператора
socket.emit('register:operator', {
operatorId: "operator_123", // опционально
operatorInfo: {
name: "Иван Иванов",
permissions: ["view_cameras", "request_camera"]
}
});
// Response
socket.on('register:success', (data) => {
console.log(data.operatorId);
console.log(data.availableDevices); // список доступных устройств
});
Запрос доступа к камере
// Оператор запрашивает камеру
socket.emit('camera:request', {
deviceId: "device_123",
cameraType: "back" // back, front, ultra_wide, telephoto
});
// Android получает запрос
socket.on('camera:request', (data) => {
console.log(data.sessionId);
console.log(data.operatorId);
console.log(data.cameraType);
});
// Android отвечает на запрос
socket.emit('camera:response', {
sessionId: "session_123",
accepted: true,
streamUrl: "webrtc", // или RTSP URL
error: null
});
WebRTC сигнализация
// Отправка offer/answer/ice-candidate
socket.emit('webrtc:offer', {
sessionId: "session_123",
offer: "SDP_offer_string"
});
socket.emit('webrtc:answer', {
sessionId: "session_123",
answer: "SDP_answer_string"
});
socket.emit('webrtc:ice-candidate', {
sessionId: "session_123",
candidate: "ICE_candidate_string"
});
Управление камерой
// Переключение камеры
socket.emit('camera:switch', {
sessionId: "session_123",
cameraType: "front"
});
// Завершение сессии
socket.emit('camera:disconnect', {
sessionId: "session_123"
});
REST API
Базовый URL
http://localhost:3000/api
Аутентификация
Для всех операторских запросов требуется заголовок:
X-Operator-Id: your_operator_id
Endpoints для операторов
GET /api/operators/devices
Получение списка доступных устройств
{
"success": true,
"devices": [
{
"deviceId": "device_123",
"deviceInfo": {
"model": "Samsung Galaxy S21",
"manufacturer": "Samsung"
},
"status": "connected",
"isConnected": true,
"capabilities": {
"cameras": ["back", "front", "ultra_wide"],
"hasMultipleCameras": true
},
"canAcceptSession": true
}
],
"total": 1
}
POST /api/operators/camera/request
Создание запроса на доступ к камере
{
"deviceId": "device_123",
"cameraType": "back"
}
Response:
{
"success": true,
"sessionId": "session_456",
"message": "Camera request sent to device"
}
POST /api/operators/camera/{sessionId}/switch
Переключение камеры в активной сессии
{
"cameraType": "front"
}
DELETE /api/operators/camera/{sessionId}
Завершение сессии камеры
GET /api/operators/sessions
Получение активных сессий оператора
GET /api/operators/profile
Получение профиля текущего оператора
Admin API
GET /api/admin/stats
Общая статистика системы
{
"success": true,
"stats": {
"timestamp": "2025-09-28T10:30:00.000Z",
"uptime": 3600,
"devices": {
"totalDevices": 10,
"connectedDevices": 8
},
"sessions": {
"totalSessions": 25,
"activeSessions": 3
}
}
}
GET /api/admin/devices
Список всех устройств (с пагинацией)
GET /api/admin/sessions
Список всех сессий (с фильтрацией и пагинацией)
POST /api/admin/sessions/{sessionId}/terminate
Принудительное завершение сессии
POST /api/admin/devices/{deviceId}/disconnect
Принудительное отключение устройства
GET /api/admin/health
Проверка состояния системы
Коды состояний
Статусы устройств
connected- устройство подключено и готовоbusy- устройство занято активной сессиейdisconnected- устройство отключено
Статусы сессий
pending- сессия создана, ожидает ответа от устройстваactive- сессия активна, идет трансляцияclosed- сессия завершенаdenied- запрос отклонен устройствомerror- ошибка в сессии
WebRTC состояния
offer_sent- offer отправленanswer_sent- answer отправленconnected- WebRTC соединение установленоdisconnected- WebRTC соединение разорвано
Обработка ошибок
HTTP ошибки
400- Некорректные параметры запроса401- Не авторизован (отсутствует Operator ID)403- Нет прав доступа404- Ресурс не найден409- Конфликт (устройство занято и т.д.)500- Внутренняя ошибка сервера
WebSocket ошибки
socket.on('camera:error', (data) => {
console.error(data.error);
});
Примеры использования
Полный цикл подключения к камере
- Регистрация оператора
socket.emit('register:operator', { operatorId: 'op1' });
- Получение списка устройств
const response = await fetch('/api/operators/devices', {
headers: { 'X-Operator-Id': 'op1' }
});
const { devices } = await response.json();
- Запрос камеры
const response = await fetch('/api/operators/camera/request', {
method: 'POST',
headers: {
'X-Operator-Id': 'op1',
'Content-Type': 'application/json'
},
body: JSON.stringify({
deviceId: devices[0].deviceId,
cameraType: 'back'
})
});
const { sessionId } = await response.json();
- WebRTC сигнализация
socket.on('webrtc:offer', async (data) => {
const answer = await createWebRTCAnswer(data.offer);
socket.emit('webrtc:answer', {
sessionId: data.sessionId,
answer
});
});
- Завершение сессии
await fetch(`/api/operators/camera/${sessionId}`, {
method: 'DELETE',
headers: { 'X-Operator-Id': 'op1' }
});
Развертывание
Переменные окружения
PORT=3000
NODE_ENV=production
LOG_LEVEL=info
Запуск
npm install
npm start
Docker
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Мониторинг
Логи
Логи сохраняются в файл god-eye.log и выводятся в консоль.
Метрики
/api/status- базовая статистика/api/admin/health- детальная проверка здоровья/api/admin/stats- полная статистика системы
Автоматическая очистка
- Старые сессии (>60 мин) очищаются каждые 5 минут
- Отключенные устройства удаляются через 5 минут после отключения