Wiesemann & Theis GmbH

Tecnologia di rete, dei sensori e delle interfacce per industria, ufficio e informatizzazione

Applicazione per la motherbox:

Interrogazione dati via rete con PHP

Un sito web mostra molti dispositivi...


motherbox php data request

La comunicazione di rete tra un browser e un terminale è possibile con tecniche web effettuate dal client (per es. JavaScript/AJAX, Java-Applet) solo se il terminale fornisce autonomamente il sito web interrogato. Le limitazioni di sicurezza collegate a queste tecniche web proibiscono severamente lo scambio di dati tra il browser (sito web caricato dalla periferica A) e altri terminali (B, C, ...).

Se venissero coinvolti più apparecchi contemporaneamente, p. es. per visualizzare le temperature misurate in più celle frigorifere su una pagina web, è necessario un accesso centrale con software eseguito dal server (p.es. PHP). Se sono presenti questi requisiti, limitazioni sopra menzionate non vengono più applicate. L’avvio della comunicazione è adesso compito del server web che è autorizzato a stabilire connessioni con un numero illimitato di terminali in rete.

Problema

Il presente esempio spiega come è possibile stabilire un collegamento socket ad una fonte di dati via PHP. Attraverso questo collegamento viene quindi consultato un valore di misura che viene visualizzato, alla fine, sul sito web nuovamente aperto. I parametri necessari (indirizzo IP, porta HTTP e numero del canale di misura) provengono da un modulo e vengono trasmessi per post al richiamo della pagina.

Come server web con supporto PHP viene usata la Motherbox. La fonte di dati con punti di misura per temperatura, umidità dell’aria e pressione atmosferica è un Termoigrobarografo web.

Per la realizzazione di questo esempio è necessario solo un file PHP che viene nuovamente richiamato alla richiesta di nuovi dati con il record di parametri necessari. Potete scaricare il file esempio qui.

Salvate il file esempio temperature_request.php nella cartella websites sulla motherbox. Utilizzate in seguito il seguente URL di richiamo da un browser qualsiasi:

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

Il testo sorgente

Nell’area PHP introduttiva si verifica l’inizializzazione delle variabili. Se il sito web viene richiamato inserendo l’URL nel browser, non viene trasmesso nessun valore per l’indirizzo IP, la porta HTTP e il numero del canale per post. In questo caso le variabili vengono occupate con valori standard. Se il richiamo della pagina avviene attraverso l’interfaccia Request Data sul sito web, i valori inseriti dall’utente vengono trasmessi e attribuiti alle variabili.


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

Nell’area head viene fissata la serie di caratteri e via CSS viene determinato l’orientamento e il design dei componenti HTML centrali.

Il modulo nel body serve all’immissione di dati da parte dell’utente. I campi di testo ip e port raccolgono dati su indirizzo IP e porta HTTP del Web-IO da consultare. I radiobutton slot stabiliscono il canale da consultare. Questi campi vengono compilati alla visualizzazione o con valori standard o con i valori attualmente interrogati via PHP. Se il modulo viene trasmesso, i dati inseriti vengono trasmessi per post al server.


						<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>
					
				

L’handling di comunicazione avviene nell’area PHP all’interno dell’elemento DIV measurement. Se al richiamo è stata trasmessa una serie di parametri, viene stabilito un collegamento socket con l’indirizzo IP e il numero di porta indicati. Per la realizzazione di un collegamento è definito un timeout di 3 s. In caso di errore viene visualizzato il testo Connection Error. Il simbolo @ davanti al comando fsockopen sopprire anche un messaggio di errore generato dal PHP. In caso di collegamento riuscito mediante la request GET /single, seguita dal numero di canale desiderato, viene richiesto il valore di misura. La risposta viene quindi letta carattere per carattere, fino a quando viene ricevuto un byte 0 che rappresenta la fine della risposta del Web-IO. La catena di caratteri composta alla ricezione viene ora convertita in un array, dove il punto e virgola è utilizzato come carattere di separazione dei singoli elementi. L’ultimo elemento dell’array rappresenta il valore di misura incl. l’unità, il penultimo elemento il nome del canale. Entrambi vengono visualizzati.

Al richiamo della pagina senza serie di parametri, non viene stabilita la comunicazione, vengono visualizzati esclusivamente tre trattini (---).


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

In conclusione

La motherbox, con il suo server web PHP compatibile, offre tutto ciò che è necessario per la comunicazione con altri componenti della rete. Accedete ai valori di misura o ai dati di terminali diversi da un punto centrale e raggruppateli sul sito web. Questa funzione gateway è anch’essa utile per l’accesso dall’esterno a diversi terminali in reti private. Dovete solo impostare il NAT-Routing per la motherbox, invece che creare un accesso proprio per ogni terminale.

^