W&T verbindet
Interfaces für TCP/IP, Ethernet, RS-232, RS-485, USB, 20mA, Glas- und Kunststoff-LWL, http, SNMP, OPC, Modbus TCP, I/O digital, I/O analog, ISA, PCI

Applikation zur Motherbox:

Datenabfrage über das Netzwerk mit PHP

Eine Webseite zeigt viele Geräte...


motherbox php data request

Netzwerkkommunikation zwischen einem Broswer und einem Endgerät ist mit clientseitig ausgeführten Webtechniken (z.B. JavaScript/AJAX, Java-Applet) nur dann möglich, wenn das Endgerät die abfragende Webseite selber bereitstellt. Die mit diesen Webtechniken verbundenen Sicherheitsrestriktionen verbieten strikt den Datenaustausch zwischen dem Browser (Webseite geladen von Endgerät A) und weiteren Endgeräten (B, C, ...).

Sollen mehrere Geräte gleichzeitig angesprochen werden, z.B. um die in mehreren Kühlhäusern gemessenen Temperaturen auf einer Webseite zu visualisieren, ist ein zentraler Zugang mit serverseitig ausgeführter Software (z.B. PHP) erforderlich. Liegen diese Voraussetzungen vor, greifen die zuvor angesprochenen Einschränkungen nicht mehr. Die Initiierung der Kommunikation ist jetzt Aufgabe des Webservers, der zum Verbindungsaufbau mit beliebigen Endpunkten im Netzwerk berechtigt ist.

Aufgabenstellung

Das vorliegende Beispiel beschreibt, wie per PHP eine Socketverbindung zu einer Datenquelle aufgebaut wird. Über diese Verbindung wird dann ein Messwert abgefragt, der schließlich auf der zurückgelieferten Webseite dargestellt wird. Die erforderlichen Parameter (IP-Adresse, HTTP-Port und Nummer des Messkanals) kommen aus einem Formular und werden beim Seitenaufruf per Post übertragen.

Als Webserver mit PHP-Unterstützung wird die Motherbox eingesetzt. Datenquelle mit Messpunkten für Temperatur, Luftfeuchte und Luftdruck ist ein Web-Thermo-Hygrobarograph.

Für die Umsetzung dieses Beispiels wird lediglich eine PHP-Datei benötigt, die beim Anfordern neuer Daten mit dem erforderlichen Parametersatz erneut aufgerufen wird. Sie können die Beispieldatei hier herunter laden.

Speichern Sie die Beispieldatei temperature_request.php im Ordner websites auf der Motherbox. Nutzen Sie anschließend folgende Aufruf-URL aus einem beliebigen Browser:

					http://<IP-Adresse>/websites/temperature_request.php
				
Screenshot Webseite

Der Quelltext

Im einleitenden PHP-Bereich erfolgt die Initialisierung der Variablen. Wird die Webseite durch Eingabe der URL im Browser aufgerufen, werden keine Werte für IP-Adresse, HTTP-Port und Kanalnummer per Post übermittelt. In diesem Fall werden die Variablen mit Standardwerten belegt. Erfolgt der Seitenaufruf über die Schaltfläche Request Data auf der Webseite, werden die vom Benutzer eingetragenen Werte übermittelt und den Variablen zugewiesen.


						<?php
							if(isset($_POST["ip"]))
								{
									$ip = $_POST["ip"];
									$port = $_POST["port"];
									$slot = $_POST["slot"];
								}
							else
								{
									$ip = "";
									$port = "80";
									$slot = 1;
								}
						?>
					
				

Im head-Bereich wird der Zeichensatz festgelegt und per CSS die Ausrichtung und das Design zentraler HTML-Komponenten bestimmt.

