Objectifs : Etre capable de mettre en œuvre le module IoT WISE4012E
1. Introduction...1
2. Installation...2
2.1.1 Alimentation :...2
2.1.2 Mise en service :...2
3. Récupération des valeurs par requêtes HTTP...3
3.1. Test de récupération valeur analogique : ai_value...3
4. Activités possibles...5
4.1. TP cloud local...5
4.2. TP IHM de supervision avec WAMP...5
4.3. TP IHM de supervision avec NodeRED...5
5. TP IHM de supervision avec WAMP...6
5.1. Mise en service...6
5.2. Rappel :...6
5.3. Programmation...6
5.4. Test envoi PUT en php...7
5.4.1 Test 1 : commande du relais CH1...7
6. Développement de l'IHM...9
6.1. Essai 1 : Commande des LED0 et LED1...9
6.1.1 La page HTML...9
6.2. Les pages PHP...9
6.2.1 allumerLED0.php...9
6.2.2 eteindreLED0.php...10
6.2.3 Conclusion essai1 :...11
7. Complément...11
8. correction complète...12
8.1. Le code de la page PHP à mettre sur le serveur...12
8.2. le visuel...14
8.3. Résultat...14
9. Conclusion...15
1. INTRODUCTION
Les modules WISE4012E permettent de réaliser la supervision de systèmes
industriels. Cette supervision peut se faire par le logiciel ''WebAccess'' (SCADA
supervision control and data acquisition)ou par interface web.
interroge le WISE et qui crée l'IHM et l'affiche, soit utiliser la suite fournie ''Webaccess''.
2. INSTALLATION
2.1.1 Alimentation :
Attention si l'alimentation ne fournit pas assez de courant (>300mA) le module de se lance pas. Utiliser un bloc 230V/5V USB avec I>500mA.
2.1.2 Mise en service :
Le module est en mode AP avec SSID : WISE-4012E_MAC6DIGIT et IP : 192.168.1.1.
Se connecter avec un PC Wifi sur ce réseau.
Aller à l'adresse du serveur WISE 192.168.1.1
Configuration : 3 utilisateurs possibles (root, admin, user avec passe : 00000000 pour tous)
Voir la doc technique pour les différentes configurations possible.
3. RÉCUPÉRATION DES VALEURS PAR REQUÊTES HTTP
3.1. Test de récupération valeur analogique : ai_value Lancer Wireshark et sniffer la communication Wifi.
A l'aide d'un navigateur aller à la page : 192.168.1.1/ai_value/slot_0 Le serveur renvoie au format JSON les données :
Afin de récupérer les données il faut installer un serveur et créer une page php qui envoie la requête et qui récupère les données JSON envoyé par le module.
ATTENTION : bien mettre http:/ / avant l'IP/ ai_value/ slot sinon les données ne ₀ sont pas renvoyées !!!
Si ça marche on obtient :
Illustration 1: Requête GET avec erreur
Pour faciliter les communications REST on peut ajouter un plugin à firefox (RESTclient).
Après on peut envoyer et recevoir des données à partir du navigateur.
Illustration 3: Utilisation du plug-in RESTED sous FireFox
Illustration 2: Requête GET vers WISE4012E : résultat
4. ACTIVITÉS POSSIBLES
4.1. TP cloud local
Dans cette activité on souhaite créer un IHM affichant les données enregistrées par les modules WISE et transférées dans un cloud local (voir configuration du WISE).
Les données sont stockées dans une base de donnée : mySql
matériel : un WISE 4012E + un PC avec Wamp ou Rasbpi avec Lamp
4.2. TP IHM de supervision avec WAMP
Dans cette activité on souhaite créer un IHM de supervision hébergé sur un serveur externe au module (obligatoire pour les WISE4000!)
Par praticité on utilisera un connexion wifi directe (WISE en AP + PC connecté sur le WISE).
L'IHM sera développée en php et javascript.
Les requêtes GET et PUT permettent de lire et de modifier les IO du WISE (voir doc.technique UM-WISE-4000-ED.4-EN.PDF (p127…).
Un historique peut être ajouter en utilisant les fichiers .csv du cloud local.
Solution donnée ci dessous.
4.3. TP IHM de supervision avec NodeRED Matériel : WISE + NodeRED
En cours de validation
5. TP IHM DE SUPERVISION AVEC WAMP
5.1. Mise en service
WISE en AP (192.168.1.1 root 00000000) PC
5.2. Rappel :
Récupération des données du module WISE : GET
http://IPWISE/di_value/slot_0 : récupère TOUTES les données du slot http://IPWISE/di_value/slot_0/ch_0 : récupère la data du slot0 canal0 Contrôle des sorties du module WISE : PUT
http://IPWISE/di_value/slot_0/ch_0 : contrôle de la data du slot0 canal0
5.3. Programmation
script : utiliser l'ardoise FireFox : en test php : utiliser notepad++
Exemple de code php (envoi requête)
<?php
/* Envoi d'une requête POST sur le serveur https://secure.example.com/form_action.php * Inclusion des variables "foo" et "bar"
*/
$sock = fsockopen("ssl://secure.example.com", 443, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");
$data = "foo=" . urlencode("Value for Foo") . "&bar=" . urlencode("Value for Bar");
fwrite($sock, "POST /form_action.php HTTP/1.0\r\n");
fwrite($sock, "Host: secure.example.com\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, $data);
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
echo "\n";
$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
?>
5.4. Test envoi PUT en php.
5.4.1 Test 1 : commande du relais CH1 Utilisation de RESTclient sous Firefox :
Test du script php : Erreur 411 !
ATTENTION au majuscule ! : Content-Length et non Content-length !
Illustration 4: Test avec RESTClient et mesure Wireshark
Illustration 5: Test script PHP et mesure Wireshark : erreur 411
Test contrôle relais OK :
<?php /*
il faut envoyer par PUT /do_value/slot_0/ch_0 ou PATCH si on envoie pas toutes les valeurs JSON Content-type: application/json {
"Ch":0, "Md":1, "Stat":1, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
Content-type: application/json {
"Ch":0, "Md":1, "Stat":0, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
*/
/* Envoi d'une requête PUT sur le serveur du WISE pour controler un relais
* */
$sock = fsockopen("192.168.1.1", 80, $errno, $errstr, 30);//ip,port,erreur,message erreur,timeout en seconde if (!$sock) die("$errstr ($errno)\n");
$data = '{"Ch":1,"Val":0}';//active le sortie relais
fwrite($sock, "PUT /do_value/slot_0/ch_1 HTTP/1.0\r\n");
fwrite($sock, "Host: 192.168.1.1\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock,"Authorization: Basic cm9vdDowMDAwMDAwMA==\r\n");
fwrite($sock, "Content-Length: " . strlen($data). "\r\n");
fwrite($sock,"Content-Type: text/plain;charset=UTF-8\r\n");
fwrite($sock,"Connection: keep-alive\r\n");//Connection: keep-alive\r\n fwrite($sock, "\r\n");
fwrite($sock, $data);
$body = "<h1>WISE 4012E</h1> <br>";
while (!feof($sock))
$body .= fgets($sock, 4096);
echo $body;
fclose($sock);
?>
Illustration 6: Test OK contrôle relais WISE4012E en php
6. DÉVELOPPEMENT DE L'IHM
6.1. Essai 1 : Commande des LED0 et LED1
Une page ''index.html'' envoie vers plusieurs pages php les infos d'alumage ou d'extinction à l'aide de formulaire.
6.1.1 La page HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>allumerLED0</title>
</head>
<body>
WISE 4012E<br>
<form method="get" action="allumerLED0.php" name="form_LED0ON">
<input name="valider" type="submit" value="Allumer LED0"><br>
</form>
<form method="get" action="eteindreLED0.php" name="form_LED0OFF">
<input name="valider" type="submit" value="Eteindre LED0"><br>
</form>
<form method="get" action="allumerLED1.php" name="form_LED1ON">
<input name="valider" type="submit" value="Allumer LED1"><br>
</form>
<form method="get" action="eteindreLED1.php" name="form_LED1OFF">
<input name="valider" type="submit" value="Eteindre LED1"><br>
</form>
</body>
</html>
6.2. Les pages PHP
6.2.1 allumerLED0.php
<?php /*
il faut envoyer par PUT /do_value/slot_0/ch_0 ou PATCH si on envoie pas toutes les valeurs JSON Content-type: application/json {
"Ch":0, "Md":1, "Stat":1, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
Content-type: application/json {
"Ch":0, "Md":1, "Stat":0, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
*/
*/
$sock = fsockopen("192.168.1.1", 80, $errno, $errstr, 30);//ip,port,erreur,message erreur,timeout en seconde if (!$sock) die("$errstr ($errno)\n");
$data = '{"Ch":0,"Val":1}';//active le sortie relais ok testé
fwrite($sock, "PUT /do_value/slot_0/ch_0 HTTP/1.0\r\n");
fwrite($sock, "Host: 192.168.1.1\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock,"Authorization: Basic cm9vdDowMDAwMDAwMA==\r\n");
fwrite($sock, "Content-Length: " . strlen($data). "\r\n");
fwrite($sock,"Content-Type: text/plain;charset=UTF-8\r\n");
fwrite($sock,"Connection: keep-alive\r\n");//Connection: keep-alive\r\n fwrite($sock, "\r\n");
fwrite($sock, $data);
/*
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
echo "\n";
*/
$body = "<h1>WISE 4012E</h1>Allumer LED0 <br>";
while (!feof($sock))
$body .= fgets($sock, 4096);
echo $body;
fclose($sock);
?>
6.2.2 eteindreLED0.php
<?php /*
il faut envoyer par PUT /do_value/slot_0/ch_0 ou PATCH si on envoie pas toutes les valeurs JSON Content-type: application/json {
"Ch":0, "Md":1, "Stat":1, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
Content-type: application/json {
"Ch":0, "Md":1, "Stat":0, "Val":0, "PsCtn":0, "PsStop":0, "PsIV": 0 }
*/
/* Envoi d'une requête PUT sur le serveur du WISE pour controler un relais
* */
$sock = fsockopen("192.168.1.1", 80, $errno, $errstr, 30);//ip,port,erreur,message erreur,timeout en seconde if (!$sock) die("$errstr ($errno)\n");
$data = '{"Ch":1,"Val":1}';//active le sortie relais ok testé
fwrite($sock, "PUT /do_value/slot_0/ch_1 HTTP/1.0\r\n");
fwrite($sock, "Host: 192.168.1.1\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock,"Authorization: Basic cm9vdDowMDAwMDAwMA==\r\n");
fwrite($sock, "Content-Length: " . strlen($data). "\r\n");
fwrite($sock,"Content-Type: text/plain;charset=UTF-8\r\n");
fwrite($sock,"Connection: keep-alive\r\n");//Connection: keep-alive\r\n fwrite($sock, "\r\n");
fwrite($sock, $data);
/*
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
echo "\n";
*/
$body = "<h1>WISE 4012E</h1> Allume LED1<br>";
echo $body;
fclose($sock);
?>
Pour le canal 1 : LED1 il suffit de modifier les lignes :
$data = '{"Ch":1,"Val":1}';//active le sortie relais ok testé et
fwrite($sock, "PUT /do_value/slot_0/ch_1 HTTP/1.0\r\n");
6.2.3 Conclusion essai1 : ok testé
7. COMPLÉMENT
A faire : lire les données analogiques et numériques et les afficher (utliser un GET)
Réunir tous dans une unique page.
8. CORRECTION COMPLÈTE
8.1. Le code de la page PHP à mettre sur le serveur
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Supervision avec WISE4012E</title>
</head>
<body>
<h1>WISE 4012E</h1><br>
<h2>Mesures des entrées analogiques AI0 et AI1 (ai_value/slot_0)</h2>
<?php
/* Envoi d'une requête PUT sur le serveur du WISE pour controler un relais
* */
$sock = fsockopen("192.168.1.1", 80, $errno, $errstr, 30);//ip,port,erreur,message erreur,timeout en seconde if (!$sock) die("$errstr ($errno)\n");
fwrite($sock, "GET /ai_value/slot_0 HTTP/1.0\r\n");
fwrite($sock, "Host: 192.168.1.1\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock,"Authorization: Basic cm9vdDowMDAwMDAwMA==\r\n");
fwrite($sock,"Content-Type: text/plain;charset=UTF-8\r\n");
fwrite($sock,"Connection: keep-alive\r\n");//Connection: keep-alive\r\n fwrite($sock, "\r\n");
while (!feof($sock))
$dataAI = fgets($sock, 4096);//recupère les données réponse de la requête (uniquement la dernière ligne (qui correspond au données utiles avant c'est l'entête
fclose($sock);
?>
<br>
Les mesures analogiques sont : <br>
<?php
//echo $dataAI.'<br>';
$parsed_dataAI=json_decode($dataAI);//decode les données en json //var_dump($parsed_dataAI);//affiche la variable
$valAI0 = $parsed_dataAI->{'AIVal'}[0]->{'Val'};
echo 'AI0 = '.$valAI0.'<br>';
$valAI0 = $parsed_dataAI->{'AIVal'}[1]->{'Val'};
echo 'AI1 = '.$valAI0.'<br>';
?>
<br>
<h2>Mesures des entrées numériques DI0 et DI1 (di_value/slot_0)</h2>
<?php
/* Envoi d'une requête PUT sur le serveur du WISE pour controler un relais
* */
$dataDI="";
$sock = fsockopen("192.168.1.1", 80, $errno, $errstr, 30);//ip,port,erreur,message erreur,timeout en seconde
if (!$sock) die("$errstr ($errno)\n");
fwrite($sock, "GET /di_value/slot_0 HTTP/1.0\r\n");
fwrite($sock, "Host: 192.168.1.1\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock,"Authorization: Basic cm9vdDowMDAwMDAwMA==\r\n");
fwrite($sock,"Content-Type: text/plain;charset=UTF-8\r\n");
fwrite($sock,"Connection: keep-alive\r\n");//Connection: keep-alive\r\n fwrite($sock, "\r\n");
while (!feof($sock))
$dataDI = fgets($sock, 4096);//recupere les données réponse fclose($sock);
?>
<br>
<br>
Les mesures entrées numériques sont : <br>
<?php
//echo $dataDI.'<br>';
$parsed_dataDI=json_decode($dataDI);//decode les données en json //var_dump($parsed_dataDI);//affiche la variable
$valDI = $parsed_dataDI->{'DIVal'}[0]->{'Val'};
echo 'DI0 = '.$valDI.'<br>';
$valDI = $parsed_dataDI->{'DIVal'}[1]->{'Val'};
echo 'DI1 = '.$valDI.'<br>';
?>
<h2>Controle des LEDs</h2>
<form method="get" action="allumerLED0.php" name="form_LED0ON">
<input name="valider" type="submit" value="Allumer LED0"><br>
</form>
<form method="get" action="eteindreLED0.php" name="form_LED0OFF">
<input name="valider" type="submit" value="Eteindre LED0"><br>
</form>
<form method="get" action="allumerLED1.php" name="form_LED1ON">
<input name="valider" type="submit" value="Allumer LED1"><br>
</form>
<form method="get" action="eteindreLED1.php" name="form_LED1OFF">
<input name="valider" type="submit" value="Eteindre LED1"><br>
</form>
</body>
</html>