OpenSCADAWiki: Doc/HTTP ...

Home | Index | Changes | Comments | Users | Registration | Login  Password:  
 
This is an old revision of Doc/HTTP from 2017-06-11 21:57:33..

Ìîäóëü <HTTP> ïîäñèñòåìû "Ïðîòîêîëû"

Ìîäóëü: HTTP
Èìÿ: HTTP-ðåàëèçàöèÿ
Òèï: Ïðîòîêîë
Èñòî÷íèê: prot_HTTP.so
Âåðñèÿ: 2.1
Àâòîð: Ðîìàí Ñàâî÷åíêî
Îïèñàíèå: Ïðåäîñòàâëÿåò ïîääåðæêó ïðîòîêîëà HTTP äëÿ WWW-îñíîâàííûõ ïîëüçîâàòåëüñêèõ èíòåðôåéñîâ.
Ëèöåíçèÿ: GPL

Contents

Ââåäåíèå

Ìîäóëü òðàíñïîðòíîãî ïðîòîêîëà 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.


Äèàëîã âûáîðà ìîäóëÿ WWW-èíòåðôåéñà. (43 Kb)
Ðèñ.1. Äèàëîã âûáîðà ìîäóëÿ WWW-èíòåðôåéñà.

1. Àóòåíòèôèêàöèÿ

Ìîäóëåì ïîääåðæèâàåòñÿ àóòåíòèôèêàöèÿ â ñèñòåìå OpenSCADA ïðè ïðåäîñòàâëåíèè äîñòóïà ê ìîäóëÿì WEB-èíòåðôåéñîâ (ðèñ.2). Äèàëîã ôîðìèðóåòñÿ íà ÿçûêå "XHTML 1.0 Transitional"!


Äèàëîã àâòîðèçàöèè â ñèñòåìå OpenSCADA. (12 Kb)
Ðèñ.2. Äèàëîã àâòîðèçàöèè â ñèñòåìå OpenSCADA.

Äëÿ îáëåã÷åíèÿ ðàáîòû ñ Web-èíòåðôåéñàìè ìîäóëü ïðåäóñìàòðèâàåò âîçìîæíîñòü àâòîìàòè÷åñêîãî âõîäà îò èìåíè óêàçàííîãî ïîëüçîâàòåëÿ. Êîíôèãóðàöèÿ àâòîìàòè÷åñêîãî âõîäà îñóùåñòâëÿåòñÿ íà ñòðàíèöå íàñòðîéêè ìîäóëÿ (ðèñ.3).


Ñòðàíèöà íàñòðîéêè ìîäóëÿ. (89 Kb)
Ðèñ.3. Ñòðàíèöà íàñòðîéêè ìîäóëÿ.

Íà ñòðàíèöå íàñòðîéêè ìîäóëÿ ìîæíî èçó÷èòü àêòèâíûå ñåàíñû àóòåíòèôèêàöèè; óêàçàòü: ïðàâèëà äîñòóïà äëÿ çàïðåòà è ðàçðåøåíèÿ, HTML-øàáëîí ñîáñòâåííîãî èíòåðôåéñà, HTML-øàáëîí ãëàâíîé ñòðàíèöû, âðåìÿ æèçíè àóòåíòèôèêàöèè; íàñòðîèòü àâòîìàòè÷åñêèé âõîä.


Êàæäàÿ ñòðîêà ÿâëÿåòñÿ îòäåëüíûì ïðàâèëîì è â êàæäîì ïðàâèëå äîñòóïà Âû ìîæåòå èñïîëüçîâàòü øàáëîíû (âðîäå "*/WebVision/*") è ðåãóëÿðíûå âûðàæåíèÿ (âðîäå "/[^/]+/WebVision/.+/").


Àâòîìàòè÷åñêèé âõîä îñóùåñòâëÿåòñÿ ïî ñîâïàäåíèþ àäðåñà, óêàçàííîãî â êîëîíêå "Àäðåñà", îò èìåíè ïîëüçîâàòåëÿ, óêàçàííîãî â êîëîíêå "Ïîëüçîâàòåëü".


 ïîëÿõ HTML-øàáëîíà äîëæåí óêàçûâàòüñÿ àäðåñ ê ôàéëó HTML/XHTML, êîòîðûé áóäåò èñïîëüçîâàí äëÿ ôîðìèðîâàíèÿ âíóòðåííèõ/ñåðâèñíûõ èíòåðôåéñîâ è ãëàâíîé ñòðàíèöû. Âíóòðåííèå/ñåðâèñíûå èíòåðôåéñû, ýòî íàïðèìåð: âûáîð ìîäóëåé, ñòðàíèöû àâòîðèçàöèè è ïîäîáíîå ó WEB-ìîäóëåé. Îò øàáëîíà òðåáóåòñÿ êîððåêòíîñòü XHTML, êîòîðàÿ ïîçâîëÿåò ðàçîáðàòü ôàéë XML-ïàðñåðîì, à òàêæå íàëè÷èå ìåòêè "#####CONTEXT#####" â ìåñòå ðàçìåùåíèÿ äèíàìè÷åñêîãî ñîäåðæèìîãî, ÷òî îáÿçàòåëüíî äëÿ âíóòðåííèõ/ñåðâèñíûõ èíòåðôåéñîâ. Ðåñóðñíûå ôàéëû øàáëîíîâ ïðåäñòàâëåíû èçîáðàæåíèÿìè, CSS è JavaScript ôàéëàìè, è êîòîðûå èùóòñÿ îò äèðåêòîðèè â êîòîðîé óêàçàíî ðàçìåùåíèå ôàéëà øàáëîíà è îò òåêóùåé äèðåêòîðèè.  ñëó÷àå îáíàðóæåíèÿ â øàáëîíå îøèáîê áóäåò èñïîëüçîâàí ñòàíäàðòíûé âñòðîåííûé èíòåðôåéñ.  êà÷åñòâå ïðèìåðà øàáëîíîâ Âû ìîæåòå ïîñìîòðåòü òàêèå íàèáîëåå èñïîëüçóåìûå:

2. Ìîäóëè ïîëüçîâàòåëüñêîãî WEB-èíòåðôåéñà

Ìîäóëè ïîëüçîâàòåëüñêîãî èíòåðôåéñà (UI), ïðåäíàçíà÷åííûå äëÿ ñîâìåñòíîé ðàáîòû ñ ìîäóëåì HTTP, äîëæíû óñòàíàâëèâàòü èíôîðìàöèîííîå ïîëå “SubType” çíà÷åíèåì “WWW” è ïîëå "Auth" çíà÷åíèåì "1", åñëè ìîäóëü òðåáóåò àóòåíòèôèêàöèè ïðè âõîäå. Äëÿ ñâÿçè ìîäóëÿ HTTP è ìîäóëåé UI èñïîëüçóåòñÿ ðàñøèðåííûé ìåõàíèçì êîììóíèêàöèè. Ýòîò ìåõàíèçì ïîäðàçóìåâàåò ýêñïîðò èíòåðôåéñíûõ ôóíêöèé.  äàííîì ñëó÷àå UI ìîäóëè äîëæíû ýêñïîðòèðîâàòü ôóíêöèè:

void HttpGet( const string &url, string &page, const string &sender, vector<string> &vars, const string &user ); — Ìåòîä GET c ïàðàìåòðàìè:
url — àäðåñ çàïðîñà;
page — ñòðàíèöà ñ îòâåòîì;
sender — àäðåñ îòïðàâèòåëÿ;
vars — ïåðåìåííûå çàïðîñà;
user — ïîëüçîâàòåëü ñèñòåìû;
iprt — ññûëêà íà îáúåêò âõîäíîé ÷àñòè ïðîòîêîëà.

void HttpPost( const string &url, string &page, const string &sender, vector<string> &vars, const string &user ); — ìåòîä POST c ïàðàìåòðàìè:
url — àäðåñ çàïðîñà;
page — ñòðàíèöà ñ îòâåòîì è ñîäåðæèìûì òåëà çàïðîñà POST;
sender — àäðåñ îòïðàâèòåëÿ;
vars — ïåðåìåííûå çàïðîñà;
user — ïîëüçîâàòåëü ñèñòåìû;
iprt — ññûëêà íà îáúåêò âõîäíîé ÷àñòè ïðîòîêîëà.

Äàëåå, â ñëó÷àå ïîñòóïëåíèÿ HTTP çàïðîñà "GET" áóäåò âûçûâàòüñÿ ôóíêöèÿ "HTTP_GET" èëè "HttpGet", à â ñëó÷àå çàïðîñà "POST" áóäåò âûçûâàòüñÿ ôóíêöèÿ "HTTP_POST" èëè "HttpPost" â ñîîòâåòñòâóþùåì ìîäóëå UI.

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 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");

4. API ïðîãðàììèðîâàíèÿ ïîëüçîâàòåëÿ

Èìåííî ýòîò îáúåêò ìîäóëÿ "Protocol.HTTP" [SYS.Protocol.HTTP.pgCreator()]

Ññûëêè

Referring pages: Doc
Doc/WebUser
Doc/WebVision
Using/PLC/firmware
Using/SmartHouse


 
There are no files on this page.[Display files/form]
There is no comment on this page. [Display comments/form]