Разработка

Конфиг устройства

Обобщенный вид конфига

{
  	"network": NETWORK,
	"identification": IDENTIFICATION,
	"ntp": NTP,
	"sensors": SENSORS,
	"data_push": DATA_PUSH,
	"meta_info": META
}

 


NETWORK

Настройки сети на устройстве

{
	"ip": "IP",
	"gateway": "GATEWAY",
	"mask": "MASK",
	"dns": "DNS",
	"dns2": "DNS_2"
}

IDENTIFICATION

Параметры идентификации устройства

{
	"name": "NAME",
	"device_group": "DEVICE_GROUP",
	"model": "MODEL",
	"firmware": "FIRMWARE",
	"serial": "SERIAL",
	"mac": "MAC",
	"serial_as_name": SERIAL_AS_NAME
}

NTP

Настройки синхронизации времени

{
	"host": "HOST",
	"set_gateway_as_ntp": GATEWAY_AS_NTP,
	"timezone": TIMEZONE,
	"sync_protocol": "SYNC_PROTOCOL",
	"sync_period": "SYNC_PERIOD"
}

SENSORS

Настройки линий детектирования сенсора

[
	...,
    
    {
    	"id": "SENSOR_ID",
  		"height_filter_max": HEIGHT_FILTER_MAX,
  		"height_filter_min": HEIGHT_FILTER_MIN,
  		"human": HUMAN
    },
    
    ...,
]

DATA_PUSH

Настройки выгрузок данных с устройства

[
  	...,

    {
        "type": "TYPE",
        "host": "HOST",
        "intervals": INTERVALS,
        "options": OPTIONS,
        "auth": AUTH,
        "path": PATH
    },
  
	...,
]
TYPE

Тип выгрузки

HOST

URL для выгрузки данных в формате SCHEME://HOST[:PORT][/PATH]. . Можно изменять в конфигурационном файле

В выгрузках с TYPE==passive_count валидация поля не происходит.

INTERVALS

Интервалы сбора/выгрузки данных

{
	"push": INTERVALS_PUSH,
  	"aggregation": INTERVALS_AGGREGATION
}

 

OPTIONS

Раздел с опциями отдельных устройств

{
	"format": "FORMAT",
	"upload_record": "UPLOAD_RECORD",
  	"device_localtime": "DEVICE_LOCALTIME",
  	"report_lite_mode": "REPORT_LITE_MODE"
}
AUTH

Параметры для авторизации на сервере выгрузок. Пока только для FTP выгрузок

{
	"user": "USER",
	"password": "PASSWD"
}
PATH

Параметры сохранения на FTP сервере

{
	"location": "LOCATION",
	"filename": "FILENAME"
}

META

Раздел с мета-информацией устройства при команде запросе конфига. При команде установки конфига игнорируется

{
	"timezone_name": "TIMEZONE",
    "time_offset": TIME_OFFSET,
    "time_sync_enabled": TIME_SYNC_ENABLED,
    "log_enabled": LOG_ENABLED,
    "multisensor": MULTISENSOR,
  	"slave_sensors": [
      	...,
		{
      		"ip": "SLAVE_SENSOR_IP"
      	},
		...
    ],
    "device_heigth": DEVICE_HEIHTH
}

Команды от сервиса/1с

Процесс обработки команд

Механизм получения команд и отчета о выполнении команд

Шедулер агента по cron расписанию из параметра CFG_AGENT_CHECK_CRON запускает задачу запроса к сервису/1c для получения новых задач и отчета о выполнении более старых задач.

Есть возможность запуска задачи запроса к сервису/1c вне расписания. Для этого нужно сделать POST запрос (далее запрос-триггер) к агенту по адресу AGENT_HOST:CFG_API_PORT/agent/commands_check

При получении запроса-триггера агент проверит дату последнего запроса к сервису. Если с момента прошлого запроса прошло более CFG_AGENT_CHECK_UNCHEDULED_DELAY секунд, то запрос к сервису выполнится сразу. Иначе запрос к сервису будет выполнен, когда после последнего запроса к сервису пройдет CFG_AGENT_CHECK_UNCHEDULED_DELAY секунд.

Запрос к сервису/1с

Агент получает команды от сервиса/1с и отчитывается о выполнении команд путем POST запроса по адресу CFG_COLLECTOR_SERVICE_BASE/agent/check (CFG_COLLECTOR_SERVICE_BASE берется из конфига агента)

В данных запроса в поле executed_commands передаются результаты выполнения команд агентом.

В ответе на запрос агент получает список актуальных команд, которые он должен выполнить и отчитаться.

Данные запроса

{
	"health": {
		"last_report_at": LAST_REPORT_AT,
		"status": "STATUS",
		"activity": "ACTIVITY",
		"up_time": UPTIME
	},
	"executed_commands": [
    	...,
      	{
      		"command_id": "COMMAND_ID",
      		"device_id": [..., "DEVICE_ID", ...],
  			"command": "COMMAND",
    		"result": RESULT
      	},
		...
    ]
}

Ожидаемый ответ

{
    "commands":[
      	...,
      	{
            "command_id": "COMMAND_ID",
            "device_id": [..., "DEVICE_ID", ...],
            "command": "COMMAND",
            "params": PARAMS
        },
		...
    ]
}

Механизм выполнения команды

После получения списка команд агент добавляет их в очередь команд и начинает их выполнение.

Команды выполняются асинхронно. Для каждого устройства внутри команды выполнение также асинхронно.

После завершения выполнения команды агент делает внеочередной запрос agent/check для отчета о выполнении команды.

 

