| by SuperBonBon |
|
Communicating with the device
Messaging > State variable
Messaging
Once you have discovered a device you can start to play with it and send messages. An UPNP root device is made of several UPNPDevice objects ( child devices ) which are containing UPNPService. The services object contains all the available operations and state variables names :
UPNPRootDevice rootDevice = net.sbbi.upnp.Discovery.discover()[0];
//let's look at the root device child devices
List childDevices = rootDevice.getChildDevices();
if ( childDevices != null ) {
for ( Iterator i = childDevices.iterator(); i.hasNext(); ) {
UPNPDevice child = (UPNPDevice)i.next();
System.out.println( "Reaching child device " + child.getUDN() );
// now let's look a the child device services
for ( Iterator i2 = child.getServices().iterator(); i2.hasNext(); ) {
UPNPService service = (UPNPService)i2.next();
System.out.println( "Reaching child device service id " + service.getServiceId() );
}
}
}
You can also look for child devices directly using a specific device URI for example let's lookup an IGD WANDevice:
String dvURN = "upnp:schemas-upnp-org:device:WANDevice:1";
UPNPDevice myIGDWANDevice = IGDRootDevice.getChildDevice( dvURN );
if ( myIGDWANDevice != null ) {
System.out.println( "IGD WAN device " + myIGDWANDevice.getUDN() );
}
Finally you need to lookup a specific device service to start to interact with the device :
String dvURN = "upnp:schemas-upnp-org:device:WANDevice:1";
UPNPDevice myIGDWANDevice = IGDRootDevice.getChildDevice( dvURN );
if ( myIGDWANDevice != null ) {
System.out.println( "IGD WAN device " + myIGDWANDevice.getUDN() );
String srvURN = "upnp:schemas-upnp-org:service:WANIpConnection:1";
UPNPService WANIpConnectionSrv = myIGDWANDevice.getService( srvURN );
if ( WANIpConnectionSrv != null ) {
System.out.println( "IGD WAN device WANIpConnection service " +
WANIpConnectionSrv.getServiceId() );
}
}
The last step to start to give orders to the UPNP device is to create an ActionMessage object for a given service action name using an UPNPMessageFactory. The action message names, input and output argument are specified in the UPNP service specs or can be retreived with the UPNPService object :
String srvURN = "upnp:schemas-upnp-org:service:WANIpConnection:1";
UPNPService WANIpConnectionSrv = myIGDWANDevice.getService( srvURN );
if ( WANIpConnectionSrv != null ) {
System.out.println( "IGD WAN device WANIpConnection service " +
WANIpConnectionSrv.getServiceId() );
UPNPMessageFactory factory = UPNPMessageFactory.getNewInstance( WANIpConnectionSrv );
// let's try to retreive information concerning a
// mapping entry on the UPNP router device. All the action names and arguments
// used here are taken from the IGD specs available at http://www.upnp.org
ActionMessage action = factory.getMessage( "GetSpecificPortMappingEntry" );
// can return null if the action does not exists for the given service
// or is not mandatory in the UPNP device specs.
if ( action != null ) {
// setting the input params
action.setInputParameter( "NewRemoteHost", "" )
.setInputParameter( "NewExternalPort", 21 )
.setInputParameter( "NewProtocol", "TCP" );
try {
// let's invoke the action on the device
// and retreive a response
ActionResponse resp = action.service();
System.out.println( "Mapping found" );
System.out.println( resp.getOutActionArgumentValue( "NewInternalPort" ) );
System.out.println( resp.getOutActionArgumentValue( "NewInternalClient" ) );
System.out.println( resp.getOutActionArgumentValue( "NewEnabled" ) );
System.out.println( resp.getOutActionArgumentValue( "NewPortMappingDescription" ) );
System.out.println( resp.getOutActionArgumentValue( "NewLeaseDuration" ) );
} catch ( UPNPResponseException respEx ) {
// the device responded with an error for example no mapping
// existing the code returned are defined in the device specs
if ( respEx.getDetailErrorCode().equals( "714" ) ) {
// no entry matching according to the specs when code 714
// is returned by the device
} else {
// DOH ! looks like a real error !
}
} catch ( IOException ioEx ) {
// look like a communication problem occured with the device
}
}
}
State variable
You can also retreive the content of a state variable on the device using one more time a message factory to create an StateVariableMessage object for the desired state variable query :
String srvURN = "upnp:schemas-upnp-org:service:WANIpConnection:1";
UPNPService WANIpConnectionSrv = myIGDWANDevice.getService( srvURN );
if ( WANIpConnectionSrv != null ) {
System.out.println( "IGD WAN device WANIpConnection service " +
WANIpConnectionSrv.getServiceId() );
UPNPMessageFactory factory = UPNPMessageFactory.getNewInstance( WANIpConnectionSrv );
// let's try to retreive the content of the LastConnectionError WANIpConnection
// service state variable
StateVariableMessage stateVarMsg = factory.getStateVariableMessage( "LastConnectionError" );
try {
StateVariableResponse resp = stateVarMsg.service();
System.out.println( "LastConnectionError device state variable value is :" +
resp.getStateVariableValue() );
} catch ( UPNPResponseException respEx ) {
if ( respEx.getDetailErrorCode().equals( "404" ) ) {
// devices that do not implement state variables query
// respond with a 404 error code
} else {
// DOH ! we have some unknown error
}
} catch ( IOException ioEx ) {
// look like a communication problem occured with the device
}
}






