[ https://jira.fiware.org/browse/HELP-15555?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Fernando Lopez reassigned HELP-15555:
-------------------------------------
Assignee: Jose Gato Luis
> [fiware-stackoverflow] FIWARE - Android Leshan-based Client to LwM2MIoTAgent
> ----------------------------------------------------------------------------
>
> Key: HELP-15555
> URL: https://jira.fiware.org/browse/HELP-15555
> Project: Help-Desk
> Issue Type: Monitor
> Components: FIWARE-TECH-HELP
> Reporter: Backlog Manager
> Assignee: Jose Gato Luis
> Labels: android, fiware, leshan
>
> Created question in FIWARE Q/A platform on 11-03-2019 at 18:03
> {color: red}Please, ANSWER this question AT{color} https://stackoverflow.com/questions/55107058/fiware-android-leshan-based-client-to-lwm2miotagent
> +Question:+
> FIWARE - Android Leshan-based Client to LwM2MIoTAgent
> +Description:+
> My experiment consists of using an Android Client (https://github.com/ApplicationPlatformForIoT/LwM2MDemoClientAndroid) and make it interact with the FIWARE LwM2MIoT Agent (https://github.com/telefonicaid/lightweightm2m-iotagent)
> 1) I am able to establish communication between the client and the Agent.
> 2) I am NOT able to find the attributes I defined in the Android client;
> 3) Hence, I can´t ensure the interaction between the client(s) and the broker (Update the attributes values, query the lazies values in the broker).
> =>===> Any hint to overcome this situation would be welcome!
> The main details of the experiments, I hope, are given in the SEVEN steps below.
> * ONE: I start by provisioning the following device: *
> {
> "count": 1,
> "devices": [
> {
> "device_id": "Illuminance",
> "service": "factory",
> "service_path": "/robots",
> "entity_name": "Robot:Illuminance",
> "entity_type": "Robot",
> "attributes": [
> {
> "object_id": "Value",
> "name": "Value",
> "type": "Float"
> }
> ],
> "lazy": [
> {
> "object_id": "Type",
> "name": "Type",
> "type": "String"
> }
> ],
> "commands": [],
> "static_attributes": [],
> "internal_attributes": {
> "lwm2mResourceMapping": {
> "Value": {
> "objectType": 3301,
> "objectInstance": 0,
> "objectResource": 5700
> },
> "Application": {
> "objectType": 3301,
> "objectInstance": 0,
> "objectResource": 5750
> }
> }
> }
> }
> ]
> }
> * TWO: I configured the device in the client Android as follows : *
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <LWM2M xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://openmobilealliance.org/tech/profiles/LWM2M.xsd">
> <Object ObjectType="MODefinition">
> <Name>Illuminance</Name>
> <Description1>Illuminance sensor, example units = lx</Description1>
> <ObjectID>3301</ObjectID>
> <ObjectURN>urn:oma:lwm2m:ext:3301</ObjectURN>
> <MultipleInstances>Multiple</MultipleInstances>
> <Mandatory>Optional</Mandatory>
> <MandatoryBoolean>false</MandatoryBoolean>
> <Resources>
> <Item ID="5700">
> <Name>Sensor Value</Name>
> <Operations>R</Operations>
> <MultipleInstances>Single</MultipleInstances>
> <Mandatory>Mandatory</Mandatory>
> <MandatoryBoolean>true</MandatoryBoolean>
> <Type>Float</Type>
> <RangeEnumeration/>
> <Units>Defined by “Units” resource.</Units>
> <Description>The current value of the luminosity sensor.</Description>
> </Item>
> <Item ID="5750">
> <Name>Application Type</Name>
> <Operations>RW</Operations>
> <MultipleInstances>Single</MultipleInstances>
> <Mandatory>Optional</Mandatory>
> <MandatoryBoolean>false</MandatoryBoolean>
> <Type>String</Type>
> <RangeEnumeration/>
> <Units/>
> <Description>The application type of the sensor or actuator as a string, for instance "Air Pressure".</Description>
> </Item>
> </Resources>
> <Description2/>
> </Object>
> </LWM2M>
> * THREE: My java file for the sensor is : *
> public class Illuminance extends GenericSensor implements SensorEventListener {
> public static final String TAG = "Illuminance";
> public static final int ID = 3301;
> private SensorManager sensorManager;
> private TextView txtIlluminance;
> private Handler handler;
> private long latestMeasurement = 0;
> private String application;
> public Illuminance(int instanceId, SensorManager sensorManager, TextView txtIlluminance) {
> super(instanceId);
> this.txtIlluminance = txtIlluminance;
> this.sensorManager = sensorManager;
> super.setUnits("lx");
> handler = new Handler();
> }
> @Override
> public void start() {
> Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
> if(lightSensor != null) {
> sensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
> setMaxRangeValue(lightSensor.getMaximumRange());
> setMinRangeValue(lightSensor.getMinDelay());
> } else {
> Log.d(TAG, "No light sensor found.");
> }
> }
> @Override
> public ReadResponse read(int resourceid) {
> switch (resourceid) {
> case 5700: //sensor value
> return ReadResponse.success(resourceid, getSensorValue());
> case 5750: //
> return ReadResponse.success(resourceid, getApplication());
> default:
> return super.read(resourceid);
> }
> }
> @Override
> public WriteResponse write(int resourceid, LwM2mResource value) {
> switch (resourceid) {
> case 5750:
> setApplication((String) value.getValue());
> fireResourcesChange(resourceid);
> return WriteResponse.success();
> default:
> return super.write(resourceid, value);
> }
> }
> @Override
> public void stop() {
> sensorManager.unregisterListener(this);
> }
> public double getSensorValue() {
> return latestMeasurement;
> }
> private void setApplication(String t) {
> application = t;
> }
> public String getApplication() {
> return application;
> }
> @Override
> public void onSensorChanged(final SensorEvent event) {
> if(System.currentTimeMillis() - latestMeasurement > 10000) {
> Log.v(TAG, "Light value: " + event.values[0]);
> setValue(event.values[0]);
> handler.post(new Runnable() {
> public void run() {
> txtIlluminance.setText(Float.toString(event.values[0]));
> }
> });
> latestMeasurement = System.currentTimeMillis();
> }
> }
> @Override
> public void onAccuracyChanged(Sensor sensor, int accuracy) {
> }
> }
> * FOUR: As or the "init" method in the MAin Activity, I have the following configurations in he original Android code: *
> // Instance of sensor service
> SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
> // Leveraged EB sensors
> Illuminance illuminance = new Illuminance(0, sensorManager, txtIlluminance);
> addSmartObject(illuminance);
> //Parse xml into java by
> //Loading the .xml raw resource models into a single List of ObjectModels
> List<ObjectModel> models = ObjectLoader.loadDefault();
> InputStream is = getResources().openRawResource(R.raw.illuminance);
> ObjectModel oModel = ObjectLoader.loadDdfFile(is, "modelstream");
> models.add(oModel);
> *** FIVE. When I connect the Andoid client device to the Server, it is registered but I can´t find my Active , neither the LAzy attributes. ***
> {"op":"LWM2MLib.COAPRouter","time":"2019-03-11T11:39:49.836Z","lvl":"DEBUG","msg":"Handling request with method [POST] on url [/rd?b=U&lwm2m=1.0<=3600&ep=Illuminance] with messageId [50]"}
> {"op":"LWM2MLib.COAPUtils","time":"2019-03-11T11:39:49.837Z","lvl":"DEBUG","msg":"Extracting query parameters from request"}
> {"op":"LWM2MLib.COAPUtils","time":"2019-03-11T11:39:49.838Z","lvl":"DEBUG","msg":"Processing query [b=U&lwm2m=1.0<=3600&ep=Illuminance]"}
> {"op":"LWM2MLib.Registration","time":"2019-03-11T11:39:49.839Z","lvl":"DEBUG","msg":"Handling registration request"}
> {"op":"LWM2MLib.COAPUtils","time":"2019-03-11T11:39:49.840Z","lvl":"DEBUG","msg":"Checking for the existence of the following parameters [[\"ep\"]]"}
> {"op":"LWM2MLib.Registration","time":"2019-03-11T11:39:49.841Z","lvl":"DEBUG","msg":"Storing the following device in the db:\n{\n \"name\": \"Illuminance\",\n \"lifetime\": \"3600\",\n \"address\": \"10.3.1.121\",\n \"port\": 5683,\n \"creationDate\": \"2019-03-11T11:39:49.841Z\"\n}"}
> {"op":"LWM2MLib.Registration","time":"2019-03-11T11:39:49.842Z","lvl":"DEBUG","msg":"Registered device [Illuminance] with type [Robot]"}
> {"op":"LWM2MLib.Registration","time":"2019-03-11T11:39:49.844Z","lvl":"DEBUG","msg":"Calling user handler for registration actions for device [Illuminance]"}
> {"op":"IOTAgent.LWM2MHandlers","time":"2019-03-11T11:39:49.845Z","lvl":"DEBUG","msg":"Handling registration of the device"}
> time=2019-03-11T11:39:49.847Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Looking for group params ["resource","apikey"] with queryObj {} | comp=IoTAgent
> time=2019-03-11T11:39:49.859Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Device group for fields [["resource","apikey"]] not found: [{}] | comp=IoTAgent
> time=2019-03-11T11:39:49.861Z | lvl=ERROR | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.Alarms | srv=n/a | subsrv=n/a | msg=Raising [MONGO-ALARM]: {"name":"DEVICE_GROUP_NOT_FOUND","message":"Couldn\t find device group","code":404} | comp=IoTAgent
> time=2019-03-11T11:39:49.863Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Looking for device with id [Illuminance]. | comp=IoTAgent
> time=2019-03-11T11:39:49.878Z | lvl=ERROR | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.Alarms | srv=n/a | subsrv=n/a | msg=Releasing [MONGO-ALARM] | comp=IoTAgent
> {"op":"IOTAgent.LWM2MHandlers","time":"2019-03-11T11:39:49.880Z","lvl":"DEBUG","msg":"Preregistered device found."}
> time=2019-03-11T11:39:49.882Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=Update provisioned device in Device Service | comp=IoTAgent
> time=2019-03-11T11:39:49.883Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Looking for device with id [Illuminance]. | comp=IoTAgent
> time=2019-03-11T11:39:49.888Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=Creating initial entity in the Context Broker:
> {
> "url": "http://orionunified:1026/v1/updateContext",
> "method": "POST",
> "json": {
> "contextElements": [
> {
> "type": "Robot",
> "isPattern": "false",
> "id": "Robot:Illuminance",
> "attributes": []
> }
> ],
> "updateAction": "APPEND"
> },
> "headers": {
> "fiware-service": "factory",
> "fiware-servicepath": "/robots",
> "fiware-correlator": "78d63062-e5c9-4fde-b6b8-db73adc5a003"
> }
> } | comp=IoTAgent
> time=2019-03-11T11:39:49.917Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=Initial entity created successfully. | comp=IoTAgent
> time=2019-03-11T11:39:49.920Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=Sending device registrations to Context Broker at [http://orionunified:1026/NGSI9/registerContext] | comp=IoTAgent
> time=2019-03-11T11:39:49.922Z | lvl=DEBUG | corr=78d63062-e5c9-4fde-b6b8-db73adc5a003 | trans=78d63062-e5c9-4fde-b6b8-db73adc5a003 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=Using the following request:
> {
> "url": "http://orionunified:1026/NGSI9/registerContext",
> "method": "POST",
> "json": {
> "contextRegistrations": [
> {
> "entities": [
> {
> "type": "Robot",
> "isPattern": "false",
> "id": "Robot:Illuminance"
> }
> ],
> "attributes": [
> {
> "name": "Application Type",
> "type": "String"
> },
> {
> "name": "Short Server ID",
> "type": "Integer"
> },
> {
> "name": "Lifetime",
> "type": "Integer"
> },
> {
> "name": "Default Minimum Period",
> "type": "Integer"
> },
> {
> "name": "Default Maximum Period",
> "type": "Integer"
> },
> {
> "name": "Disable",
> "type": ""
> },
> {
> "name": "Disable Timeout",
> "type": "Integer"
> },
> {
> "name": "Notification Storing When Disabled or Offline",
> "type": "Boolean"
> },
> {
> "name": "Binding",
> "type": "String"
> },
> {
> "name": "Registration Update Trigger",
> "type": ""
> },
> {
> "name": "Luminosity Sensor#0",
> "type": "string"
> }
> ],
> "providingApplication": "http://idaslwm2m:4041"
> }
> ],
> "duration": "P1Y",
> "registrationId": "5c8642fa684ccedc01ce71bf"
> },
> "headers": {
> "fiware-service": "factory",
> "fiware-servicepath": "/robots"
> }
> }
> * SIX : Via wireshark, I also noticed that the Android client payload is "application/link-format" when connecting to the server and " application/vnd.oma.lwm2m+tlv" when transfering the data. *
> DEVICE CONNECTION TO THE SERVER
> Frame 21417: 129 bytes on wire (1032 bits), 129 bytes captured (1032 bits) on interface 0
> Ethernet II, Src: TctMobil_3b:1e:48 (d0:9d:ab:3b:1e:48), Dst: Vmware_11:0a:d0 (00:0c:29:11:0a:d0)
> Internet Protocol Version 4, Src: 10.3.1.121, Dst: 10.3.3.43
> User Datagram Protocol, Src Port: 5684, Dst Port: 5683
> Constrained Application Protocol, Confirmable, POST, MID:390
> 01.. .... = Version: 1
> ..00 .... = Type: Confirmable (0)
> .... 1000 = Token Length: 8
> Code: POST (2)
> Message ID: 390
> Token: 41542d95d7dde946
> Opt Name: #1: Uri-Path: rd
> Opt Name: #2: Content-Format: application/link-format
> Opt Name: #3: Uri-Query: b=U
> Opt Name: #4: Uri-Query: lwm2m=1.0
> Opt Name: #5: Uri-Query: lt=3600
> Opt Name: #6: Uri-Query: ep=robot2
> End of options marker: 255
> [Response In: 21439]
> [Uri-Path: /rd]
> Payload: Payload Content-Format: application/link-format, Length: 37
> Payload Desc: application/link-format
> [Payload Length: 37]
> DATA TRANSFERT
> Frame 23950: 68 bytes on wire (544 bits), 68 bytes captured (544 bits) on interface 0
> Ethernet II, Src: TctMobil_3b:1e:48 (d0:9d:ab:3b:1e:48), Dst: Vmware_11:0a:d0 (00:0c:29:11:0a:d0)
> Internet Protocol Version 4, Src: 10.3.1.121, Dst: 10.3.3.43
> User Datagram Protocol, Src Port: 5684, Dst Port: 5683
> Constrained Application Protocol, Non-Confirmable, 2.05 Content, MID:398
> 01.. .... = Version: 1
> ..01 .... = Type: Non-Confirmable (1)
> .... 0100 = Token Length: 4
> Code: 2.05 Content (69)
> Message ID: 398
> Token: 115744a3
> Opt Name: #1: Observe: 36
> Opt Name: #2: Content-Format: application/vnd.oma.lwm2m+tlv
> End of options marker: 255
> [Request In: 22145]
> [Response Time: 99.920193000 seconds]
> [Uri-Path: /3301/0/5700]
> Payload: Payload Content-Format: application/vnd.oma.lwm2m+tlv, Length: 12
> Payload Desc: application/vnd.oma.lwm2m+tlv
> [Payload Length: 12]
> Lightweight M2M TLV (1 element)
> * SEVEN: when I do the experiments with the Fiware Client from https://github.com/telefonicaid/lwm2m-node-lib/blob/master/bin/iotagent-lwm2m-client.js, the captured traffic over Wireshark are as follow: *
> DEVICE CONNECTION TO THE SERVER
> Frame 14476: 112 bytes on wire (896 bits), 112 bytes captured (896 bits) on interface 0
> Ethernet II, Src: fa:16:3e:25:bf:4a (fa:16:3e:25:bf:4a), Dst: Vmware_11:0a:d0 (00:0c:29:11:0a:d0)
> Internet Protocol Version 4, Src: 10.3.4.22, Dst: 10.3.3.43
> User Datagram Protocol, Src Port: 43649, Dst Port: 5683
> Constrained Application Protocol, Confirmable, POST, MID:62716
> 01.. .... = Version: 1
> ..00 .... = Type: Confirmable (0)
> .... 0100 = Token Length: 4
> Code: POST (2)
> Message ID: 62716
> Token: 6d4d85f8
> Opt Name: #1: Uri-Path: rd
> Opt Name: #2: Uri-Query: ep=Illuminance
> Opt Name: #3: Uri-Query: lt=85671
> Opt Name: #4: Uri-Query: lwm2m=1.0
> Opt Name: #5: Uri-Query: b=U
> End of options marker: 255
> [Response In: 14496]
> [Uri-Path: /rd]
> Payload: Payload Content-Format: application/octet-stream (no Content-Format), Length: 1
> Payload Desc: application/octet-stream
> [Payload Length: 19]
> Data (19 bytes)
> Data: 3c2f333333332f303e2c3c2f333330312f303e
> [Length: 19]
> DATA TRANSFERT
> Frame 25895: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0
> Ethernet II, Src: fa:16:3e:25:bf:4a (fa:16:3e:25:bf:4a), Dst: Vmware_11:0a:d0 (00:0c:29:11:0a:d0)
> Internet Protocol Version 4, Src: 10.3.4.22, Dst: 10.3.3.43
> User Datagram Protocol, Src Port: 43649, Dst Port: 5683
> Constrained Application Protocol, Acknowledgement, 2.05 Content, MID:23556
> 01.. .... = Version: 1
> ..10 .... = Type: Acknowledgement (2)
> .... 0100 = Token Length: 4
> Code: 2.05 Content (69)
> Message ID: 23556
> Token: 958d27cd
> End of options marker: 255
> [Request In: 25865]
> [Response Time: 0.003624000 seconds]
> [Uri-Path: /3301/0/5700]
> Payload: Payload Content-Format: application/octet-stream (no Content-Format), Length: 3
> Payload Desc: application/octet-stream
> [Payload Length: 3]
> Data (3 bytes)
> Data: 333035
> [Length: 3]
> * EIGHT=> entilties it broker before and After connecting the client (connect serverIP 5684 Illuminance /) *
> {
> "id": "Robot:Illuminance",
> "type": "Robot",
> "Value": {
> "type": "Float",
> "value": " ",
> "metadata": {}
> }
> }
--
This message was sent by Atlassian JIRA
(v6.4.1#64016)
You can get more information about our cookies and privacy policies clicking on the following links: Privacy policy Cookies policy