Список команд

screenshot

получение скриншота с устройства.

params
{
    "host": "FTP_HOST",
    "user": "FTP_USERNAME",
    "password": "FTP_PASSWORD",
    "path": "FTP_PATH",
    "multisensor": "MULTISENSOR_FLAG"
}
success payload
{
	"screenshot_path": "REMOTE_PATH"
}

upload_data

выгрузка исторических данных с датчика

params
{
	"from": "FROM",
  	"to": "TO"
}
success payload
{}

reboot

перезагрузка устройства

params
{}
success payload
{}

get_config

Запрос конфига устройства

params
{}
success payload
DEVICE_CONFIG

set_config

Запрос конфига устройства

params
{
	"DEVICE_ID": DEVICE_CONFIG
}
success payload
DEVICE_CONFIG

reset_auth

установка логина и пароля для авторизации на устройстве

params
{
	"user": "USERNAME",
  	"pass": "PASSWORD"
}
success payload
{
	"new_user": "USERNAME",
  	"new_pass": "PASSWORD"
}

executor_flash

обновление прошивки на устройстве

params
{
	"file_name": FILENAME,
  	"image": IMAGE,
  	"timeout": TIMEOUT
}
success payload
{
	"firmware": "FIRMWARE"
}

video_record

установка расписания записи видео. работает 

params
{
	"from": "FROM",
  	"to": "TO",
  	"sd_card_format": "FORMAT_FLAG",
  	"quality": "QUALITY"
}
success payload
{}

Работа с API сервиса/1с

GET agent/device?{page}=1&{per_page}=20

Получает актуальный список устройств

{
  	"new_devices": NEW_DEVICES,
    "devices":[
     	...
      
    	{
            "id": DEVICE_ID,
            "is_new": DEVICE_IS_NEW,
            "serial": DEVICE_SERIAL,
            "mac"   : DEVICE_MAC,
            "host"  : DEVICE_HOST,
            "adapter_id" : DEVICE_ADAPTER,          
            "login": DEVICE_LOGIN, 
            "password": DEVICE_PASSWORD,
            "timezone": DEVICE_TIMEZONE,
            "sensors": [
                ...
                {
                    "sensor_id": SENSOR_ID,
                    "line_id": SENSOR_LINE_ID
                },
                ...
            ]  
     	},
              
       	...
	],
    "pagination":{
        "page": 1,
        "per_page": 20,
        "pages": 2,
        "total": 40
    }
}

При получении списка устройств агент проводит сверку полученного списка (блок devices) со своей локальной базой:

POST agent/device

регистрация нового устройства в сервисе

тело запроса - строка json:

{
    "id": DEVICE_ID,
    "is_new": DEVICE_IS_NEW,
    "serial": SERIAL,
    "mac": MAC,
    "adapter_id": ADAPTER_ID,
    "sensors": [
    	...
      	{
        	"sensor_id": SENSOR_ID,
          	"line_id": SENSOR_LINE_ID
        },
      	...
    ],
    "host": HOST,
    "login": LOGIN,
    "password": PASSWORD,
    "time_zone": TIMEZONE
}

POST agent/check

Запрос

отчет о состоянии агента, отчет о выполненных командах

Тело запроса - строка json:

{
  	'health': {
    	"last_report_at": 0.0,
    	"status": STATUS,
    	"activity": "working",
    	"up_time": UPTIME
	},
	'executed_commands': EXECUTED_COMMANDS
}

EXECUTED_COMMANDS:

{
    "command_id": COMMAND_ID
    "device_id": DEVICES
    "command": COMMAND
    "result": COMMAND_RESULT
}

COMMAND_RESULT:

{
	"error_flag": ERROR_FLAG,
  	"message": MESSAGE,
  	"payload": [
    	...
      	{
        	"error_flag": PAYLOAD_ERROR_FLAG,
          	"message": PAYLOAD_MESSAGE,
          	"payload": PAYLOAD_PAYLOAD,
          	"device_id": PAYLOAD_DEVICE_ID
        }
      
      	...
    ]
}
Ответ
{
	...
  	"payload": {
    	"commands": [
        	...
          	{
            	"command_id": COMMAND_ID,
              	"device_id": DEVICES,
              	"command": COMMAND,
              	"params": COMMAND_PARAMS
            }
          	...
        ]
    }
  	...
}

описание команд и их параметров

 

 

Локальная база агента

Поддержка пассивной выгрузки метрик

Датчик Поддержка пассивной выгрузки
3db
3dd
3dh
3dm
3dt
3dv
3dx
cm* ✔[1]
  1. Только пассивная выгрузка

Опциональное подключение и настройка PostgreSQL

Для корректной работы Postgres необходимо заполнить поля в .env:

CFG_POSTGRES_MODE=1 # При 0 - деактивируем мод
CFG_POSTGRES_DB=postgres
CFG_POSTGRES_USER=postgres
CFG_POSTGRES_PASSWORD=postgres
CFG_POSTGRES_PORT=5432
CFG_POSTGRES_HOST=localhost

Также был заложен функционал настройки одновременного количества подключений в файле database.py
Screenshot from 2024-08-07 18-42-45.png

Настройка режима делегата

Делегат настраивается с двух сторон: в нашем контуре и в контуре клиента. Связываются агенты между собой по websocket и команды нужно направлять на агент который в нашем контуре

Конфигурация .env файла:

В нашем контуре:

CFG_PRODTESTING_DELEGATE_MODE - Активация принимающего вебсокет эндпоинта

В контуре клиента: