From OpenSCADAWiki
Jump to: navigation, search
This page is a translated version of the page Modules/HTTP and the translation is 97% complete.

Other languages:
English • ‎mRussian • ‎Українська
Модуль Ім'я Версія Ліцензія Джерело Мови Платформи Тип Автор Опис
HTTP HTTP-реалізація 3.10 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.

Рис.1. Діалог вибору модуля WWW-інтерфейсу.

Модулем підтримується багатомовність, яка вмикається динамічним перекладом повідомлень OpenSCADA.

Мова кінцевого користувацького інтерфейсу визначається шляхом та у послідовності:

  • URL параметр "lang".
  • Мова користувача, що увійшов.
  • Мова Web-браузеру з HTTP властивості "Accept-Language".
  • Загальна мова процесу OpenSCADA.

Отримана таким чином мова використовується для побудови інтерфейсів цього модуля і передається WWW під-модулям у HTTP властивості "oscd_lang", через аргумент "vars" функції узагальнення, "GET" і "POST".

To configure and control this module, you have the configuration page of the OpenSCADA control interface (Fig.3) where you can perform:

  • Control for the active authentication sessions.
  • Configuring:
    • Rules of accessing for deny and allow. Any line of the rules of accessing is a different rule and you can use here templates, like to "*/WebVision/*"), or regular expressions, like to "/[^/]+/WebVision/.+/". Useful entries for:
      • Deny:
      • Allow:
        • "*" — all, excluding the deny;
        • "/^[^/]+/[^/]*$/" — pages of the module with all their resources;
        • "*/login/*" — the login page;
        • "/^[^/]+/WebVision/[^/]*($|\?)/" — the WebVision module main page without the VCA projects accessing;
        • "/^[^/]+/WebVision/.+_aviariesOril\d*/.*/" — the VCA project "aviariesOril" of the module WebVision.
    • HTML-template of the user interface and user main-page. In the HTML-template's fields you must specify an address of the file HTML/XHTML, which will be used for formation of the internal-service and main-page interfaces. Internal-service interfaces for example, it's the WEB-modules selection, the login page and like ones of the WEB-modules. From the template required correct XHTML, allowing parse the file by XML-parser, and the presence of the tag "#####CONTEXT#####" at the location of the dynamic content, for internal-service interfaces it's necessarily. Resource files of the templates represented by images, CSS and JavaScript files and their are searching from the directory in which located the specified template file and from the current directory. If errors are found in the template there will be use a standard builtin interface. For different, to the language, template file you can add the language suffix to the file end like "{My template}_{lang}.html" but select the generic-base template file "{My template}.html" into these configuration fields. For the templates example you can see to the most used templates:
    • DB of the active authentication sessions provides an external table of the active authentication sessions — "HTTP_AuthSessions", which is enabled for not empty value and provides a possibility of sharing the authentication between different OpenSCADA stations and its short storing at the station shut down time.
    • Authentication UID generation space, accessible with the common authentication sessions table to guaranty the cookie difference for different OpenSCADA processes.
    • Lifetime of the authentication and set up of the automatic login.
Рис.3. Сторінка налаштування модуля.

1 Аутентифікація

Модулем підтримується аутентифікація у OpenSCADA при надані доступу до модулів WEB-інтерфейсів (рис.2).

Рис.2. Діалог аутентифікації у OpenSCADA.

Аутентифікація цим модулем здійснюється "печеньками" (cookies) із динамічною назвою і простором ІД користувача, де назва "печеньки" (cookie) "oscd_UID" і використовується простір ІД користувача у роботі із спільною таблицею сеансів автентифікації, та назва "oscd_UID_{PrjNm}" у роботі без неї.

Для полегшення роботи з Web-інтерфейсами, модуль передбачає можливість автоматичного входу від ім'я вказаного користувача. Конфігурація автоматичного входу здійснюється на сторінці налаштування модуля (рис.3). Автоматичний вхід здійснюється за збігом адреси, вказаної у стовпчику "Адреса", і від ім'я користувача, вказаного у стовпчику "Користувач".

Для більшої безпеки, можете визначити тільки Web-користувачів у переліку користувачів дозволених до аутентифікації.

2 Модулі WEB-інтерфейсу

Модулі користувацького інтерфейсу (UI), які призначені для спільної роботи із модулем HTTP, мають встановлювати інформаційне поле "SubType" значенням "WWW" та поле "Auth" значенням "1", якщо модуль потребує автентифікації при вході. Для зв'язування модуля HTTP і модулів UI використовується розширений механізм комунікації. Цей механізм передбачає експорт інтерфейсних функцій. У даному випадку, UI модулі мають експортувати лише одну загальну функцію для усіх методів:

  • void HTTP(const string &meth, const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt);:
meth — метод запиту;
uri — локальна адреса запиту;
page — сторінка з відповіддю;
sender — адреса відправника;
vars — змінні запиту;
user — користувач, може містити попереднього користувача у другому рядку;
iprt — посилання на об'єкт вхідної частини протоколу.

Або наступні різні функції окремо для GET і POST методів:

  • void HTTP_GET(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt); АБО
void HttpGet( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user ); — Метод GET з параметрами:
uri — локальна адреса запиту;
page — сторінка з відповіддю;
sender — адреса відправника;
vars — змінні запиту;
user — користувач, може містити попереднього користувача у другому рядку;
iprt — посилання на об'єкт вхідної частини протоколу.
  • void HTTP_POST(const string &uri, string &page, vector<string> &vars, const string &user, TProtocolIn *iprt); АБО
void HttpPost( const string &uri, string &page, const string &sender, vector<string> &vars, const string &user ); — метод POST з параметрами:
uri — локальна адреса запиту;
page — сторінка з відповіддю та вмістом тіла запиту POST;
sender — адреса відправника;
vars — змінні запиту;
user — користувач, може містити попереднього користувача у другому рядку;
iprt — посилання на об'єкт вхідної частини протоколу.

Надалі, у випадку надходження HTTP запиту "GET" буде викликатися функція "HTTP_GET" або "HttpGet", а у випадку запиту "POST" буде викликатися функція "HTTP_POST" або "HttpPost", у відповідному модулі UI, або функція "HTTP" для будь якого методу.

3 Функція вихідних запитів користувацького API

Функція вихідних запитів 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 — метод запиту, підтримується методи "GET" та "POST".
  • host — адреса вузла http-серверу у форматі {HostAddr}:{HostIp}. Якщо дане поле опущено то використовується адреса вузла, вказана у полі адреси транспорту.
  • uri — адреса ресурсу на http-сервері, зазвичай файл або тека.
  • pId, pVal — ідентифікатор та значення додаткового http-параметру. Http-параметрів може бути вказано багато, окремими prm тегами.
  • cName, cFileName, cVal — ім'я, ім'я-файлу та значення елементу вмісту POST-запиту. Елементів вмісту може бути вказано багато, окремими cnt тегами.
  • cpId, cpVal — ідентифікатор та значення додаткового параметру вмісту. Параметрів вмісту може бути вказано багато, окремими prm тегами;
  • reqVal — одинокий вміст POST запиту.

Результатом запиту є відповідь зі структурою:

<req Host="host" URI="uri" err="err" Protocol="prt" RezCod="rCod" RezStr="rStr">
  <prm id="pId">pVal</prm>
  respVal
</req>
Де:
  • req — метод запиту.
  • host — адреса вузла http-серверу.
  • uri — адреса ресурсу.
  • err — помилка, яка виникла під час запиту. У випадку вдалого запиту це поле порожнє.
  • RezCod, RezStr — результат запиту у вигляді коду та тексту.
  • pId, pVal — ідентифікатор та значення додаткового http-параметру відповіді. Http-параметрів може бути багато, визначені окремими prm тегами.
  • respVal — вміст відповіді.

Наведемо формування 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");

4 API користувацького програмування

Вхідна частина об'єкту модуля (SYS.Protocol.HTTP.{In})

  • bool setUser( string user ) — змінює користувача пов'язаного із ідентифікатором сеансу автентифікації.
    • user — користувач для зміни.
  • bool pgAccess(string URL) — перевіряє доступність сторінки, визначеної у URL.
    • URL — URL сторінки, що перевіряється.
  • string pgCreator(string cnt, string rcode = "", string httpattrs = "Content-Type: text/html;charset={SYS}", string htmlHeadEls = "", string forceTmplFile = "") — формує сторінку або ресурс із вмістом cnt, загорнутим у HTTP з результатом rcode, із додатковими атрибутами HTTP httpattrs, додатковим елементом заголовку HTML htmlHeadEls та використанням файлу шаблону forceTmplFile та для мови lang.
    • cnt — вміст сторінки або ресурсу (зображення, XML, CSS, JavaScript, ...);
    • rcode — результуючий код HTTP, на кшталт "200 OK"; порожнє значення вимикає додання HTTP заголовку;
    • httpattrs — додаткові атрибути HTTP, переважно це "Content-Type" із значенням по замовченню "text/html;charset={SYS}"; тільки для "Content-Type: text/html" буде здійснюватися загортання у внутрішній/сервісний, або визначений forceTmplFile, HTML-шаблон;
    • htmlHeadEls — додатковий тег заголовку HTML, переважно це META з "Refresh" для вказаного URL;
    • forceTmplFile — файл прямо визначеного шаблону для перекриття внутрішнього/сервісного або головної сторінки.