Ìîäóëü: | HTTP |
Èìÿ: | HTTP-ðåàëèçàöèÿ |
Òèï: | Ïðîòîêîë |
Èñòî÷íèê: | prot_HTTP.so |
Âåðñèÿ: | 2.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 ïðè ïðåäîñòàâëåíèè äîñòóïà ê ìîäóëÿì WEB-èíòåðôåéñîâ (ðèñ.2). Äèàëîã ôîðìèðóåòñÿ íà ÿçûêå "XHTML 1.0 Transitional"!
Äëÿ îáëåã÷åíèÿ ðàáîòû ñ Web-èíòåðôåéñàìè ìîäóëü ïðåäóñìàòðèâàåò âîçìîæíîñòü àâòîìàòè÷åñêîãî âõîäà îò èìåíè óêàçàííîãî ïîëüçîâàòåëÿ. Êîíôèãóðàöèÿ àâòîìàòè÷åñêîãî âõîäà îñóùåñòâëÿåòñÿ íà ñòðàíèöå íàñòðîéêè ìîäóëÿ (ðèñ.3).
Íà ñòðàíèöå íàñòðîéêè ìîäóëÿ ìîæíî èçó÷èòü àêòèâíûå ñåàíñû àóòåíòèôèêàöèè; óêàçàòü: ïðàâèëà äîñòóïà äëÿ çàïðåòà è ðàçðåøåíèÿ, HTML-øàáëîí ñîáñòâåííîãî èíòåðôåéñà, HTML-øàáëîí ãëàâíîé ñòðàíèöû, âðåìÿ æèçíè àóòåíòèôèêàöèè; íàñòðîèòü àâòîìàòè÷åñêèé âõîä.
Êàæäàÿ ñòðîêà ÿâëÿåòñÿ îòäåëüíûì ïðàâèëîì è â êàæäîì ïðàâèëå äîñòóïà Âû ìîæåòå èñïîëüçîâàòü øàáëîíû (âðîäå "*/WebVision/*") è ðåãóëÿðíûå âûðàæåíèÿ (âðîäå "/[^/]+/WebVision/.+/").
Àâòîìàòè÷åñêèé âõîä îñóùåñòâëÿåòñÿ ïî ñîâïàäåíèþ àäðåñà, óêàçàííîãî â êîëîíêå "Àäðåñà", îò èìåíè ïîëüçîâàòåëÿ, óêàçàííîãî â êîëîíêå "Ïîëüçîâàòåëü".
 ïîëÿõ HTML-øàáëîíà äîëæåí óêàçûâàòüñÿ àäðåñ ê ôàéëó HTML/XHTML, êîòîðûé áóäåò èñïîëüçîâàí äëÿ ôîðìèðîâàíèÿ âíóòðåííèõ/ñåðâèñíûõ èíòåðôåéñîâ è ãëàâíîé ñòðàíèöû. Âíóòðåííèå/ñåðâèñíûå èíòåðôåéñû, ýòî íàïðèìåð: âûáîð ìîäóëåé, ñòðàíèöû àâòîðèçàöèè è ïîäîáíîå ó WEB-ìîäóëåé. Îò øàáëîíà òðåáóåòñÿ êîððåêòíîñòü XHTML, êîòîðàÿ ïîçâîëÿåò ðàçîáðàòü ôàéë XML-ïàðñåðîì, à òàêæå íàëè÷èå ìåòêè "#####CONTEXT#####" â ìåñòå ðàçìåùåíèÿ äèíàìè÷åñêîãî ñîäåðæèìîãî, ÷òî îáÿçàòåëüíî äëÿ âíóòðåííèõ/ñåðâèñíûõ èíòåðôåéñîâ. Ðåñóðñíûå ôàéëû øàáëîíîâ ïðåäñòàâëåíû èçîáðàæåíèÿìè, CSS è JavaScript ôàéëàìè, è êîòîðûå èùóòñÿ îò äèðåêòîðèè â êîòîðîé óêàçàíî ðàçìåùåíèå ôàéëà øàáëîíà è îò òåêóùåé äèðåêòîðèè.  ñëó÷àå îáíàðóæåíèÿ â øàáëîíå îøèáîê áóäåò èñïîëüçîâàí ñòàíäàðòíûé âñòðîåííûé èíòåðôåéñ.  êà÷åñòâå ïðèìåðà øàáëîíîâ Âû ìîæåòå ïîñìîòðåòü òàêèå íàèáîëåå èñïîëüçóåìûå:
Ìîäóëè ïîëüçîâàòåëüñêîãî èíòåðôåéñà (UI), ïðåäíàçíà÷åííûå äëÿ ñîâìåñòíîé ðàáîòû ñ ìîäóëåì HTTP, äîëæíû óñòàíàâëèâàòü èíôîðìàöèîííîå ïîëå “SubType” çíà÷åíèåì “WWW” è ïîëå "Auth" çíà÷åíèåì "1", åñëè ìîäóëü òðåáóåò àóòåíòèôèêàöèè ïðè âõîäå. Äëÿ ñâÿçè ìîäóëÿ HTTP è ìîäóëåé UI èñïîëüçóåòñÿ ðàñøèðåííûé ìåõàíèçì êîììóíèêàöèè. Ýòîò ìåõàíèçì ïîäðàçóìåâàåò ýêñïîðò èíòåðôåéñíûõ ôóíêöèé.  äàííîì ñëó÷àå UI ìîäóëè äîëæíû ýêñïîðòèðîâàòü ôóíêöèè:
Äàëåå, â ñëó÷àå ïîñòóïëåíèÿ HTTP çàïðîñà "GET" áóäåò âûçûâàòüñÿ ôóíêöèÿ "HTTP_GET" èëè "HttpGet", à â ñëó÷àå çàïðîñà "POST" áóäåò âûçûâàòüñÿ ôóíêöèÿ "HTTP_POST" èëè "HttpPost" â ñîîòâåòñòâóþùåì ìîäóëå UI.
Ôóíêöèÿ èñõîäÿùèõ çàïðîñîâ (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");
Èìåííî ýòîò îáúåêò ìîäóëÿ "Protocol.HTTP" [SYS.Protocol.HTTP.pgCreator()]