Модуль | Ім'я | Версія | Ліцензія | Джерело | Мови | Платформи | Тип | Автор | Опис |
---|---|---|---|---|---|---|---|---|---|
HTTP | HTTP-реалізація | 3.9 | GPL2 | prot_HTTP.so | en,uk,ru,de | x86,x86_64,ARM | Протокол | Роман Савоченко | Надає підтримку HTTP для WWW базованих користувацьких інтерфейсів.
|
Модуль транспортного протоколу HTTP призначено для реалізації підтримки мережевого протоколу HTTP(Hypertext Transfer Protocol) у OpenSCADA.
Протокол HTTP використовується для передачі вмісту WWW. До прикладу, через HTTP передаються наступні типи документів: html, xhtml, png, javascript і багато інших. Підтримка HTTP у OpenSCADA разом із транспортом Sockets і SSL, дозволяє реалізовувати різні користувацькі функції на WWW інтерфейсі. Модуль первинно реалізує два основних методи HTTP протоколу GET, POST, і наразі будь який метод HTTP. Модуль забезпечує контроль цілісності HTTP-запитів та, спільно з транспортом Сокети і SSL, дозволяє "збирати" цілісні запити з їх фрагментів, а також забезпечувати утримання з'єднання "живим" (Keep-Alive).
Для гнучкого підключення користувацьких інтерфейсів до даного модуля, використовується модульний механізм у межах самого цього модуля. У ролі модулів використовуються модулі підсистеми "Користувацькі інтерфейси" з додатковим інформаційним полем "SubType", зі значенням "WWW".
У запитах до Web ресурсів прийнято використовувати URL(Universal Resource Locator). Відтак, URL передається як основний параметр через HTTP. Перший елемент URL запиту використовується для ідентифікації модуля UI. Наприклад, URL "http://localhost:10002/WebCfg" означає звернення до модуля "WebCfg" на хості "http://localhost:10002". У випадку помилкового визначення ідентифікатору модуля, або при звернені взагалі без ідентифікатору, модуль генерує інформаційний діалог про вхід та вибір одного з доступних користувацьких інтерфейсів. Приклад діалогу наведено на рисунку 1.
Модулем підтримується багатомовність, яка вмикається динамічним перекладом повідомлень OpenSCADA.
Мова кінцевого користувацького інтерфейсу визначається шляхом та у послідовності:
Отримана таким чином мова використовується для побудови інтерфейсів цього модуля і передається WWW під-модулям у HTTP властивості "oscd_lang", через аргумент "vars" функції узагальнення, "GET" і "POST".
Для конфігурації і керування цим модулем надається конфігураційна сторінка інтерфейсу керування OpenSCADA (Рис.3), де можете здійснювати:
Модулем підтримується аутентифікація у OpenSCADA при надані доступу до модулів WEB-інтерфейсів (рис.2).
Аутентифікація цим модулем здійснюється "печеньками" (cookies) із динамічною назвою і простором ІД користувача, де назва "печеньки" (cookie) "oscd_UID" і використовується простір ІД користувача у роботі із спільною таблицею сеансів автентифікації, та назва "oscd_UID_{PrjNm}" у роботі без неї.
Для полегшення роботи з Web-інтерфейсами, модуль передбачає можливість автоматичного входу від ім'я вказаного користувача. Конфігурація автоматичного входу здійснюється на сторінці налаштування модуля (рис.3). Автоматичний вхід здійснюється за збігом адреси, вказаної у стовпчику "Адреса", і від ім'я користувача, вказаного у стовпчику "Користувач".
Для більшої безпеки, можете визначити тільки Web-користувачів у переліку користувачів дозволених до аутентифікації.
Модулі користувацького інтерфейсу (UI), які призначені для спільної роботи із модулем HTTP, мають встановлювати інформаційне поле "SubType" значенням "WWW" та поле "Auth" значенням "1", якщо модуль потребує автентифікації при вході. Для зв'язування модуля HTTP і модулів UI використовується розширений механізм комунікації. Цей механізм передбачає експорт інтерфейсних функцій. У даному випадку, UI модулі мають експортувати лише одну загальну функцію для усіх методів:
Або наступні різні функції окремо для GET і POST методів:
Надалі, у випадку надходження HTTP запиту "GET" буде викликатися функція "HTTP_GET" або "HttpGet", а у випадку запиту "POST" буде викликатися функція "HTTP_POST" або "HttpPost", у відповідному модулі UI, або функція "HTTP" для будь якого методу.
Функція вихідних запитів messIO() оперує обміном вмістом HTTP-запитів, загорнутими у XML-пакети. Структура запиту має вигляд:
<req Host="host" URI="uri">
<prm id="pId">pVal</prm>
<cnt name="cName" filename="cFileName">
<prm id="cpId">cpVal</prm>
cVal
</cnt>
reqVal
</req>
Результатом запиту є відповідь зі структурою:
<req Host="host" URI="uri" err="err" Protocol="prt" RezCod="rCod" RezStr="rStr">
<prm id="pId">pVal</prm>
respVal
</req>
Наведемо формування GET та POST запитів на мові JavaLikeCalc.JavaScript, у якості прикладу використання даної функції у користувацьких процедурах:
//GET запит HTML сторінки
req = SYS.XMLNode("GET");
req.setAttr("URI","/");
SYS.Transport.Sockets.out_testHTTP.messIO(req,"HTTP");
test = req.text();
//GET запит та збереження файлу
req = SYS.XMLNode("GET");
req.setAttr("URI","/oscadaArch/Work/openscada-0.9-r2188.tar.lzma");
SYS.Transport.Sockets.out_testHTTP.messIO(req,"HTTP");
if(!req.attr("err").length) SYS.fileWrite("/var/tmp/recvFile.tmp", req.text());
//POST запит
req = SYS.XMLNode("POST");
req.setAttr("URI","/WebUser/FlowTec.txt");
cntNode = req.childAdd("cnt").setAttr("name","pole0").setAttr("filename","Object2-k001-100309-17.txt");
cntNode.childAdd("prm").setAttr("id","Content-Type").setText("text/plain");
cntText = "Object2-k001\r\n";
cntText += "\r\n";
cntText += "v002\r\n";
cntText += " n1\r\n";
cntText += " 09.03.10 16 Polnyj 7155.25 216.0 32.000 17.5\r\n";
cntText += "v005\r\n";
cntText += " n1\r\n";
cntText += " 09.03.10 16 Polnyj 188.81 350.0 4.000 40.0\r\n";
cntText += "\r\n";
cntNode.setText(cntText);
SYS.Transport.Sockets.out_testHTTP.messIO(req,"HTTP");
//POST запит із одиничним вмістом
req = SYS.XMLNode("POST");
req.setAttr("URI","/WebUser/FlowTec.txt");
req.childAdd("prm").setAttr("id","Content-Type").setText("text/plain");
cntText = "Object2-k001\r\n";
cntText += "\r\n";
cntText += "v002\r\n";
cntText += " n1\r\n";
cntText += " 09.03.10 16 Polnyj 7155.25 216.0 32.000 17.5\r\n";
cntText += "v005\r\n";
cntText += " n1\r\n";
cntText += " 09.03.10 16 Polnyj 188.81 350.0 4.000 40.0\r\n";
cntText += "\r\n";
req.setText(cntText);
SYS.Transport.Sockets.out_testHTTP.messIO(req,"HTTP");
Вхідна частина об'єкту модуля (SYS.Protocol.HTTP.{In})
Modules/HTTP/uk - GFDL | March 2025 | OpenSCADA 0.9.8 |