Das Formular im body dient der Dateneingabe durch den Benutzer. Die Textfelder ip und port nehmen Angaben über IP-Adresse und HTTP-Port des abzufragenden Web-IOs auf. Die Radiobuttons slot legen den abzufragenden Kanal fest. Per PHP werden diese Felder bei der Ausgabe entweder mit den Standardwerten, oder den aktuell angefragten Werten gefüllt. Wird das Formular übertragen, werden die eingetragenen Daten per Post an den Server übermittelt.


						<form action="temperature_request.php" method="post">
							<table align="center">
								<tr>
									<th>IP-Address:</th>
									<td>
										<input name="ip" type="text" value="<?php echo $ip; ?>" />
									</td>
								</tr>
								<tr>
									<th>Port:</th>
									<td>
										<input name="port" type="text" value="<?php echo $port; ?>" />
									</td>
								</tr>
								<tr>
									<th>Channel:</th>
									<td>
										<input <?php if($slot == 1) echo "checked"; ?> name="slot" type="radio" value="1" />1&nbsp;
										<input <?php if($slot == 2) echo "checked"; ?> name="slot" type="radio" value="2" />2&nbsp;
										<input <?php if($slot == 3) echo "checked"; ?> name="slot" type="radio" value="3" />3&nbsp;
									</td>
								</tr>
								<tr>
									<td align="center" colspan="2">
										<input type="submit" value="Request Data" />
									</td>
								</tr>
							</table>
						</form>
					
				

Das Kommunikationshandling geschieht im PHP-Bereich innerhalb des DIV-Elementes measurement. Wurde beim Aufruf ein Parametersatz übertragen, wird eine Socketverbindung zur angegebene IP-Adresse und Portnummer aufgebaut. Für den Verbindungsaufbau ist ein Timeout von 3s definiert. Im Fehlerfall erfolgt die Textausgabe Connection Error. Das @-Zeichen vor dem fsockopen-Befehl unterdrückt zusätzlich eine vom PHP generierte Fehlermeldung. Bei erfolgreichem Verbindungsaufbau wird über den Request GET /single, gefolgt von der gewünschten Kanalnummer, der Messwert angefordert. Die Antwort wird anschließend zeichenweise eingelesen, bis ein 0-Byte empfangen wird, welches das Ende der Antwort des Web-IOs kennzeichnet. Die beim Empfang zusammengesetzte Zeichenkette wird jetzt in einen Array konvertiert, wobei das Semikolon als Trennzeichen der einzelnen Elemente verwendet wird. Das letzte Element des Arrays stellt den Messwert inkl. Einheit dar, das vorletzte Element den Namen des Kanals. Diese werden beide ausgegeben.

Beim Aufruf der Seite ohne Parametersatz, wird keine Kommunikation aufgebaut, es werden lediglich drei Strich (---) ausgegeben.


						<?php
							if($ip)
								{
									$handle = @fsockopen($ip, $port, $errno, $errstr, 3);
									if (!$handle)
											echo "Connection Error!";
									else
										{
											$response = "";
											fwrite($handle, "GET /single" . $slot);
											do
												{
													$data = fgets($handle, 2);
													if(ord($data) != 0)
															$response = $response . utf8_encode($data);
													else
															break;
												}
											while(true);
											fclose($handle);

											$parts = explode(";", $response);
											echo "<b>" . $parts[count($parts)-1] . "</b> (" . $parts[count($parts)-2] . ")";
										}
								}
							else
									echo "---";
						?>
					
				

Fazit

Die Motherbox bietet mit ihrem PHP-fähigen Webserver alles, was für die Kommunikation mit anderen Netzwerkkomponetnen erfoderlich ist. Greifen Sie von einem zentralen Punkt aus auf die Messwerte oder Daten unterschiedlicher Endgeräte zu und konsolidieren Sie diese auf einer Webseite. Diese Gateway-Funktion ist ebenfalls für den Zugriff von außen auf diverse Endgeräte in privaten Netzwerken hilfreich. Sie brauchen nur das NAT-Routing für die Motherbox einzurichten, anstatt für jedes der Endgeräte einen eigenen Zugang zu schaffen.