Implémentation du périphérique BinaryLight
Ceci est un exemple de périphérique/service UPnP, implémentant les services BinaryLight et SwitchPower pour émuler une interruption de lumière.
L'interface utilisateur a été simplifiée afin de montrer les conceptes et les méthodes basiques.
Exemple #1 Implémentation d'un serveur lumineux
<?php
/* Définit la cible */
function set_target_cb($service, $action, $arg)
{
/* Récupère la nouvelle valeur cible */
$target = gupnp_service_action_get($action, 'NewTargetValue', GUPNP_TYPE_BOOLEAN);
/* Si la nouvelle cible ne correspond pas au statut courant, on modifie
le statut et nous émettons une notification de modification du statut. */
if ($target != $GLOBALS['status']) {
$GLOBALS['status'] = $target;
gupnp_service_notify($service, 'Status', GUPNP_TYPE_BOOLEAN, $GLOBALS['status']);
printf("The light is now %s.\n", $GLOBALS['status'] ? "on" : "off");
}
/* Retourne le succès de l'opération au client */
gupnp_service_action_return($action);
}
/* Récupère la cible */
function get_target_cb($service, $action, $arg)
{
gupnp_service_action_set($action, 'RetTargetValue', GUPNP_TYPE_BOOLEAN, $GLOBALS['status']);
gupnp_service_action_return($action);
}
/* Récupère le statut */
function get_status_cb($service, $action, $arg)
{
gupnp_service_action_set($action, 'ResultStatus', GUPNP_TYPE_BOOLEAN, $GLOBALS['status']);
gupnp_service_action_return($action);
}
/* Par défaut, la lumière est éteinte */
$GLOBALS['status'] = false;
printf("The light is now %s.\n", $GLOBALS['status'] ? "on" : "off");
/* Création du contexte UPnP */
$context = gupnp_context_new();
if (!$context) {
printf("Erreur lors de la création du contexte GUPnP\n");
exit(-1);
}
/* Héberge le dossier qui contient le fichier de description du périphérique et du service */
gupnp_context_host_path($context, "./web", "");
/* Crée un nouveau périphérique racine */
$location = "/BinaryLight.xml";
$dev = gupnp_root_device_new($context, $location);
gupnp_root_device_set_available($dev, true);
/* Récupère le service de modification de lumière depuis le périphérique racine */
$service_type = "urn:schemas-upnp-org:service:SwitchPower:1";
$service = gupnp_device_info_get_service($dev, $service_type);
if (!$service) {
die("Impossible de récupérer le service SwitchPower1\n");
}
/* Définit la fonction de rappel pour l'action GetStatus */
gupnp_device_action_callback_set($service, GUPNP_SIGNAL_ACTION_INVOKED, "GetStatus",
"get_status_cb", "action data, GetStatus");
/* Définit la fonction de rappel pour l'action GetTarget */
gupnp_device_action_callback_set($service, GUPNP_SIGNAL_ACTION_INVOKED, "GetTarget",
"get_target_cb", "action data, GetTarget");
/* Définit la fonction de rappel pour l'action SetTarget */
gupnp_device_action_callback_set($service, GUPNP_SIGNAL_ACTION_INVOKED, "SetTarget",
"set_target_cb", "action data, SetTarget");
/* Exécute la boucle principale */
gupnp_root_device_start($dev);
?>
Exemple #2 Implémentation du client lumineux
<?php
function service_proxy_available_cb($proxy, $arg)
{
$mode = $arg['mode'];
printf("Set subscribed\n");
gupnp_service_proxy_set_subscribed($proxy, true);
/* Ajout une notification si le statut a changé */
if (!gupnp_service_proxy_add_notify($proxy, "Status",
GUPNP_TYPE_BOOLEAN, "status_changed_cb", NULL)) {
printf("Echec de l'ajout de la notification\n");
}
if ($mode == 'TOGGLE') {
/* Nous basculons, aussi, en premier lieu, nous récupérons le statut courant */
$target = gupnp_service_proxy_action_get($proxy, 'GetStatus', 'ResultStatus', GUPNP_TYPE_BOOLEAN);
/* Et ensuite, nous basculons */
$target = ! $target;
} else {
/* Mode est un booléen, aussi, la cible est le mode que nous venons de choisir
enumeration values. */
$target = ($mode == 'ON') ? true : false;
}
/* Définit la cible */
if (!gupnp_service_proxy_action_set($proxy, 'SetTarget', 'NewTargetValue', $target, GUPNP_TYPE_BOOLEAN)) {
printf("Impossible de basculer\n");
} else {
printf("Set switch to %s.\n", $target ? "on" : "off");
}
/* Arrêt de la recherche */
gupnp_control_point_browse_stop($arg['cp']);
}
function status_changed_cb($variable, $value, $arg)
{
printf("Le statut a changé\n");
printf("\tvariable name: %s\n", $variable);
printf("\tvalue: %s\n", (int)$value);
printf("\n");
}
/* Vérifie et analyse les arguments de la ligne de commande */
if (count($argv) != 2) {
printf("Usage: light-client.php [on|off|toggle]\n");
exit(-1);
}
if ($argv[1] == "on") {
$mode = 'ON';
} elseif ($argv[1] == "off") {
$mode = 'OFF';
} elseif ($argv[1] == "toggle") {
$mode = 'TOGGLE';
} else {
usage ();
exit(-1);
}
/* Crée un contexte UPnP */
$context = gupnp_context_new();
if (!$context) {
printf("Erreur lors de la création du contexte GUPnP\n");
exit(-1);
}
/* Crée un point de contrôle, et cherche les services SwitchPower */
$cp = gupnp_control_point_new ($context,
"urn:schemas-upnp-org:service:SwitchPower:1");
/* Connexion à la fonction de rappel utilisée lorsque le service est trouvé */
$cb = "service_proxy_available_cb";
$arg = array('mode' => $mode, 'cp' => $cp);
gupnp_control_point_callback_set($cp, GUPNP_SIGNAL_SERVICE_PROXY_AVAILABLE, $cb, $arg);
/* Commence la recherche */
gupnp_control_point_browse_start($cp);
?>
Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-gupnp.binary-light.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.