gupnp-php-binary-light-7

  • Examples
  • Implementing the BinaryLight device

  • Implementing the BinaryLight device
  • Implementing the BinaryLight device

    Implementing the BinaryLight device

    This is an example of UPnP device/service,
    implementing the BinaryLight device and SwitchPower services to
    emulate a light switch.

    The user interface was purposely simplified in
    order to show basic concepts and methods.

    Example #1 Implementing light server

    <?php

    /* SetTarget */
    function set_target_cb($service$action$arg)
    {
        
    /* Get the new target value */
        
    $target gupnp_service_action_get($action'NewTargetValue'GUPNP_TYPE_BOOLEAN);

        /* If the new target doesn't match the current status, change the status and
           emit a notification that the status has changed. */
        
    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");
        }

        /* Return success to the client */
        
    gupnp_service_action_return($action);
    }

    /* GetTarget */
    function get_target_cb($service$action$arg)
    {
        
    gupnp_service_action_set($action'RetTargetValue'GUPNP_TYPE_BOOLEAN$GLOBALS['status']);
        
    gupnp_service_action_return($action);
    }

    /* GetStatus */
    function get_status_cb($service$action$arg)
    {
        
    gupnp_service_action_set($action'ResultStatus'GUPNP_TYPE_BOOLEAN$GLOBALS['status']);
        
    gupnp_service_action_return($action);
    }

    /* By default the light is off */
    $GLOBALS['status'] = false;
    printf("The light is now %s.\n"$GLOBALS['status'] ? "on" "off");

    /* Create the UPnP context */
    $context gupnp_context_new();
    if (!
    $context) {
        
    printf("Error creating the GUPnP context\n");
        exit(-
    1);
    }

    /* Host the directory that contains device and service description files */
    gupnp_context_host_path($context"./web""");

    /* Create root device */
    $location "/BinaryLight.xml";
    $dev gupnp_root_device_new($context$location);
    gupnp_root_device_set_available($devtrue);

    /* Get the switch service from the root device */
    $service_type "urn:schemas-upnp-org:service:SwitchPower:1";
    $service gupnp_device_info_get_service($dev$service_type);
    if (!
    $service) {
        die(
    "Cannot get SwitchPower1 service\n");
    }

    /* Set callback for action GetStatus */
    gupnp_device_action_callback_set($serviceGUPNP_SIGNAL_ACTION_INVOKED"GetStatus"
        
    "get_status_cb""action data, GetStatus");

    /* Set callback for action GetTarget */
    gupnp_device_action_callback_set($serviceGUPNP_SIGNAL_ACTION_INVOKED"GetTarget"
        
    "get_target_cb""action data, GetTarget");

    /* Set callback for action SetTarget */
    gupnp_device_action_callback_set($serviceGUPNP_SIGNAL_ACTION_INVOKED"SetTarget"
        
    "set_target_cb""action data, SetTarget");

    /* Run the main loop */
    gupnp_root_device_start($dev);

    ?>

    Example #2 Implementing light client

    <?php

    function service_proxy_available_cb($proxy$arg)
    {
        
    $mode $arg['mode'];

        printf("Set subscribed\n");
        
    gupnp_service_proxy_set_subscribed($proxytrue);

        /* Add notify if status will be changed */
        
    if (!gupnp_service_proxy_add_notify($proxy"Status"
                
    GUPNP_TYPE_BOOLEAN"status_changed_cb"NULL)) {
            
    printf("Failed to add notify\n");
        }
        
        if (
    $mode == 'TOGGLE') {
            
    /* We're toggling, so first fetch the current status */
            
    $target gupnp_service_proxy_action_get($proxy'GetStatus''ResultStatus'GUPNP_TYPE_BOOLEAN);

            /* And then toggle it */
            
    $target = ! $target;
        } else {
            
    /* Mode is a boolean, so the target is the mode thanks to our well chosen
               enumeration values. */
            
    $target = ($mode == 'ON') ? true false;
        }

        /* Set the target */
        
    if (!gupnp_service_proxy_action_set($proxy'SetTarget''NewTargetValue'$targetGUPNP_TYPE_BOOLEAN)) {
            
    printf("Cannot set switch\n");
        } else {
            
    printf("Set switch to %s.\n"$target "on" "off");
        }
        
        
    /* Stop browsing */
        
    gupnp_control_point_browse_stop($arg['cp']);
    }

    function status_changed_cb($variable$value$arg)
    {
        
    printf("Status has been changed\n");
        
    printf("\tvariable name: %s\n"$variable);
        
    printf("\tvalue: %s\n", (int)$value);
        
    printf("\n");
    }

    /* Check and parse command line arguments */
    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);
    }

    /* Create the UPnP context */
    $context gupnp_context_new();
    if (!
    $context) {
        
    printf("Error creating the GUPnP context\n");
        exit(-
    1);
    }

    /* Create the control point, searching for SwitchPower services */
    $cp gupnp_control_point_new ($context,
            
    "urn:schemas-upnp-org:service:SwitchPower:1");

    /* Connect to the service-found callback */
    $cb "service_proxy_available_cb";
    $arg = array('mode' => $mode'cp' => $cp);
    gupnp_control_point_callback_set($cpGUPNP_SIGNAL_SERVICE_PROXY_AVAILABLE$cb$arg);

    /* Start for browsing */
    gupnp_control_point_browse_start($cp);

    ?>