Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Komunikacja READPI/WRITEPI z wykorzystaniem web-servera

Jako że od momentu gdy pisałem pierwsze artykuły o sterowaniu wiele się w świecie IT zmieniło i wszystkie popularne przeglądarki egzekwują single-origin-policy, chciałbym zaproponować rozwiązanie, które umożliwia komunikację z WAGO z wykorzystaniem web servera.  W moim przypadku funkcję takiego serwera pełni Raspberry Pi.  Powody, dla których wybrałem RPi, są opisane w oddzielnym artykule.

Dwa słowa o single origin policy.  Gdy otwieramy w przeglądarce stronę z adresu X, strona ta co do zasady może wysyłać zapytania tylko do servera, z którego została uruchomiona.  Jeśli więc wgramy plik a.html na sterownik WAGO (IP 192.168.1.10) do katalogu /webserv, otworzymy ten plik w przeglądarce (http://192.168.1.10/a.html) i plik ten wyśle zapytania ajax do WAGO (192.168.1.10) - wszystko zadziała.  Gdy jednak plik ten wgramy na jakiś inny serwer, komputer stacjonarny lub telefon, nie będzie on w stanie rozmawiać z WAGO.

Istnieje możliwość miedzy-domenowej komunikacji.  Aby przeglądarka nie odrzuciła odpowiedzi, serwer, który odpowiada, musi odpowiednio skonstruować odpowiedź.  Jako że nie mamy wpływu na to, jak odpowiada WAGO, droga ta jest dla nas zamknięta (tak, próbowałem pisać do WAGO, by udostępnili w nagłówku 'Access-Control-Allow-Origin: *' ale bez reakcji).

Dlaczego więc nie wgrywać wszystkiego na WAGO?  Z kilku powodów.  Webserver sterownika nie obsługuje PHP, manipuluje kodowaniem plików, ma ograniczoną pojemność i nie powinien być wystawiany na świat zewnętrzny.  Przy prostych skryptach - wystarcza.  Przy bardziej złożonych zadaniach - absolutnie nie.

Rozwiązanie, które stosuję, opiera się o webserver na Raspberry Pi.  Plik html otwarty w przeglądarce komputera, wysyła 'zapytanie' do pliku php umieszonego również na RPi, skrypt PHP komunikuje się z WAGO.  Brakuje mi pewnie daru, by opisać to jasno.  Przejdźmy więc do przykładu:

<html>
<head>
	<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

	<script type="text/javascript">
$(document).ready(function() {
$('#Button1').click(function() { //action on the button click
var address = $('#address').text().replace(/ /g,''); //take the address from the filed and trim all spaces
$.ajax({ type: 'POST', url: 'getData.php', data: {ADR: address}, //send to the PHP file the address
success: function(data){ //what to do if data received if (data.charAt(0) == '<') { //if reply starts with "<" it means that the address was wrong, and WAGO returns structured html $('#Result').html(data.substring(4)); //show the WAGO message but without the initial "<br>" } else { //otherwise the data received is what we wanted $('#Result').text('Reply: ' + address + ': ' + data); //show the result } },
error: function(jqXHR, textStatus, errorThrown) { //in case of connection error, print whatever you can get from the server $('#Result').text(jqXHR.statusText+', '+textStatus+', '+errorThrown); } }); //End of AJAX }); //End of Button.click() }); //End of document.ready()
</script>
<style type="text/css"> .Button {height: 30px; width: 300px; border: gray dotted 2px; padding: 2px; text-align: center; line-height: 30px;} </style>
</head> <body> <div id="addressField" style="width: 300px;"> Address to check: <div id="address" contenteditable="true" style="float: right; border: 1px solid black">QX0.0</div></div> <br> <div id ="Button1" class="Button">Click to read!</div> <br> <div id ="Result" class="Button"></div> </body> </html>

Oto plik getData.php:

<?php
	if(isset($_POST['ADR'])) {
		$url = "http://192.168.1.10/READPI"; //change the IP to your WAGO's IP
		$data = array('ADR' => $_POST['ADR'], 'FORMAT' => '%d');

		$options = array(
			'http' => array(
				'header' => "Content-type: application/x-www-form-urlencoded\r\n",
				'method' => 'POST',
				'content' => http_build_query($data)
			),
		);

		$context = stream_context_create($options);
		$result = file_get_contents($url, false, $context);

		echo $result; 
	}
?>

Proponuję rozpocząć poszukiwania optymalnego sposobu komunikacji ze sterownikiem od tego właśnie skryptu.  Pokazuje on, co i jak dział i pozwala przetestować połączenie.