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.
Difference between revisions of "OM2M/Developer"
< OM2M
(→The Sensor class) |
|||
Line 79: | Line 79: | ||
= Develop an Interworking Proxy Unit (IPU) plugin = | = Develop an Interworking Proxy Unit (IPU) plugin = | ||
− | == | + | == IPU Monitor class == |
− | + | ||
− | + | ||
<source lang="java"> | <source lang="java"> | ||
package org.eclipse.om2m.sample.ipu; | package org.eclipse.om2m.sample.ipu; | ||
+ | package org.eclipse.om2m.ipu.wiki; | ||
− | import | + | import org.eclipse.om2m.commons.resource.Application; |
− | import | + | import org.eclipse.om2m.commons.resource.ContentInstance; |
+ | import org.eclipse.om2m.commons.resource.StatusCode; | ||
+ | import org.eclipse.om2m.commons.resource.Container; | ||
+ | import org.eclipse.om2m.commons.rest.RequestIndication; | ||
+ | import org.eclipse.om2m.commons.rest.ResponseConfirm; | ||
+ | import org.eclipse.om2m.core.service.SclService; | ||
− | public class | + | 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 | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 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 = Mapping.getSensorDescriptorRep(sclId, sensorId, ipuId); |
+ | targetId = sclId + "/applications/" + sensorId | ||
+ | + "/containers/DESCRIPTOR/contentInstances"; | ||
+ | core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, | ||
+ | new ContentInstance(content.getBytes()))); | ||
− | + | content = Mapping.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 = Mapping | |
− | + | .getActutaorDescriptorRep(sclId, actuatorId, ipuId); | |
+ | targetId = sclId + "/applications/" + actuatorId | ||
+ | + "/containers/DESCRIPTOR/contentInstances"; | ||
+ | core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, | ||
+ | content)); | ||
− | + | content = Mapping.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 = Mapping.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) { | ||
+ | // TODO Auto-generated catch block | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }.start(); | ||
+ | } | ||
+ | public void listenToActuator() { | ||
+ | new Thread() { | ||
+ | public void run() { | ||
− | + | boolean memorizedActuatorValue = false; | |
− | + | while (true) { | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | if (memorizedActuatorValue != actuatorValue) { | |
− | + | memorizedActuatorValue = actuatorValue; | |
− | + | String content = Mapping | |
− | + | .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(); | |
− | + | } | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
</source> | </source> |
Revision as of 15:10, 12 February 2015
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 Monitor class
package org.eclipse.om2m.sample.ipu; package org.eclipse.om2m.ipu.wiki; import org.eclipse.om2m.commons.resource.Application; import org.eclipse.om2m.commons.resource.ContentInstance; import org.eclipse.om2m.commons.resource.StatusCode; import org.eclipse.om2m.commons.resource.Container; import org.eclipse.om2m.commons.rest.RequestIndication; import org.eclipse.om2m.commons.rest.ResponseConfirm; 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 = Mapping.getSensorDescriptorRep(sclId, sensorId, ipuId); targetId = sclId + "/applications/" + sensorId + "/containers/DESCRIPTOR/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, new ContentInstance(content.getBytes()))); content = Mapping.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 = Mapping .getActutaorDescriptorRep(sclId, actuatorId, ipuId); targetId = sclId + "/applications/" + actuatorId + "/containers/DESCRIPTOR/contentInstances"; core.doRequest(new RequestIndication("CREATE", targetId, reqEntity, content)); content = Mapping.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 = Mapping.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) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } public void listenToActuator() { new Thread() { public void run() { boolean memorizedActuatorValue = false; while (true) { if (memorizedActuatorValue != actuatorValue) { memorizedActuatorValue = actuatorValue; String content = Mapping .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(); } }
The IPU contoller
- The org.eclipse.om2m.sample.ipu.IpuController implements the IpuService interface to enable communications from SCL to the org.eclipse.om2m.sample.ipu plug-in.
- For each Retrieve request, we have to extract the application identifier (appId) from the requestIndication targetID attribute. Then extarct type and index from appId based on the appId template <type>_<index>.
- For each Execute request we have to extract the application appId and the action value from the requestIndication targetID.
package org.eclipse.om2m.sample.ipu; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.om2m.commons.resource.ErrorInfo; 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 IpuController implements IpuService { public final static String APOCPATH = "ipu"; private static Log LOGGER = LogFactory.getLog(IpuController.class); public ResponseConfirm doExecute(RequestIndication requestIndication) { String[] info = requestIndication.getTargetID().split("/"); String lampId = info[info.length-3]; String type = lampId.split("_")[0]; String value = info[info.length-1]; String trueCase = "true"; String falseCase = "false"; try { if(type.equals("lamp")) { IpuMonitor.setLampState(lampId, value); if (value.equals(trueCase)) { javax.swing.JOptionPane.showMessageDialog(null, "the lamp is switched on"); } else if (value.equals(falseCase)) { javax.swing.JOptionPane.showMessageDialog(null, "the lamp is switched off"); } return new ResponseConfirm(StatusCode.STATUS_OK); } else{ return new ResponseConfirm(StatusCode.STATUS_NOT_FOUND,type+" Not found"); } } catch (Exception e) { LOGGER.error("IPU Lamp Error",e); return new ResponseConfirm(StatusCode.STATUS_NOT_IMPLEMENTED,"IPU Lamp Error"); } } public ResponseConfirm doRetrieve(RequestIndication requestIndication) { String[] info = requestIndication.getTargetID().split("/"); String appId = info[info.length-2]; String type= appId.split("_")[0]; int contvalue; boolean value; String content=null; try { if (type.equals("sensor")){ // Get a random Value for the sensor contvalue = Sensor.getState(); content = Sensor.getStateRep(appId, contvalue); } else if (type.equals("lamp")){ // Get the boolean Value for the lamp value = Lamp.getState(); content = Lamp.getStateRep(appId, value); } return new ResponseConfirm(StatusCode.STATUS_OK,content); } catch (Exception e) { LOGGER.error("Hello sample Error",e); return new ResponseConfirm(StatusCode.STATUS_NOT_IMPLEMENTED,"IPU Sample Error" ); } } public ResponseConfirm doUpdate(RequestIndication requestIndication) { return new ResponseConfirm(new ErrorInfo(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod()+" Method not Implemented")); } public ResponseConfirm doDelete(RequestIndication requestIndication) { return new ResponseConfirm(new ErrorInfo(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod()+" Method not Implemented")); } public ResponseConfirm doCreate(RequestIndication requestIndication) { return new ResponseConfirm(new ErrorInfo(StatusCode.STATUS_NOT_IMPLEMENTED, requestIndication.getMethod()+" Method not Implemented")); } public String getAPOCPath() { // TODO Auto-generated method stub return APOCPATH; } }
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".