# Команды сервера Numass #

### Адрес сервера ###

Адрес сервера в локальной сети по-умолчанию `192.168.111.1`, адрес сервера в сети института `172.20.75.178`

### Хранение данных ###

Хранение данных осуществляется в файловом репозитории `/home/trdat/numass-repo`. Считается, что все фалы репозитория с названиями, начинающимися с `@` являются системными.

### Формат сообщения ###

Сообщение содержит иерархически организованный текст в формате JSON (meta), а также может опционально содержать данные в бинарном формате (data).

## Команды  ##

Сообщение содержит два поля, определяющих его содержание: поле типа сообщения `type` и поле типа действия `action`.
Поддерживаются следующие типы команд:

 - `numass.storage` - Загрузка и получение данных из репозитория
 - `numass.state` -  Получение или изменение состояния текущего сеанса (напряжение, токи, и т. д.)
 - `numass.event` - Отправка сообщения по текущему сеансу
 - `numass.control` - Отправка управляющей команды для оборудования
 - `numass.run` - получение или изменение параметров текущего сеанса

#### numass.storage ####
Обращение к репозиторию текущего сеанса.

#### numass.state ####
Считывание или изменение состояния для текущего сеанса. Доступны следующие действия:

 - `get` - считать состояние (или состояния) - *Not tested*
	 *Запрос:*
	```
	{
		"type": "numass.state",
		"action": "get",
		"name": [
			"<state 1 name>", 
			"<state 2 name>",
			...
		]
	}
	```
		 
	*Ответ*:
	```
	{
		"type": "numass.state.get.response",
		"state": [
			{
				"name": "<state 2 name>",
				"value": <state 1 value>
			},
			{
				"name": "<state 2 name>",
				"value": <state 2 value>
			},
			...
		]
	}
	```
	В запросе вместо массива может стоять простая строка `state: "<>"`. В этом случае в ответе вместо массива будет один JSON объект.
	 
 - `set` - установить состояние (или состояния) - *Not tested*
 *Запрос:*
	```
	{
		"type": "numass.state",
		"action": "set",
		"state": [
			{
				"name": "<state 2 name>",
				"value": <state 1 value>
			},
			{
				"name": "<state 2 name>",
				"value": <state 2 value>
			},
			...
		]
	}
	```
	
	или
	
	```
	{
		"type": "numass.state",
		"action": "set",
		"name": "<state name>",
		"value": <state value>
	}
	```
	
		 
	*Ответ*:
	```
	{
		type: "numass.state.get.response",
		state: [
			{
				"name": "<state 2 name>",
				"value": <state 1 value>
			},
			{
				"name": "<state 2 name>",
				"value": <state 2 value>
			},
			...
		]
	}
	```
	Если запрашивалось изменение единичного состояния, то возвращается единичный JSON объект.

#### numass.event ####
*Not implemented*
#### numass.control ####
*Not implemented*
#### numass.run ####
Считываие или изменение текущего сеанса. Доступны следующие действия:

 - `get` - Считать конфигурацию текущего сеанса
	 *Запрос:*

	```
	{
		"type": "numass.run",
		"action": "get",
	}
	```

	 *Ответ:*

	```
	{
		"type": "numass.run.response",
		"run": {
			"path": "<path to run repo>",
			"meta": {
				<run metadata>
			}
		}
	}
	```


 - `start` - Начать новый сеанс и обозначить его как текущий

	 *Запрос:*

	```
	{
		"type": "numass.run",
		"action": "start",
		"path: "<path to run repo>",
		"meta": {
			<run metadata, optional>
		}
	}
	```

	 *Ответ:*
	То же, что и в `get`.

 - `reset` - Сбросить настройки текущего сеанса
 Эквивалентно `get` с пустым путем или `default` в качестве пути. Дополнительных аргументов нет

## Протокол dataforge-envelope  ##

Для обмена сообщениями может использоваться протокол dataforge-envelope (типа message). В этой вариации протокола запрещено автоматическое определение длинны метаданных и данных, в качестве метаданных используется JSON  в кодировке UTF-8.

Используются следующие атрибуты конверта:

    version = 1;
    type = 33;
    metaType = 1;
    metaEncoding = 0;
    
 Пакет с  `dataType = 0xffffffff` считается терминирующим пакетом, закрывающим соединение.

Порт сервера для работы по этому протоколу по умолчанию `8335`.

## Протокол Http  ##

Пока не реализован.

> Written with [StackEdit](https://stackedit.io/).