Cette semaine, on va parler de notre librairie PHP, des callbacks HTTP et de VirtualHub for Web. Et en particulier comment mixer les trois.
Nous avons déjà écrit plusieurs articles sur les callbacks HTTP et la librairie PHP. Pour rappel, ce mode de fonctionnement permet de réaliser des applications accessibles partout sur internet et de s'affranchir des problèmes de NAT. Nous avons, par exemple, vu comment afficher les rendez-vous de la journée sur Yocto-MaxiDisplay ou comment contrôler à distance le chauffage d'un chalet.
Le mode callback HTTP et la librairie PHP permettent de réaliser presque n'importe quelle application, mais il ne s'agit pas d'une solution clef en main. C'est au client de développer sa propre application.
Il a quelques mois, nous avons publié un nouvel outil, VirtualHub for Web, qui permet d'accéder à distance aux modules. Les fonctionnalités sont les mêmes que pour la version native de VirtualHub avec quelques limitations. Concrètement, VirtualHub for Web est une application que nous avons écrite en utilisant la librairie PHP et le mode callback HTTP.
Nous allons voir comment réaliser un système qui utilise à la fois VirtualHub for Web et une application PHP qui utilise un callback HTTP.
Utiliser le callback HTTP et VirtualHub for Web
Pour des raisons techniques, les YoctoHubs ne peuvent se connecter qu'à un seul callback HTTP. Il faut donc configurer le YoctoHub pour qu'il se connecte au callback HTTP de l'application. Puis utiliser la fonction YAPI::ForwardHTTPCallback pour passer la main à VirtualHub for Web.
La méthode YAPI::ForwardHTTPCallback permet de passer la main à VirtualHub for Web
L'exemple de l'article Utiliser le mode callback HTTP en PHP qui commute un relai en fonction de la température ambiante, peut être modifié pour que l'on puisse utiliser en parallèle VirtualHub for Web.
Pour ce faire, il faut ajouter un appel à la méthode YAPI::ForwardHTTPCallback en lui passant en argument l'URL que l'on configurerait normalement sur le YoctoHub. Par exemple si notre VirtualHub for Web est installé sur http://www.example.com/VHu4Web/ le paramètre est "http://www.example.com/VHu4Web/HTTPCallback".
Voici ce code du callback HTTP avec la redirection vers VirtualHub for Web.
include('Sources/yocto_api.php');
include('Sources/yocto_temperature.php');
include('Sources/yocto_relay.php');
YAPI::RegisterHub("callback");
YAPI::ForwardHTTPCallback("http://www.example.com/VHu4Web/HTTPCallback");
$t = YTemperature::FirstTemperature();
if (is_null($t)){
die("No temperature sensor found");
}
$r = YRelay::FirstRelay();
if (is_null($r)) {
die("No temperature sensor found");
}
$value = $t->get_currentValue();
if ($value>25)
$r->set_state(YRelay::STATE_B);
if ($value<24)
$r->set_state(YRelay::STATE_A);
Print("temperature = $value\n");
YAPI::FreeAPI();
?>
Notez, l'appel à YAPI::ForwardHTTPCallback est exécuté avant la partie du code qui commute le relai en fonction de la température. Cela veut dire que le code du script va overrider les potentielles commandes que VirtualHub for Web a envoyées. Dans ce cas précis, il ne sera pas possible de changer l'état du relai par le biais de VirtualHub for Web.
Si l'on veut que VirtualHub for Web soit prioritaire, il faut l'appeler en dernier:
include('Sources/yocto_api.php');
include('Sources/yocto_temperature.php');
include('Sources/yocto_relay.php');
YAPI::RegisterHub("callback");
$t = YTemperature::FirstTemperature();
if (is_null($t)){
die("No temperature sensor found");
}
$r = YRelay::FirstRelay();
if (is_null($r)) {
die("No temperature sensor found");
}
$value = $t->get_currentValue();
if ($value>25)
$r->set_state(YRelay::STATE_B);
if ($value<24)
$r->set_state(YRelay::STATE_A);
Print("temperature = $value\n");
YAPI::ForwardHTTPCallback("http://www.example.com/VHu4Web/HTTPCallback");
YAPI::FreeAPI();
Les deux solutions sont correctes. En fonction des cas, on préfèrera donner la priorité à VirtualHub for Web ou au script PHP.
Signature MD5
Comme le script retransmet les mêmes données à VirtualHub for Web, le mot de passe utilisé pour la signature MD5 doit être le même partout. Le YoctoHub, le script PHP et VirtualHub for web doivent utiliser la même signature MD5
La signature MD5 du YoctoHub
YAPI::RegisterHub("md5:mypass@callback");
YAPI::ForwardHTTPCallback("http://www.example.com/VHu4Web/HTTPCallback");
...
La signature MD5 du VirtualHub for Web doit être identique
HTTPS
La méthode YAPI::ForwardHTTPCallback supporte le protocole HTTPS.
Il faut toutefois que PHP autorise les connexions sortantes et que les certificats soient configurés. En fonction des installations et de votre serveur web, il sera peut-être nécessaire de modifier votre fichier php.ini.
Conclusion
Comme vous venez de le voir, il est possible d'utiliser VirtualHub for Web en parallèle de vos scripts PHP. Cette fonctionnalité est très intéressante pour modifier quelques paramètres des modules à distance sans devoir ajouter du code au script PHP. Dans notre exemple, cela permet de consulter les températures mini et maxi sans avoir à modifier le code.