NAME
UPnP::ControlPoint - A UPnP ControlPoint implementation.
SYNOPSIS
use UPnP::ControlPoint;
my $cp = UPnP::ControlPoint->new;
my $search = $cp->searchByType("urn:schemas-upnp-org:device:TestDevice:1",
\&callback);
$cp->handle;
sub callback {
my ($search, $device, $action) = @_;
if ($action eq 'deviceAdded') {
print("Device: " . $device->friendlyName . " added. Device contains:\n");
for my $service ($device->services) {
print("\tService: " . $service->serviceType . "\n");
}
}
elsif ($action eq 'deviceRemoved') {
print("Device: " . $device->friendlyName . " removed\n");
}
}
DESCRIPTION
Implements a UPnP ControlPoint. This module implements the various aspects of the UPnP architecture from the standpoint of a ControlPoint:
- 1. Discovery
-
A ControlPoint can be used to actively search for devices and services on a local network or listen for announcements as devices enter and leave the network. The protocol used for discovery is the Simple Service Discovery Protocol (SSDP).
- 2. Description
-
A ControlPoint can get information describing devices and services. Devices can be queried for services and vendor-specific information. Services can be queried for actions and state variables.
- 3. Control
-
A ControlPoint can invoke actions on services and poll for state variable values. Control-related calls are generally made using the Simple Object Access Protocol (SOAP).
- 4. Eventing
-
ControlPoints can listen for events describing state changes in devices and services. Subscription requests and state change events are generally sent using the General Event Notification Architecture (GENA).
Since the UPnP architecture leverages several existing protocols such as TCP, UDP, HTTP and SOAP, this module requires several Perl modules that implement these protocols. These include IO::Socket::INET, LWP::UserAgent, HTTP::Daemon and SOAP::Lite (http://www.soaplite.com).
METHODS
UPnP::ControlPoint
A ControlPoint implementor will generally create a single instance of the UPnP::ControlPoint class (though more than one can exist within a process assuming that they have been set up to avoid port conflicts).
- new ( [ARGS] )
-
Creates a
UPnP::ControlPointobject. Accepts the following key-value pairs as optional arguments (default values are listed below):SearchPort Port on which search requests are received 8008 SubscriptionPort Port on which event notification are received 8058 SubscriptionURL URL on which event notification are received /eventSub MaxWait Max wait before search responses should be sent 3While this call creates the sockets necessary for the ControlPoint to function, the ControlPoint is not active until its sockets are actually serviced, either by invoking the
handlemethod or by externally selecting using the ControlPoint'ssocketsand invoking thehandleOncemethod as each becomes ready for reading. - sockets
-
Returns a list of sockets that need to be serviced for the ControlPoint to correctly function. This method is generally used in conjunction with the
handleOncemethod by users who want to run their ownselectloop. This list of sockets should be selected for reading andhandleOnceis invoked for each socket as it beoms ready for reading. - handleOnce ( SOCKET )
-
Handles the function of reading from a ControlPoint socket when it is ready (as indicated by a
select). This method is used by developers who want to run their ownselectloop. - handle
-
Takes over handling of all ControlPoint sockets. Runs its own
selectloop, handling individual sockets as they become available for reading. Returns only when a call tostopHandlingis made (generally from a ControlPoint callback or a signal handler). This method is an alternative to using thesocketsandhandleOncemethods. - stopHandling
-
Ends the
selectloop run byhandle. This method is generally invoked from a ControlPoint callback or a signal handler. - searchByType ( TYPE, CALLBACK )
-
Used to start a search for devices on the local network by device or service type. The
TYPEparameter is a string inidicating a device or service type. Specifically, it is the string that will be put into theSTheader of the SSDPM-SEARCHrequest that is sent out. TheCALLBACKparameter is a code reference to a callback that is invoked when a device matching the search criterion is found (or a SSDP announcement is received that such a device is entering or leaving the network). This method returns aUPnP::ControlPoint::Searchobject.The arguments to the
CALLBACKare the search object, the device that has been found or newly added to or removed from the network, and an action string which is one of 'deviceAdded' or 'deviceRemoved'. The callback is invoked separately for each device that matches the search criterion.sub callback { my ($search, $device, $action) = @_; if ($action eq 'deviceAdded') { print("Device: " . $device->friendlyName . " added.\n"); } elsif ($action eq 'deviceRemoved') { print("Device: " . $device->friendlyName . " removed\n"); } } - searchByUDN ( UDN, CALLBACK )
-
Used to start a search for devices on the local network by Unique Device Name (UDN). Similar to
searchByType, this method sends out a SSDPM-SEARCHrequest with aSTheader ofupnp:rootdevice. All responses to the search (and subsequent SSDP announcements to the network) are filtered by theUDNparameter before resulting inCALLBACKinvocation. The parameters to the callback are the same as described insearchByType. - searchByFriendlyName ( NAME, CALLBACK )
-
Used to start a search for devices on the local network by device friendy name. Similar to
searchByType, this method sends out a SSDPM-SEARCHrequest with aSTheader ofupnp:rootdevice. All responses to the search (and subsequent SSDP announcements to the network) are filtered by theNAMEparameter before resulting inCALLBACKinvocation. The parameters to the callback are the same as described insearchByType. - stopSearch ( SEARCH )
-
The
SEARCHparameter is aUPnP::ControlPoint::Searchobject returned by one of the search methods. This method stops forwarding SSDP events that match the search criteria of the specified search.
UPnP::ControlPoint::Device
A UPnP::ControlPoint::Device is generally obtained using one of the UPnP::ControlPoint search methods and should not be directly instantiated.
- deviceType
- friendlyName
- manufacturer
- manufacturerURL
- modelDescription
- modelName
- modelNumber
- modelURL
- serialNumber
- UDN
- presentationURL
- UPC
-
Properties received from the device's description document. The returned values are all strings.
- location
-
A URI representing the location of the device on the network.
- parent
-
The parent device of this device. The value
undefif this device is a root device. - children
-
A list of child devices. The empty list if the device has no children.
- services
-
A list of
UPnP::ControlPoint::Serviceobjects corresponding to the services implemented by this device. - getService ( ID )
-
If the device implements a service whose serviceType or serviceId is equal to the
IDparameter, the correspondingUPnP::ControlPoint::Serviceobject is returned. Otherwise returnsundef.
UPnP::ControlPoint::Service
A UPnP::ControlPoint::Service is generally obtained from a UPnP::ControlPoint::Device object using the services or getServiceById methods. This class should not be directly instantiated.
- serviceType
- serviceId
- SCPDURL
- controlURL
- eventSubURL
-
Properties corresponding to the service received from the containing device's description document. The returned values are all strings except for the URL properties, which are absolute URIs.
- actions
-
A list of
UPnP::Common::Actionobjects corresponding to the actions implemented by this service. - getAction ( NAME )
-
Returns the
UPnP::Common::Actionobject corresponding to the action specified by theNAMEparameter. Returnsundefif no such action exists. - stateVariables
-
A list of
UPnP::Common::StateVariableobjects corresponding to the state variables implemented by this service. - getStateVariable ( NAME )
-
Returns the
UPnP::Common::StateVariableobject corresponding to the state variable specified by theNAMEparameter. Returnsundefif no such state variable exists. - controlProxy
-
Returns a
UPnP::ControlPoint::ControlProxyobject that can be used to invoke actions on the service. - queryStateVariable ( NAME )
-
Generates a SOAP call to the remote service to query the value of the state variable specified by
NAME. Returns the value of the variable. Returnsundefif no such state variable exists or the variable is not evented. - subscribe ( CALLBACK )
-
Registers an event subscription with the remote service. The code reference specied by the
CALLBACKparameter is invoked when GENA events are received from the service. This call returns aUPnP::ControlPoint::Subscriptionobject corresponding to the subscription. The subscription can later be canceled using theunsubscribemethod. The parameters to the callback are the service object and a list of name-value pairs for all of the state variables whose values are included in the corresponding GENA event:sub eventCallback { my ($service, %properties) = @_; print("Event received for service " . $service->serviceId . "\n"); while (my ($key, $val) = each %properties) { print("\tProperty ${key}'s value is " . $val . "\n"); } } - unsubscribe ( SUBSCRIPTION )
-
Unsubscribe from a service. This method takes the "UPnP::ControlPoint::Subscription" object returned from a previous call to
subscribe. This method is equivalent to calling theunsubscribemethod on the subscription object itself and is included for symmetry and convenience.
UPnP::Common::Action
A UPnP::Common::Action is generally obtained from a UPnP::ControlPoint::Service object using its actions or getAction methods. It corresponds to an action implemented by the service. Action information is retrieved from the service's description document. This class should not be directly instantiated.
- name
-
The name of the action returned as a string.
- retval
-
A
UPnP::Common::Argumentobject that corresponds to the action argument that is specified in the service description document as the return value for this action. Returnsundefif there is no specified return value. - arguments
-
A list of
UPnP::Common::Argumentobjects corresponding to the arguments of the action. - inArguments
-
A list of
UPnP::Common::Argumentobjects corresponding to the input arguments of the action. - outArguments
-
A list of
UPnP::Common::Argumentobjects corresponding to the output arguments of the action.
UPnP::Common::Argument
A UPnP::Common::Argument is generally obtained from a UPnP::Common::Action object using its arguments, inArguments or outArguments methods. An instance of this class corresponds to an argument of a service action, as specified in the service's description document. This class should not be directly instantiated.
- name
-
The name of the argument returned as a string.
-
The name of the related state variable (which can be used to find the type of the argument) returned as a string.
UPnP::Common::StateVariable
A UPnP::Common::StateVariable is generally obtained from a UPnP::ControlPoint::Service object using its stateVariables or getStateVariable methods. It corresponds to a state variable implemented by the service. State variable information is retrieved from the service's description document. This class should not be directly instantiated.
- name
-
The name of the state variable returned as a string.
- evented
-
Whether the state variable is evented or not.
- type
-
The listed UPnP type of the state variable returned as a string.
- SOAPType
-
The corresponding SOAP type of the state variable returned as a string.
UPnP::ControlPoint::ControlProxy
A proxy that can be used to invoke actions on a UPnP service. An instance of this class is generally obtained from the controlProxy method of the corresponding UPnP::ControlPoint::Service object. This class should not be directly instantiated.
An instance of this class is a wrapper on a SOAP::Lite proxy. An action is invoked as if it were a method of the proxy object. Parameters to the action should be passed to the method. They will automatically be coerced to the correct type. For example, to invoke the Browse method on a UPnP ContentDirectory service to get the children of the root directory, one would say:
my $proxy = $service->controlProxy;
my $result = $proxy->Browse('0', 'BrowseDirectChildren', '*', 0, 0, "");
The result of a action invocation is an instance of the UPnP::ControlPoint::ActionResult class.
UPnP::ControlPoint::ActionResult
An instance of this class is returned from an action invocation made through a UPnP::ControlPoint::ControlProxy object. It is a loose wrapper on the SOAP::SOM object returned from the call made through the SOAP::Lite module. All methods not recognized by this class will be forwarded directly to the SOAP::SOM class. This class should not be directly instantiated.
- isSuccessful
-
Was the invocation successful or did it result in a fault.
- getValue ( NAME )
-
Gets the value of an out argument of the action invocation. The
NAMEparameter specifies which out argument value should be returned. The type of the returned value depends on the type specified in the service description file.
UPnP::ControlPoint::Search
A UPnP::ControlPoint::Search object is returned from any successful calls to the UPnP::ControlPoint search methods. It has no methods of its own, but can be used as a token to pass to any subsequent stopSearch calls. This class should not be directly instantiated.
UPnP::ControlPoint::Subscription
A UPnP::ControlPoint::Search object is returned from any successful calls to the UPnP::ControlPoint::Service subscribe method. This class should not be directly instantiated.
- SID
-
The subscription ID returned from the remote service, returned as a string.
- timeout
-
The timeout value returned from the remote service, returned as a number.
- expired
-
Has the subscription expired yet?
- renew
-
Renews a subscription with the remote service by sending a GENA subscription event.
- unsubscribe
-
Unsubscribes from the remote service by sending a GENA unsubscription event.
SEE ALSO
UPnP documentation and resources can be found at http://www.upnp.org.
The SOAP::Lite module can be found at http://www.soaplite.com.
UPnP ControlPoint implementations in other languages include the UPnP SDK for Linux (http://upnp.sourceforge.net/), Cyberlink for Java (http://www.cybergarage.org/net/upnp/java/index.html) and C++ (http://sourceforge.net/projects/clinkcc/), and the Microsoft UPnP SDK (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/upnp/upnp/universal_plug_and_play_start_page.asp).
AUTHOR
Vidur Apparao (vidurapparao@users.sourceforge.net)
COPYRIGHT AND LICENSE
Copyright (C) 2004-2005 by Vidur Apparao
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8 or, at your option, any later version of Perl 5 you may have available.