Обработка входящего потока данных

В разделе объясняется, как Flexible драйвер обрабатывает поток входящих данных.

Драйвер постоянно получает байты данных через TCP соединение, последовательный порт или через UDP-датаграммы. Все эти байты добавляются в конец так называемого Буфера входящих данных.

Просмотреть текущее содержимое буфера можно в свойстве Статистика буфера входящих данных, доступном через действие Показать статус в контексте Flexible драйвера.

Каждый раз при получении и добавлении нового байта/байтов данных в буфер, драйвер вычисляет Выражение разделитель входного потока. Это выражение должно определить, содержит ли входящий буфер полностью определенный протокольный блок. Если это так, выражение должно вернуть длину протокольного блока (т.е. количество байтов в нем). В противном случае, если цельный блок получен не полностью, выражение должно вернуть 0 (нуль).

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

  • Первые байты входного буфера, которые содержат длину текущего протокольного блока. В этом случае, выражение проверяет байты определенной "длины команды" и возвращает их значение, если в буфере содержится такое же, либо большее количество данных.
  • Некоторые символы разделителей команд или, если точнее, первый случай их употребления в буфере входящих данных. Если такие символы обнаружены, выражение возвращает их индекс в буфере, поскольку он соответствует длине команды.

Когда Выражение разделитель входного потока возвращает ненулевое значение (например, N), драйвер удаляет первые N байтов из входного буфера и отправляет их на дальнейшую обработку. На этом этапе байты преобразуются в строку с использованием UTF-8 кода, и в дальнейшем именуются Командой.

После того как Команда полностью определена, драйвер вычисляет Выражение раскодирования. Это выражение должно преобразовать (раскодировать) Команду и вернуть преобразованные данные Команды в виде строки.

Если Команду невозможно успешно раскодировать (например, если данные команды несогласованные), Выражение раскодирования вернет NULL.

Обычно Выражение раскодирования делает следующее:

  • Обрезка данных команды путем удаления несодержательных префиксов и суффиксов команды
  • Проверка достоверности данных команды, например, вычисление и проверка CRC через вызов внешнего скрипта

Выражение раскодирования и все остальные выражения в группах Обмен командами и Операции с данными имеют доступ к данным Команды через переменную среды command изнутри выражения. Используйте ссылку {env/command}, чтобы получить строковое представление байтов Команды.

После раскодирования Команды драйверу нужно решить, является ли данная Команда:

  • синхронным ответом на одну из ранее отправленных команд,
  • либо асинхронным сообщением, представляющим событие устройства или асинхронное обновление значения какой-либо переменной устройства.

Чтобы это определить, драйвер вычисляет Выражение детектор асинхронных команд. Данное выражение должно проанализировать данные Команды и вернуть:

  • TRUE, если Команда - это асинхронное событие или обновление переменной. Дальнейшая обработка идет по алгоритму, описанному в разделе Обработка асинхронных команд.
  • FALSE в иных случаях, т.е. если Команда - это ответ на одну из ранее отправленных сервером команд. Дальнейшая обработка идет по алгоритму, описанному в разделе Обработка синхронных ответов.