ok I will take a look later.
another question, the devices are all exported devices running on the
same felix platform with the listener routine too, aren't?
In this case the BaseDriver is not involved in the delivery of the
UPnPNotifyEvents.
So the bug should be either in the UPnPEventNotifier or in your code.
francesco
Daniel Felsing wrote:
Yes i'm using them in every exported device type...
Wait - i paste you some code of a whole device type implementation :-)
Note that there is also a upnpdimmabledevice which is reusing the status
things of switchabledevice
It just provides an additional level....my class hierarchy of my own
basedriver is also built like that - so i could reduce "copy paste" code
Ok every upnp device is extending my upnp general device:
public abstract class UPnPGeneralDevice {
// device identifiers
final protected String DEVICE_ID_PREFIX = "uuid:AT-SM-";
protected String DEVICE_ID;
// model and context
protected BundleContext context;
// device category and description
protected String deviceCat;
protected String description;
protected String hubId;
protected String identity;
// localhost information
protected String ipAddress;
protected String portNumber;
// path to presentation servlet
protected String presServlet;
// device properties
protected Dictionary devprops;
public void generateHostInfo() {
try {
Enumeration interfaces =
NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface =
(NetworkInterface)interfaces.nextElement();
Enumeration addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress inetAddress =
(InetAddress)addresses.nextElement();
// ignore loopback ip
if (!inetAddress.isLoopbackAddress() &&
!inetAddress.isLinkLocalAddress()) {
this.ipAddress = inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
this.portNumber = "80";
if(context.getProperty("org.osgi.service.http.port") !=
null) {
this.portNumber =
context.getProperty("org.osgi.service.http.port");
}
}
public void setupProperties() {
devprops = new Properties();
// indicate for UPnP Export and set proper device category
devprops.put(UPnPDevice.UPNP_EXPORT,"");
devprops.put(org.osgi.service.device.Constants.DEVICE_CATEGORY, new
String[]{UPnPDevice.DEVICE_CATEGORY});
// device specific properties
devprops.put(UPnPDevice.FRIENDLY_NAME, deviceCat);
devprops.put(UPnPDevice.MANUFACTURER, "Daniel Felsing");
devprops.put(UPnPDevice.MANUFACTURER_URL,
"http://www.maven.at");
devprops.put(UPnPDevice.MODEL_DESCRIPTION, description);
devprops.put(UPnPDevice.MODEL_NAME, deviceCat);
devprops.put(UPnPDevice.MODEL_NUMBER,"2.0");
if (this.ipAddress != null && this.portNumber != null &&
this.presServlet != null) {
devprops.put(UPnPDevice.PRESENTATION_URL,"http://" +
this.ipAddress + ":" + this.portNumber + presServlet + "?identity=" +
identity);
}
//dictionary.put(UPnPDevice.SERIAL_NUMBER,"123456789");
devprops.put(UPnPDevice.TYPE,"urn:schemas-upnp-org:device:"
+ deviceCat + ":1");
devprops.put(UPnPDevice.ID, DEVICE_ID);
devprops.put(UPnPDevice.UPC,"SMARTHOME_" +
hubId.toUpperCase() + "_" + deviceCat.toUpperCase());
}
public Dictionary getDevprops() {
return devprops;
}
public void setDevprops(Dictionary devprops) {
this.devprops = devprops;
}
}
My switchabledevice (e.g. a plug or a light)
public class UPnPSwitchableDevice extends UPnPGeneralDevice implements
UPnPDevice, Destroyable {
// upnp services
private SwitchableDevSwitchService switchdevswitchservice;
private GeneralDevNameService switchdevnameservice;
private UPnPService[] upnpservices;
// event notifier
private UPnPEventNotifier notify_switch;
// device
private SwitchableDevice switchDev;
public UPnPSwitchableDevice(SwitchableDevice switchDev,
BundleContext context, String hubId, String deviceCat, String description,
String presServlet) {
super();
this.switchDev = switchDev;
this.context = context;
this.presServlet = presServlet;
this.deviceCat = deviceCat;
this.description = description;
this.hubId = hubId;
this.identity = switchDev.getIdentity();
if(hubId != null) {
this.DEVICE_ID = DEVICE_ID_PREFIX + hubId + "-" +
switchDev.getIdentity();
} else {
this.DEVICE_ID = DEVICE_ID_PREFIX +
switchDev.getIdentity();
}
// create services of the device
this.switchdevswitchservice = new
SwitchableDevSwitchService(switchDev);
this.switchdevnameservice = new
GeneralDevNameService(switchDev, hubId);
this.upnpservices = new UPnPService[]{switchdevnameservice,
switchdevswitchservice};
this.generateHostInfo();
this.setupProperties();
// setup event notifier
notify_switch = new UPnPEventNotifier(context, this,
switchdevswitchservice, switchDev);
}
public Dictionary getDescriptions(String locale) {
return devprops;
}
public UPnPIcon[] getIcons(String locale) {
UPnPIcon icon = new DeviceIcon(switchDev);
return new UPnPIcon[]{icon} ;
}
public UPnPService getService(String serviceId) {
if (serviceId.equals(switchdevswitchservice.getId()))
return switchdevswitchservice;
else if (serviceId.equals(switchdevnameservice.getId()))
return switchdevnameservice;
else
return null;
}
public UPnPService[] getServices() {
return upnpservices;
}
public void destroy() {
// destroy listeners...
notify_switch.destroy();
}
}
My Switch Service:
public class SwitchableDevSwitchService implements UPnPService {
final private String SERVICE_ID =
"urn:upnp-org:serviceId:SwitchDevice:1";
final private String SERVICE_TYPE =
"urn:schemas-upnp-org:service:SwitchDevice:1";
final private String VERSION ="2.0";
private HashMap actions = new HashMap();
private UPnPStateVariable statusstate;
private UPnPStateVariable[] states;
public SwitchableDevSwitchService(SwitchableDevice switchDev) {
super();
this.statusstate = new
SwitchableDevStatusStateVariable(switchDev);
this.states = new UPnPStateVariable[]{statusstate};
UPnPAction setUPnPStatus = new
SwitchableDevSetStatusAction(statusstate, switchDev);
UPnPAction getUPnPStatus = new
SwitchableDevGetStatusAction(statusstate, switchDev);
actions.put(getUPnPStatus.getName(), getUPnPStatus);
actions.put(setUPnPStatus.getName(), setUPnPStatus);
}
public UPnPAction getAction(String name) {
return (UPnPAction)actions.get(name);
}
public UPnPAction[] getActions() {
return (UPnPAction[])(actions.values()).toArray(new
UPnPAction[]{});
}
public String getId() {
return SERVICE_ID;
}
public UPnPStateVariable getStateVariable(String id) {
if (id.equals("Status"))
return statusstate;
else return null;
}
public UPnPStateVariable[] getStateVariables() {
return states;
}
public String getType() {
return SERVICE_TYPE;
}
public String getVersion() {
return VERSION;
}
}
The switchdev state variable:
public class SwitchableDevStatusStateVariable implements
UPnPLocalStateVariable {
final private String NAME = "Status";
final private String DEFAULT_VALUE = "off";
private SwitchableDevice switchDev;
public SwitchableDevStatusStateVariable(SwitchableDevice switchDev){
this.switchDev = switchDev;
}
public String[] getAllowedValues() {
return null;
}
public Object getDefaultValue() {
return DEFAULT_VALUE;
}
public Class getJavaDataType() {
return String.class;
}
public Number getMaximum() {
return null;
}
public Number getMinimum() {
return null;
}
public String getName() {
return NAME;
}
public Number getStep() {
return null;
}
public String getUPnPDataType() {
return org.osgi.service.upnp.UPnPStateVariable.TYPE_STRING;
}
public boolean sendsEvents() {
return true;
}
public Object getCurrentValue() {
return switchDev.getStatus();
}
}
SetStatusAction:
public class SwitchableDevSetStatusAction implements UPnPAction {
final private String NAME = "SetStatus";
final private String NEW_STATUS_VALUE = "NewStatusValue";
final private String[] IN_ARG_NAMES = new
String[]{NEW_STATUS_VALUE};
private UPnPStateVariable state;
private SwitchableDevice switchDev;
public SwitchableDevSetStatusAction(UPnPStateVariable state,
SwitchableDevice switchDev) {
super();
this.state = state;
this.switchDev = switchDev;
}
public String[] getInputArgumentNames() {
return IN_ARG_NAMES;
}
public String getName() {
return NAME;
}
public String[] getOutputArgumentNames() {
return null;
}
public String getReturnArgumentName() {
return null;
}
public UPnPStateVariable getStateVariable(String argumentName) {
return state;
}
public Dictionary invoke(Dictionary args) throws Exception {
String value = (String) args.get(NEW_STATUS_VALUE);
this.switchDev.setStatus(value);
return null;
}
}
And finally getstatusaction:
public class SwitchableDevGetStatusAction implements UPnPAction {
final private String NAME = "GetStatus";
final private String RESULT_STATUS = "ResultStatus";
final private String[] OUT_ARG_NAMES = new String[]{RESULT_STATUS};
private UPnPStateVariable state;
private SwitchableDevice switchDev;
public SwitchableDevGetStatusAction(UPnPStateVariable state,
SwitchableDevice switchDev) {
super();
this.state = state;
this.switchDev = switchDev;
}
public String[] getInputArgumentNames() {
return null;
}
public String getName() {
return NAME;
}
public String[] getOutputArgumentNames() {
return OUT_ARG_NAMES;
}
public String getReturnArgumentName() {
return null;
}
public UPnPStateVariable getStateVariable(String argumentName) {
return state;
}
public Dictionary invoke(Dictionary args) throws Exception {
String status = switchDev.getStatus();
Hashtable result = new Hashtable();
result.put(RESULT_STATUS, status);
return result;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]