node package manager

peer-upnp

Nodejs implementation of the UPnP Device Architecture 1.1

peer-upnp

peer-upnp is a Node.js module implementing the UPnP protocol as described in the UPnP Device Architecture specification

Setup

  • use npm install peer-upnp to install the module.
  • run binary light example:
    1. use node node_modules/peer-upnp/test/binary-light-device.js to create and advertise a UPnP BinaryLight Device with SwitchPower service
    2. use node node_modules/peer-upnp/test/binary-light-client.js that discovers BinaryLight devices and uses SwitchPower Service to control the light.
  • or run the other example using node node_modules/peer-upnp/test/upnp-test.js to discover UPnP services on the network.

Usage

The following example shows the discovery and binding process of UPnP devices and services.

var upnp = require("peer-upnp");
var http = require("http");
var server = http.createServer();
var PORT = 8080;
server.listen(PORT);
// Peer is an event emitter 
var peer = upnp.createPeer({
prefix: "/upnp",
server: server
}).on("ready",function(peer){
console.log("ready");
// listen to urn:schemas-upnp-org:service:SwitchPower:1 services 
peer.on("urn:schemas-upnp-org:service:SwitchPower:1",function(service){
console.log("service "+service.serviceType+" found");
service.on("disappear",function(service){
console.log("service "+service.serviceType+" disappeared");
});
// Bind to service to be able to call service actions 
service.bind(function(service){
// Call UPnP action SetTarget with parameter NewTargetValue 
service.SetTarget({
NewTargetValue: 1
},function(res){
console.log("Result",res);
});
}).on("event",function(data){
console.log((data.Status == "1" || data.Status == "true")? "Light is ON": "Light is OFF" );
});
// unsubscribe from the service after 10 seconds  
setTimeout(function(){
service.removeAllListeners("event");
},10000);
}).on("upnp:rootdevice",function(device){ // listen to root devices 
console.log("rootdevice "+device.deviceType+" found");
device.on("disappear",function(device){
console.log("rootdevice "+device.UDN+" disappeared");
});
});
// close peer after 30 seconds 
setTimeout(function(){
peer.close();
},30000);
}).on("close",function(){
console.log("closed");
});

The following example shows how to create and advertise a BinaryLight device and with a SwitchPower service as specified in UPnP Lighting Controls V 1.0. Please refer to the documentation in the code.

var upnp = require("peer-upnp");
var http = require("http");
var server = http.createServer();
var PORT = 8080;
// start server on port 8080. please do this step before you create a peer 
server.listen(PORT);
 
// Create a UPnP Peer.  
var peer = upnp.createPeer({
prefix: "/upnp",
server: server
}).on("ready",function(peer){
console.log("ready");
// advertise device after peer is ready 
device.advertise();
}).on("close",function(peer){
console.log("closed");
}).start();
 
// Create a BinaryLight device as specified in UPnP http://upnp.org/specs/ha/UPnP-ha-BinaryLight-v1-Device.pdf.   
// Please refer for device configuration parameters to the UPnP device architecture. 
var device = peer.createDevice({
autoAdvertise: false,
uuid: "6bd5eabd-b7c8-4f7b-ae6c-a30ccdeb5988",
productName: "Coltram",
productVersion: "0.0.1",
domain: "schemas-upnp-org",
type: "BinaryLight",
version: "1",
friendlyName: "BinaryLight",
manufacturer: "Fraunhofer FOKUS",
manufacturerURL: "http://www.fokus.fraunhofer.de",
modelName: "BinaryLight",
modelDescription: "BinaryLight",
modelNumber: "0.0.1",
modelURL: "http://www.famium.org",
serialNumber: "1234-1234-1234-1234",
UPC: "123456789012"
});
 
// create a SwitchPower service in the BinaryLight device as specified here http://upnp.org/specs/ha/UPnP-ha-SwitchPower-v1-Service.pdf 
var service = device.createService({
domain: "schemas-upnp-org",
type: "SwitchPower",
version: "1",
// Service Implementation 
implementation: {
GetTargetfunction(inputs){
// the result is the value of the state variable Target 
return {RetTargetValue: this.get("Target")}
},
SetTargetfunction(inputs){
// set the new value of the state variable Target 
this.set("Target", inputs.NewTargetValue); 
// notify state change of the state variable to all subscribers 
this.notify("Target");
this.get("Target") == "1"? console.log("Light is ON"):console.log("Light is OFF");
},
GetStatusfunction(inputs){
// the result is the value of the state variable Target 
return {ResultStatus: this.get("Target")}
},
},
// Service Description. this will be converted to XML  
description: {
actions: {
GetTarget: {
outputs: {
RetTargetValue: "Target", // Target is the name of the state variable 
}
},
SetTarget: {
inputs: {
NewTargetValue: "Target"
}
},
GetStatus: {
outputs: {
ResultStatus: "Status",
}
}
},
// declare all state variables: key is the name of the variable and value is the type of the variable.  
// type can be JSON object in this form {type: "boolean"}.  
variables: {
Target: "boolean", 
Status: "boolean"
}
}
});
// initialize the Target State Variable with 0 
service.set("Target",0);

License

Free for non commercial use released under the GNU Lesser General Public License v3.0, See LICENSE file.

Contact us for commecial use famecontact@fokus.fraunhofer.de

Copyright (c) 2013 Fraunhofer FOKUS