Blue Flower

  • Обмен данными по протоколу XPr происходит в текстовом виде (основная часть в JSON).
  • На аппаратном уровне обмен может происходить по самым разнообразным каналам. Преимущественно используются RS485/RS232 и TCP.
  • Каждый пакет может содержать не ограниченное количество данных, как в запросе, так и в ответе.
  • Сами данные находятся в формате JSON.
  • Данные состоят из сервисов, а в сервисах находятся параметры. Параметры могут быть записываемые (к примеру, состояние дискретного выхода) и не записываемые (к примеру, температура). После запроса, ведомое устройство укажет, какой сервис записываемый, а какой нет.

 

Формат основных данных

Сначала рассмотрим JSON параметр, так как именно он содержит данные. Допустим, устройство имеет один термодатчик, который имеет режим термостата и один дискретный вход, в таком случае, JSON параметр, отправленный в ответ на запрос, будет примерно таким:

{

  "thermometer": {

    "temperature": 15.1,

    "thermostat": {

      "v": false,

      "w": 1

    }

  },

  "input": {

    "state": true

  }

}

Зеленым выделены сервисы, синим - параметры, красным - значения.

Рассмотрим сервис "thermometer". Он имеет 2 параметра - температуру и состояние термостата, который мы можем включать и отключать. Значение температуры хранится в параметре "temperature" в числовом виде, а вот параметр "thermostat" вместо значения содержит ещё один объект, в нем параметр "v" содержит значение, а "w" (writable) указывает, что этот параметр записываемый и ведомое устройство может им управлять.

Сервис "input" содержит только один параметр "state", в котором указано состояние дискретного входа.

Допустим, ведущее устройство хочет включить термостат, тоесть, установить параметр "thermostat" в true, для этого, оно должно передать JSON объект такого вида:

{

  "thermometer": {

    "thermostat": true

  }

}

Тоесть, нужно задать новое значение для параметра "thermostat" сервиса "thermometer".

Итак, важно запомнить, что в ответе ведомого, если параметр не записываемый, то он содержит только свое значение (булевое, числовое, строка и т.д.), а если параметр записываемый, то он содержит объект с двумя параметрами:

1.       "v" - само значение.

2.       "w" - указывает, что параметр записываемый.

Соответственно, если параметр записываемый, то ведущий может его устанавливать, дляэтого, ему нужно указать сервис и параметр, которые надо установить, но внутри параметра уже будет только устанавливаемое значение, а не объект.

 

Транспортный уровень

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

 

UART (RS485/RS232, TTL)

В начале масива указывается физический адрес устройства (0-255), затем строка с данными (JSON объект) и в конце CRC16.

Данный формат использует как ведомое устройство, так и ведущее.

 

TCP

Важной особенностью является тот факт, что при TCP соединении, не происходит установка связи при каждом обмене данными, как, к примеру, в HTTP. В данном случае, соединение устанавливается и не разрывается, а обмен данными происходит уже в нужный момент. Таким образом, уменьшается объем передаваемых данных и увеличивается скорость обмена. Разумеется, что TCP соединение иногда разрывается, и его нужно при необходимости повторно устанавливать.

В самом начале запроса должен быть символ "@". Если для устройства нужен пароль, то добавляем пароль и после него "/" (если пароля нет, то данный символ не нужен). Затем сам JSON объект. Пример:

  • С паролем "123": @123/{}.
  • Без пароля: @{}.

В ответ ведомое должно отправить только JSON объект.

Но, есть ещё одна особенность. Зачастую, ведомое устройство имеет таймаут TCP около 3 секунд, и если в течении 3 сек от ведомого не придет запрос, соединение разрывается. Соответственно, если опрос делается каждые 5 сек, то соединение будет постоянно разрываться и его каждый раз нужно будет устанавливать.

Чтобы увеличить таймаут, при запросе нужно прямо в JSON объект добавить объект "__ss__", а в него параметр "timeout_tcp" со значением, равному новому таймауту в секундах. К примеру, чтобы установить таймаут 10 сек, нужно передать следующее: @123/{{"__ss__":{"timeout_tcp":10}}}.

Рекомендуется устанавливать таймаут минимум в 2 раза больше времени опроса. Но если период опроса будет довольно большим, к примеру, 30 минут, тогда таймаут можно не изменять и соединение будет устанавливаться каждые 30 мин.