Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
OM2M/Developer
Contents
Add a new plug-in to OM2M
Create a new plug-in project
- Create a new plug-in project called org.eclipse.om2m.sample.ipu via File → New → Other → Plug-in Project.
- Enter the data as depicted in the following screenshots.
- Uncheck the Create a plug-in using one of the templates checkbook and press the Finish button.
- As result the following project is created.
Convert the plugin into maven project
- Open the build.properties file in XML and update the src attributes as depicted in the following figure.
- Select the created plug-in "org.eclipse.om2m.sample.ipu" → right click → configure → convert to maven project.
- Enter the data as illustrated in the following and press the Finish button.
- Once the plug-in is converted, open the pom.xml file to edit the parent filed.
- Click on "select Parent" icon and enter "org.eclipse.om2m" in the "Enter groupId, artifactId or sh1 prefix or pattern" field.
- Select "org.om2m.eclipse" and press ok.
- We end this step by updating the plug-inf project. For this, select the "org.eclipse.om2m.sample.ipu" project → maven → update project.
Add the plugin as a maven module to the OM2M parent project
- In this part, we will add the created plug-in as a module to the om2m platform:
- Open the pom file of the org.eclipse.om2m package.
- Go to the modules tab and press Add button.
- Select the org.eclipse.ipu.om2m.sample.ipu plug-in and press ok.
- Build the om2m package and its sub-projects. To do this, select the "om2m.org.eclipse" package → right click → Run as → maven install.
- Check the org.eclipse.om2m.sample.ipu was successfully built. At the buid end, we should get this result.
- Remark: To keep the same display pattern for all the platform' plugins, you can add description and name tags to the org.eclipse.om2m.sample.ipu' pom.xml file.
<project> ...... <name>org.eclipse.om2m :: sample ipu</name> <description>org.eclipse.om2m :: sample ipu</description> ..... </project>
Add the plugin to the OM2M product(s)
- The final step consists of adding the created plug-in to one of om2m platform products, i.e the gscl or the nscl executable. In the following, we choose to add the org.eclipse.om2m.sample.ipu plug-in to the gscl product:
- select the org.eclipse.om2m.site.gscl package.
- open the om2m.product file.
- Press Add button and Type org.eclipse.om2m.sample.ipu
- Click on ok button and save.
- Build the om2m package and its sub-projects: select the "om2m.org.eclipse" package -> right click -> Run as -> maven install.
- To check that the "org.eclipse.om2m.sample.ipu" was successfully added to the gscl product, run the gscl and verify in the console if the "org.eclipse.om2m.sample.ipu" is displayed.
Add required dependencies
Add plugin dependencies
- Open the manifest file of the created plugin and select Dependencies tab.
- Add the dependencies depicted in the following figure.
Add jar dependencies
If you want to add specific jar libraries to your plugin, you can follow these steps:
- Create a "libs" folder on your plugin project.
- Put required specific jar on the "libs" folder.
- Open the manifest file of the created plugin and select "runtime" tab.
- Go to the "classpath" tab and click on the "Add" button.
- Select the required jar and click on "ok" button.
Develop an Interworking Proxy Unit (IPU) plugin
IPU Activator
package org.eclipse.om2m.sample.ipu; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.om2m.core.service.SclService; import org.eclipse.om2m.ipu.service.IpuService; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; public class Activator implements BundleActivator { private static Log logger = LogFactory.getLog(Activator.class); private ServiceTracker<Object, Object> sclServiceTracker; public void start(BundleContext context) throws Exception { logger.info("IPU started"); logger.info("Register IpuService.."); context.registerService(IpuService.class.getName(), new Controller(), null); logger.info("IpuService is registered."); sclServiceTracker = new ServiceTracker<Object, Object>(context, SclService.class.getName(), null) { public void removedService(ServiceReference<Object> reference, Object service) { logger.info("SclService removed"); } public Object addingService(ServiceReference<Object> reference) { logger.info("SclService discovered"); SclService sclService = (SclService) this.context.getService(reference); final Monitor IpuMonitor = new Monitor(sclService); new Thread() { public void run() { try { IpuMonitor.start(); } catch (Exception e) { logger.error("IpuMonitor error", e); } } }.start(); return sclService; } }; sclServiceTracker.open(); } public void stop(BundleContext context) throws Exception { logger.info("IPU stopped"); } }
IPU Monitor
package org.eclipse.om2m.sample.ipu; import org.eclipse.om2m.commons.resource.*; import org.eclipse.om2m.commons.rest.*; import org.eclipse.om2m.core.service.SclService; public class Monitor { static SclService core; static String sclId = System.getProperty("org.eclipse.om2m.sclBaseId", ""); static String reqEntity = System.getProperty("org.eclipse.om2m.adminRequestingEntity", ""); static String ipuId = "sample"; static String actuatorId = "MY_ACTUATOR"; static String sensorId = "MY_SENSOR"; static boolean actuatorValue = false; static int sensorValue = 0; public Monitor(SclService sclService) { core = sclService; } public void start() { createSensorResources(); listenToSensor(); createActuatorResources(); listenToActuator(); } public void createSensorResources() { String targetId, content; targetId = sclId + "/applications"; ResponseConfirm response = core .doRequest(new RequestIndication("CREATE", targetId, reqEntity, new Application(sensorId, ipuId))); if (response.getStatusCode().equals(StatusCode.STATUS_CREATED)) { targetId = sclId + "/applications/" + sensorId + "/containers"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new Container("DESCRIPTOR"))); core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new Container("DATA"))); content = Mapper.getSensorDescriptorRep(sclId, sensorId, ipuId); targetId = sclId + "/applications/" + sensorId + "/containers/DESCRIPTOR/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new ContentInstance(content.getBytes()))); content = Mapper.getSensorDataRep(sensorValue); targetId = sclId + "/applications/" + sensorId + "/containers/DATA/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new ContentInstance(content.getBytes()))); } } public void createActuatorResources() { String targetId, content; targetId = sclId + "/applications"; ResponseConfirm response = core.doRequest(new RequestIndication( "CREATE", targetId, reqEntity, new Application(actuatorId,ipuId))); if (response.getStatusCode().equals(StatusCode.STATUS_CREATED)) { targetId = sclId + "/applications/" + actuatorId + "/containers"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new Container("DESCRIPTOR"))); core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new Container("DATA"))); content = Mapper.getActutaorDescriptorRep(sclId, actuatorId, ipuId); targetId = sclId + "/applications/" + actuatorId + "/containers/DESCRIPTOR/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, content)); content = Mapper.getActuatorDataRep(actuatorValue); targetId = sclId + "/applications/" + actuatorId + "/containers/DATA/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, content)); } } public void listenToSensor() { new Thread() { public void run() { while (true) { sensorValue = 10 + (int) (Math.random() * 100); String content = Mapper.getSensorDataRep(sensorValue); String targetID = sclId + "/applications/" + sensorId + "/containers/DATA/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetID,reqEntity, content)); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } public void listenToActuator() { new Thread() { public void run() { boolean memorizedActuatorValue = false; while (true) { if (memorizedActuatorValue != actuatorValue) { memorizedActuatorValue = actuatorValue; String content = Mapper.getActuatorDataRep(actuatorValue); String targetID = sclId + "/applications/" + actuatorId + "/containers/DATA/contentInstances"; core.doRequest(new RequestIndication("CREATE",targetID, reqEntity, content)); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }
IPU Monitor
package org.eclipse.om2m.sample.ipu; import obix.*; import obix.io.ObixEncoder; public class Mapper { public static String getSensorDescriptorRep(String sclId, String appId, String ipuId) { Obj obj = new Obj(); Op opGet = new Op(); opGet.setName("GET"); opGet.setHref(new Uri(sclId + "/applications/" + appId + "/containers/DATA/contentInstances/latest/content")); opGet.setIs(new Contract("retrieve")); obj.add(opGet); // OP GetGet from SCL IPU Op opGetDirect = new Op(); opGetDirect.setName("GET(Direct)"); opGetDirect.setHref(new Uri(sclId + "/applications/" + appId + "/" + ipuId)); opGetDirect.setIs(new Contract("retrieve")); obj.add(opGetDirect); return ObixEncoder.toString(obj); } public static String getActutaorDescriptorRep(String sclId, String appId, String ipuId) { Obj obj = new Obj(); Op opGet = new Op(); opGet.setName("GET"); opGet.setHref(new Uri(sclId + "/applications/" + appId + "/containers/DATA/contentInstances/latest/content")); opGet.setIs(new Contract("retrieve")); obj.add(opGet); // OP GetGet from SCL IPU Op opGetDirect = new Op(); opGetDirect.setName("GET(Direct)"); opGetDirect.setHref(new Uri(sclId + "/applications/" + appId + "/" + ipuId)); opGetDirect.setIs(new Contract("retrieve")); obj.add(opGetDirect); Op opON = new Op(); opON.setName("ON"); opON.setHref(new Uri(sclId + "/applications/" + appId + "/" + ipuId + "/true")); opON.setIs(new Contract("execute")); obj.add(opON); Op opOFF = new Op(); opOFF.setName("OFF"); opOFF.setHref(new Uri(sclId + "/applications/" + appId + "/" + ipuId + "/false")); opOFF.setIs(new Contract("execute")); obj.add(opOFF); return ObixEncoder.toString(obj); } public static String getActuatorDataRep(boolean value) { Obj obj = new Obj(); obj.add(new Bool("data", value)); return ObixEncoder.toString(obj); } public static String getSensorDataRep(int value) { Obj obj = new Obj(); obj.add(new Int("data", value)); return ObixEncoder.toString(obj); } }
IPU Contoller
package org.eclipse.om2m.sample.ipu; import org.eclipse.om2m.commons.resource.StatusCode; import org.eclipse.om2m.commons.rest.RequestIndication; import org.eclipse.om2m.commons.rest.ResponseConfirm; import org.eclipse.om2m.ipu.service.IpuService; public class Controller implements IpuService { public ResponseConfirm doExecute(RequestIndication requestIndication) { String[] parts = requestIndication.getTargetID().split("/"); String appId = parts[2]; String value = parts[4]; if (appId.equals(Monitor.actuatorId)) { Monitor.actuatorValue = Boolean.parseBoolean(value); return new ResponseConfirm(StatusCode.STATUS_OK); } else { return new ResponseConfirm(StatusCode.STATUS_NOT_FOUND, appId + " not found"); } } public ResponseConfirm doRetrieve(RequestIndication requestIndication) { String[] parts = requestIndication.getTargetID().split("/"); String appId = parts[2]; String content; if (appId.equals(Monitor.sensorId)) { content = Mapper.getSensorDataRep(Monitor.sensorValue); return new ResponseConfirm(StatusCode.STATUS_OK, content); } else if (appId.equals(Monitor.actuatorId)) { content = Mapper.getActuatorDataRep(Monitor.actuatorValue); return new ResponseConfirm(StatusCode.STATUS_OK, content); } else { return new ResponseConfirm(StatusCode.STATUS_NOT_FOUND, appId + " not found"); } } public ResponseConfirm doUpdate(RequestIndication requestIndication) { return new ResponseConfirm(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod() + " not Implemented"); } public ResponseConfirm doDelete(RequestIndication requestIndication) { return new ResponseConfirm(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod() + " not Implemented"); } public ResponseConfirm doCreate(RequestIndication requestIndication) { return new ResponseConfirm(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod() + " not Implemented"); } public String getAPOCPath() { return Monitor.ipuId; } }
The IPU Activator
This class customizes the starting and stopping of a the org.eclipse.om2m.sample.ipu plug-in.
package org.eclipse.om2m.sample.ipu; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.om2m.core.service.SclService; import org.eclipse.om2m.ipu.service.IpuService; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; public class Activator implements BundleActivator { /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ /** Logger */ private static Log logger = LogFactory.getLog(Activator.class); /** SCL service tracker */ private ServiceTracker<Object, Object> sclServiceTracker; public void start(BundleContext context) throws Exception { logger.info("Register IpuService.."); context.registerService(IpuService.class.getName(), new IpuController(), null); logger.info("IpuService is registered."); sclServiceTracker = new ServiceTracker<Object, Object>(context, SclService.class.getName(), null) { public void removedService(ServiceReference<Object> reference, Object service) { logger.info("SclService removed"); } public Object addingService(ServiceReference<Object> reference) { logger.info("SclService discovered"); SclService sclService = (SclService) this.context.getService(reference); final IpuMonitor IpuMonitor = new IpuMonitor(sclService); new Thread(){ public void run(){ try { IpuMonitor.start(); } catch (Exception e) { logger.error("IpuMonitor error", e); } } }.start(); return sclService; } }; sclServiceTracker.open(); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { System.out.println("End Ipu sample"); } }
Test Scenario
- To check that the "sensor_0" and "lamp_0" applications are successfully created, run the NSCL and GSCL products.
- Then go to the GSCL OSGi console and enter the ss command to list all deployed plugins. Start the "org.eclipse.om2m.sample.ipu" plugin (id=28 in this example) by typing the following command: start 28.
- The interworking proxy plug-in creates all required resources to enable to monitor and control sensor and lamp remotely and in a standardized way.
Open the NSCL web interface (127.0.0.1:8080), and move to the GSCL resource tree. Click on the "applications" resource to list all registered applications. You will find the following resources:
- "lamp_0": an application resource enables to handle lamp 0.
- "sensor_0": an application resource enables to handle sensor 0.
This figure illustrates a contentInstance description.
- Execute a command using the following uri: "http://127.0.0.1:8080/om2m/gcl/applications/lamp_0/ipu/true" to switch on the lamp. A message box will appear with the message "The lamp is switched on".