--- # Общие сведения # Протокол Opal специально разрабатывался с такой целью, чтобы быть максимально простым в использовании как человеку, так и машине. Не смотря на простоту, протокол обладает большой гибкостью и лаконичностью. Описание протокола можно разделить на две части. Такое разделение связано с архитектурой проекта. Тем не менее, формат сообщений универсален. ## Формат сообщения ## Все сообщения строятся по одному шаблону, очень похожему на протокол JSON. В основе выбранного стиля лежит набор пар ключ-значение, которое в большинстве языков программирования представляется в виде ассоциативного массива. В общем случае сообщение выглядит следующим образом - это набор пар ключ-значение, заключенный в фигурные скобки. ``` { тело сообщения } ``` Пример простейшего сообщения: ``` { request = info } ``` ## Ключевые слова ## Некоторые из ключей являются специальными словами, жестко установленными, для возможности адекватного общения меду сервером и клиентом. | **Слово** | Краткое описание | |:----------|:-----------------| | request | запрос какой-либо информации | | answer | ответ на запрос | | status | статус опрашиваемого процесса | | main | секция с описанием параметров модели | | algo | секция с описанием алгоритмов-методов модели | | header | секция с описанием заголовка таблицы результатов | | table | секция с описанием таблицы результатов | | comment | комментарий | Теперь более подробно о каждом из ключевых слов. ### request ### ### answer ### ## Типы данных ## # Соединение сервер - задача # ## Запрос информации сервером ## Перед запуском задачи для того, чтобы узнать какие параметры нужно передавать для корректного выполнения алгоритма, сервер запускает задачу с ключом -i или --info: `task (-i|--info)` Результатом работы будет набор строк, который описывает все доступные значения для данной задачи. Строки описываются в следующем формате: _name_ = _type_ (choice _list_) (default _value_) В ответе обязательно должна присутствовать секция Main, в которой описываются все параметры модели. Другие секции описывают параметры доступных алгоритмов в задаче и их количество не ограничено. ## Передача списка параметров ## ## Получение результата ## # Соединение сервер - ГИП # # Пример сессии # ``` // запрос сервера на получение информации о задаче { request = info } // ответ клиента-задачи { answer = ok meta = { detailed = true } main = { size = int default 100 x = float default 20.0 y = float default 0.0 time = period default 00:00 to 24:00 comment twenty-four hours } algo = { genetic = { method = string choice [std, last] default std poplulation = int default 1000 } bellman = { xpart = float partition 0 to 100 by 1 ypart = float partition 0 to 50 by 0.5 } } } // запрос сервера на вычисления по указанным параметрам { request = calculate main = { size = 100 x = 20.0 y = 5.0 time = 00:00 to 48:00 } algo = { genetic = { method = last population = 1200 } } } // ответ клиента задачи о том, что вычисления начались { answer = ok status = inprogress } // запрос сервера о статусе вычислений { request = status } // ответ клиента-задачи о том, что прошла уже половина вычислений { answer = ok status = inprogress percent = 0.50 comment = 10 минут, полет нормальный } // снова запрос сервера о статусе { request = status } // клиент сообщает, что вычисления завершены, и предоставляет таблицу результатов { answer = ok status = ready header = { time = datetime x = float y = float u = float comment management } table = { 00:00 20.0 5.0 0.0 01:00 18.0 6.0 1.0 02:00 16.0 7.0 2.0 //... } } ```