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