Модуль: | HTTP |
Ім'я: | HTTP-реалізація |
Тип: | Протокол |
Джерело: | prot_HTTP.so |
Версія: | 3.1 |
Автор: | Роман Савоченко |
Опис: | Надає підтримку HTTP для WWW базованих користувацьких інтерфейсів. |
Ліцензія: | GPL |
Модуль транспортного протоколу HTTP призначено для реалізації підтримки мережевого протоколу HTTP(Hypertext Transfer Protocol) у системі OpenSCADA.
Протокол HTTP використовується для передачі вмісту WWW. Так, через HTTP передаються наступні типи документів: html, xhtml, png, java та багато інших. Додання підтримки HTTP до системи OpenSCADA у комплексі із транспортом Sockets дозволяє реалізовувати різні користувацькі функції на основі WWW інтерфейсу. Модуль HTTP реалізує два основних методи протоколу HTTP: GET та POST. Модуль HTTP забезпечує контроль цілісності HTTP-запитів та, спільно з транспортом Sockets, дозволяє "збирати" цілісні запити з їх фрагментів, а також забезпечувати збереження з'єднання живим (Keep-Alive).
Для гнучкого підключення користувацьких інтерфейсів до даного модуля використовується модульний механізм у межах самого модуля "HTTP". У ролі модулів використовуються модулі підсистеми "Користувацькі інтерфейси" з додатковим інформаційним полем "SubType", яке має значення "WWW".
У запитах до Web ресурсів прийнято використовувати URL(Universal Resource Locator), відповідно URL передається як основний параметр через HTTP. Перший елемент запитаного URL використовується для ідентифікації модуля UI. Наприклад URL "http://localhost:10002/WebCfg" означає звернення до модуля "WebCfg" на хості "http://localhost:10002". У випадку помилкового визначення ідентифікатору модуля або при звернені взагалі без ідентифікатору "HTTP" модуль генерує діалог інформації про вхід та з наданням вибору одного з доступних користувацьких інтерфейсів. Приклад діалогу показано на рисунку 1.
Модулем підтримується багатомовність, яка вмикається динамічним перекладом повідомлень OpenSCADA (RU).
Мова кінцевого користувацького інтерфейсу визначається шляхом та у послідовності:
Отримана таким чином мова використовується для побудови інтерфейсів цього модуля та передається WWW під-модулям у HTTP властивості "oscd_lang", через аргумент "vars" функцій "GET" та "POST".
Для конфігурації та керування цим модулем надається конфігураційна сторінка інтерфейсу керування OpenSCADA (Рис.3) де Ви можете здійснювати:
Модулем підтримується аутентифікація у системі OpenSCADA при надані доступу до модулів WEB-інтерфейсів (рис.2).
Для полегшення роботи з Web-інтерфейсами модуль передбачає можливість автоматичного входу від ім'я вказаного користувача. Конфігурація автоматичного входу здійснюється на сторінці налаштування модуля (рис.3). Автоматичний вхід здійснюється за збігом адреси, вказаній у стовпчику "Адреса", від ім'я користувача, вказаного у стовпчику "Користувач".
Для більшої безпеки Ви можете визначити тільки Web-користувачів, у переліку користувачів дозволених до аутентифікації.
Модулі користувацького інтерфейсу (UI), які призначені для спільної роботи з модулем HTTP, мають встановлювати інформаційне поле "SubType" значенням "WWW" та поле "Auth" значенням "1", якщо модуль потребує автентифікації при вході. Для зв'язування модуля HTTP та модулів UI використовується розширений механізм комунікації. Цей механізм має на увазі експорт інтерфейсних функцій. У даному випадку UI модулі мають експортувати функції:
Надалі, у випадку надходження HTTP запиту "GET" буде викликатися функція "HTTP_GET" або "HttpGet", а у випадку запиту "POST" буде викликатися функція "HTTP_POST" або "HttpPost" у відповідному модулі UI.
Функція вихідних запитів (messIO()? EN RU) оперує обміном вмістом 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");
Саме цей об'єкт модуля "Protocol.HTTP" [SYS.Protocol.HTTP.pgCreator()]