Обработка входящего потока данных
В разделе объясняется, как Flexible драйвер обрабатывает поток входящих данных.
Драйвер постоянно получает байты данных через TCP соединение, последовательный порт или через UDP-датаграммы. Все эти байты добавляются в конец так называемого Буфера входящих данных.
Просмотреть текущее содержимое буфера можно в свойстве Статистика буфера входящих данных, доступном через действие Показать статус в контексте Flexible драйвера.
Каждый раз при получении и добавлении нового байта/байтов данных в буфер, драйвер вычисляет Выражение разделитель входного потока. Это выражение должно определить, содержит ли входящий буфер полностью определенный протокольный блок. Если это так, выражение должно вернуть длину протокольного блока (т.е. количество байтов в нем). В противном случае, если цельный блок получен не полностью, выражение должно вернуть 0 (нуль).
Выражение разделитель входного потока часто анализирует:
|
Когда Выражение разделитель входного потока возвращает ненулевое значение (например, N), драйвер удаляет первые N байтов из входного буфера и отправляет их на дальнейшую обработку. На этом этапе байты преобразуются в строку с использованием UTF-8 кода, и в дальнейшем именуются Командой.
После того как Команда полностью определена, драйвер вычисляет Выражение раскодирования. Это выражение должно преобразовать (раскодировать) Команду и вернуть преобразованные данные Команды в виде строки.
Если Команду невозможно успешно раскодировать (например, если данные команды несогласованные), Выражение раскодирования вернет NULL.
Обычно Выражение раскодирования делает следующее:
|
Выражение раскодирования и все остальные выражения в группах Обмен командами и Операции с данными имеют доступ к данным Команды через переменную среды command
изнутри выражения. Используйте ссылку {env/command}
, чтобы получить строковое представление байтов Команды.
После раскодирования Команды драйверу нужно решить, является ли данная Команда:
- синхронным ответом на одну из ранее отправленных команд,
- либо асинхронным сообщением, представляющим событие устройства или асинхронное обновление значения какой-либо переменной устройства.
Чтобы это определить, драйвер вычисляет Выражение детектор асинхронных команд. Данное выражение должно проанализировать данные Команды и вернуть:
- TRUE, если Команда - это асинхронное событие или обновление переменной. Дальнейшая обработка идет по алгоритму, описанному в разделе Обработка асинхронных команд.
- FALSE в иных случаях, т.е. если Команда - это ответ на одну из ранее отправленных сервером команд. Дальнейшая обработка идет по алгоритму, описанному в разделе Обработка синхронных ответов.