Indusoft Web Studio. Отправка сообщений о тревогах и квитирование в Telegram, JSON-парсер, HTTP-запросы в IWS

В Indusoft Web Studio есть несколько различных типов «тонких клиентов», включая Mobile Access для удаленного доступа к SCADA с различных мобильных устройств с использованием технологии HTML5. Но потенциал IWS не ограничивается только встроенными «тонкими клиентами». При желании можно интегрировать в IWS и сторонние технологии удаленной связи, до которых еще не добрались производители SCADA, например клиенты обмена мгновенными сообщениями (мессенджеры) для мобильных платформ/смартфонов. Важной особенностью мессенджеров является оперативность доставки сообщений адресату, которому не нужно постоянно запрашивать обновляемую информацию (Web-страницы), получение новых входящих сообщений сопровождается развитой световой и звуковой сигнализацией на смартфонах и планшетах. Таким образом можно повысить мобильность сотрудников, обслуживающих SCADA и освободить их от рутинного сидения перед экраном монитора и вглядывания в неизменные экранные формы, не потеряв в оперативности реагирования на тревоги и аварии.

Как раз об одной такой системе обмена быстрыми сообщениями, а точнее об интеграции ее в Indusoft Web Studio и пойдет речь. Автором была выбрана система мгновенных сообщений Telegram (https://telegram.org/), как бесплатная, имеющая несколько клиентов для разных платформ, включая настольный Windows, и обладающая развитым и хорошо документированный API. Для интеграции в IWS был выбран тип подключения Telegram bot, который не требует специальной привязки к телефонному номеру и ориентирован на компьютерные системы. Т.е. bot — это автоматический обработчик удаленных обращений, наделенный полноценными функциями клиента мессенджера Telegram.

Обмен сообщениями в Telegram построен на запросах/ответах HTTP, методами POST и GET, и формате обмена JSON. Таким образом от Indusoft Web Studio потребовалась прежде всего поддержка HTTP POST и GET запросов для Web и затем парсинг JSON во внутреннее представление IWS. Эти требования успешно соблюдены, благодаря использования в IWS VBScript с поддержкой COM объектов. Так для HTTP использовался API объекта MSXML2.XMLHTTP:

Dim oHTTP : Set oHTTP = CreateObject("MSXML2.XMLHTTP")

А для парсинга JSON был использован сторонний класс VbsJson  (http://demon.tw, https://github.com/eklam/VbsJson):

Set json = New VbsJson

Set oj = json.Decode(oHTTP.responseText)

Кроме того для преобразование строк VBScipt в UTF-8 (кодировки обмена в Telegram) использовался объект Stream (ADO):

Dim stream : Set stream = CreateObject("ADODB.Stream")

В итоге был создан demo-проект JSONTelegramBotAlarm, с которым Вы можете ознакомиться.

В этом проекте bot  умеет отсылать сообщения о новых тревогах и авариях (alarms), зафиксированных SCADA, есть функция удаленного квитирования этих тревог на базе встраиваемых кнопок Telegram (inline_keyboard), написана машина состояний, обслуживающая HTTP запросы к API Telegram и парсинг JSON. Таким образом реализован двусторонний оперативный обмен сообщениями и командами в Telegram полностью в рамках Indusoft Web Studio, что дает представление о развитых возможностях Indusoft Web Studio.

Настройки проекта и комментарии к коду

Мы не будем подробно описывать процедуру создания Telegram bot. Этому посвящено огромное кол-во статей в Internet. Bot создается непосредственно в клиенте Telegram, и на выходе несложной процедуры будет получен Token (ключ), который необходимо прописать в проекте в стартовом скрипте:

Dim Token : Token = "NNNNNNNN:AAB_aa"

Кроме того потребуется еще chat id — персональный код подписанного на bot клиента. Его можно получить из запроса в браузере:

https://api.telegram.org/bot<NNNNNNNN:AAB_aa>/getUpdates?

где  <NNNNNNNN:AAB_aa> — Token

Предварительно нужно послать боту хотя бы одно сообщение, чтобы ответ в формате JSON включал chat id. Пример ответа, из которого можно извлечь chat id (подчеркнут красным):

{"ok":true,"result":[{"update_id":137543156, "message":{"message_id":5,"from":{"id":3322332233,"is_bot":false,"first_name":"Alex","last_name":"B","language_code":"ru-RU"},"chat":{"id":3322332233,"first_name":"Alex","last_name":"B","type":"private"},"date":1504602120,"text":"1"}}]}

Соответственно в стартовом скрипте проекта добавляем:

Dim chat_id : chat_id = "3322332233"

Код машины состояний бота можно найти в скрипте TelegramPolling, необходимые функции и классы объявлены в стартовом скрипте.

Для удобства была написана функция Function POST(ByRef URL, ByRef Data), которая выполняет POST запрос с передачей параметров к API Telegram в формате application/x-www-form-urlencoded.

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

Функция класса VbsJson Decode() «распарсивает» JSON-строку в объекты словарей (вложенные словари и массивы) VBScript. Чтобы добраться до полей JSON структуры в таком представлении, используется следующий синтаксис:  oj("имя параметра JSON" или индекс массива)( "имя вложенного параметра JSON" или вложенный индекс массива), например:

oj("result")(0)("message")("text"))

Команда для приведенного выше выражения JSON вернет: "1"

oj("result")(0)("update_id")

Команда для приведенного выше выражения JSON вернет: "137543156"

Более подробно узнать о технологии можно, обратившись в компанию ЗАО «Первая миля», официальный дистрибьютор InduSoft Web Studio в РФ.