lightweightm2m-iotagent
lightweightm2m-iotagent copied to clipboard
Problem with virtual IoT devices
I'm trying to follow Robot's example: https://fiware-iotagent-lwm2m.readthedocs.io/en/latest/deviceProvisioning/
Using dynamic provisioning in the latest stable version of Fiware/Orion. Virtual Device data: (following this: https://github.com/telefonicaid/lwm2m-node-lib)
create /7392/0
set /7392/0 1 79
set /7392/0 2 "First robot here"
set /7392/0 3 "[0, 0]"
connect 127.0.0.1 5683 robot1 /
list
Here I show the Dockerfile:
volumes:
mongodb:
services:
iotagent:
image: fiware/lightweightm2m-iotagent
depends_on:
- mongodb
ports:
- "4041:4041"
- "5683:5683/udp"
environment:
- "IOTA_CB_HOST=orion"
- "IOTA_CB_PORT=1026"
- "IOTA_NORTH_PORT=4041"
- "IOTA_REGISTRY_TYPE=mongodb"
- "IOTA_MONGO_HOST=mongodb"
- "IOTA_MONGO_PORT=27017"
- "IOTA_MONGO_DB=iotagent-lwm2m"
volumes:
- "./config.js:/opt/iota-lwm2m/config.js"
- "./omaInverseRegistry.json:/opt/iota-lwm2m/omaInverseRegistry.json"
- "./omaRegistry.json:/opt/iota-lwm2m/omaRegistry.json"
mongodb:
image: mongo:3.6
ports:
- "27017:27017"
command: --bind_ip_all --smallfiles
volumes:
- mongodb:/data
orion:
image: fiware/orion
depends_on:
- mongodb
expose:
- "1026"
ports:
- "1026:1026"
command: -dbhost mongodb
Here I show the config.js file:
var config = {};
config.lwm2m = {
logLevel: 'DEBUG',
port: '5683',
defaultType: 'Robot',
ipProtocol: 'udp4',
serverProtocol: 'udp4',
delayedObservationTimeout: 50,
formats: [
{
name: 'application-vnd-oma-lwm2m/tlv',
value: 11542
},
{
name: 'application-vnd-oma-lwm2m/json',
value: 11543
},
{
name: 'application-vnd-oma-lwm2m/opaque',
value: 11544
}
],
writeFormat: 'application-vnd-oma-lwm2m/opaque',
types: []
};
config.ngsi = {
logLevel: 'DEBUG',
contextBroker: {
host: 'orion',
port: '1026'
},
server: {port: '4041'},
deviceRegistry: {type: 'mongo'},
mongodb: {
host: 'mongo',
port: '27017',
db: 'mongo-iotagent'
},
types: {},
service: 'Default',
subservice: '/default',
providerUrl: 'http://iotagent:4041',
deviceRegistrationDuration: 'P1M'
};
module.exports = config;
retrieve devices provisioning returns:
"count": 1,
"devices": [
{
"device_id": "robot1",
"service": "Factory",
"service_path": "/robots",
"entity_name": "robot1",
"entity_type": "Robot",
"attributes": [
{
"object_id": "Battery",
"name": "Battery",
"type": "number"
}
],
"lazy": [
{
"object_id": "Message",
"name": "Message",
"type": "string"
}
],
"commands": [
{
"object_id": "Position",
"name": "Position",
"type": "location"
}
],
"static_attributes": [],
"internal_attributes": {
"lwm2mResourceMapping": {
"Battery": {
"objectType": 7392,
"objectInstance": 0,
"objectResource": 1
},
"Message": {
"objectType": 7392,
"objectInstance": 0,
"objectResource": 2
},
"Position": {
"objectType": 7392,
"objectInstance": 0,
"objectResource": 3
}
}
}
}
]
}
retrieve entities v2:
'http://192.168.1.32:1026/v2/entities?limit=50' \
-H 'Postman-Token: 4195a240-4eab-4698-b9f2-200490f59514' \
-H 'cache-control: no-cache' \
-H 'fiware-service: Factory' \
-H 'fiware-servicepath: /robots'
returns me:
[
{
"id": "robot1",
"type": "Robot",
"Battery": {
"type": "number",
"value": "79",
"metadata": {}
},
"Position_info": {
"type": "commandResult",
"value": " ",
"metadata": {}
},
"Position_status": {
"type": "commandStatus",
"value": "UNKNOWN",
"metadata": {}
}
}
]
Well, now i cant access to lazy values or modify them
curl -X POST \
http://192.168.1.32:1026/v1/queryContext \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 5ea5ae61-6367-46d0-864c-027e153d2d28' \
-H 'cache-control: no-cache' \
-H 'fiware-service: Factory' \
-H 'fiware-servicepath: /robots' \
-d '{
"entities": [
{
"type": "Robot",
"isPattern": "false",
"id": "robot1"
}
],
"attributes": [
"Message"
]
}'
returns:
{
"errorCode": {
"code": "404",
"reasonPhrase": "No context element found",
"details": "No device was found with id:robot1"
}
}
Server log when i try to get a lazy value :
iotagent_1 | time=2019-02-07T15:45:24.412Z | lvl=DEBUG | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=6f5738c9-ef56-4a40-ac1b-92c4a1592987 | op=IoTAgentNGSI.GenericMiddlewares | srv=factory | subsrv=/robots | msg=Request for path [//queryContext] from [iotagent:4041] | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.412Z | lvl=DEBUG | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=6f5738c9-ef56-4a40-ac1b-92c4a1592987 | op=IoTAgentNGSI.GenericMiddlewares | srv=factory | subsrv=/robots | msg=Body:
iotagent_1 | {
iotagent_1 | "entities": [
iotagent_1 | {
iotagent_1 | "type": "Robot",
iotagent_1 | "isPattern": "false",
iotagent_1 | "id": "robot1"
iotagent_1 | }
iotagent_1 | ],
iotagent_1 | "attributes": [
iotagent_1 | "Message"
iotagent_1 | ]
iotagent_1 | }
iotagent_1 | | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.412Z | lvl=DEBUG | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=6f5738c9-ef56-4a40-ac1b-92c4a1592987 | op=IoTAgentNGSI.ContextServer | srv=factory | subsrv=/robots | msg=Handling query from [iotagent:4041] | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.413Z | lvl=DEBUG | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=6f5738c9-ef56-4a40-ac1b-92c4a1592987 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=factory | subsrv=/robots | msg=Looking for device with name [robot1]. | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.415Z | lvl=DEBUG | corr=4fcfe24e-6c43-470d-864d-beb1b52cf383 | trans=4fcfe24e-6c43-470d-864d-beb1b52cf383 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Device [robot1] not found. | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.415Z | lvl=DEBUG | corr=4fcfe24e-6c43-470d-864d-beb1b52cf383 | trans=4fcfe24e-6c43-470d-864d-beb1b52cf383 | op=IoTAgentNGSI.ContextServer | srv=n/a | subsrv=n/a | msg=There was an error handling the query: [object Object]. | comp=IoTAgent
iotagent_1 | time=2019-02-07T15:45:24.415Z | lvl=DEBUG | corr=4fcfe24e-6c43-470d-864d-beb1b52cf383 | trans=4fcfe24e-6c43-470d-864d-beb1b52cf383 | op=IoTAgentNGSI.ContextServer | srv=n/a | subsrv=n/a | msg=Query error [DEVICE_NOT_FOUND] handling request: No device was found with id:robot1 | comp=IoTAgent
orion_1 | time=Thursday 07 Feb 15:45:24 2019.416Z | lvl=WARN | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=1549550994-444-00000000096 | from=192.168.1.32 | srv=factory | subsrv=/robots | comp=Orion | op=httpRequestSend.cpp[625]:httpRequestSendWithCurl | msg=Notification response NOT OK, http code: 404
iotagent_1 | time=2019-02-07T15:45:24.416Z | lvl=DEBUG | corr=622b203e-2aef-11e9-9039-0242ac130004 | trans=6f5738c9-ef56-4a40-ac1b-92c4a1592987 | op=IoTAgentNGSI.DomainControl | srv=factory | subsrv=/robots | msg=response-time: 5 | comp=IoTAgent
I could also show the log when I try to modify the value of the 'Message' lazy attribute. but this issue seems long enough.
It works flawless using this docker images: iotagent: hopu/lwm2m-iotagent:observe-and-read orion: fiware/orion:2.0.0
As you can see in https://fiware-iotagent-lwm2m.readthedocs.io/en/latest/deviceProvisioning/, you should use fiware-service
in the headers of your requests in lowercase. So instead of Factory
, please use factory
.
Also confirm the name of the entity in the Context Broker. In my tests, instead of robot1
is Robot:robot1
.
Hi, after the changes I'm having new problems.
I just deleted all my DB and deleted my service provisioning.
I just changed the fiware-service to factory
and removed the line in the dynamic device provisioning "entity_name": "robot1",
to make the system concatenate the entity_type:device_id
for the id.
Orion returns in retrieve entities:
[
{
"id": "Robot:robot1",
"type": "Robot",
"Battery": {
"type": "number",
"value": " ",
"metadata": {}
},
"Position_info": {
"type": "commandResult",
"value": " ",
"metadata": {}
},
"Position_status": {
"type": "commandStatus",
"value": "UNKNOWN",
"metadata": {}
},
"Message": {
"type": "string",
"value": "First robot here",
"metadata": {}
},
"Position": {
"type": "string",
"value": "[0, 0]",
"metadata": {}
}
}
]
First question: Why is IoTAgent uploading lazy attributes to Orion? So now, my queryContext request for a lazy attribute is this:
curl -X POST \
http://192.168.1.32:1026/v1/queryContext \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 00efb112-2917-404a-8fc1-da6de93716a5' \
-H 'cache-control: no-cache' \
-H 'fiware-service: factory' \
-H 'fiware-servicepath: /robots' \
-d '{
"entities": [
{
"type": "Robot",
"isPattern": "false",
"id": "Robot:robot1"
}
],
"attributes": [
"Message"
]
}'
it returns:
{
"contextResponses": [
{
"contextElement": {
"type": "Robot",
"isPattern": "false",
"id": "Robot:robot1",
"attributes": [
{
"name": "Message",
"type": "string",
"value": "First robot here"
}
]
},
"statusCode": {
"code": "200",
"reasonPhrase": "OK"
}
}
]
}
But when I try to update the lazy 'Message' value using:
curl -X POST \
http://192.168.1.32:1026/v1/updatecontext \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 1ccc1d90-9172-4a85-93aa-5a2893a4fb61' \
-H 'cache-control: no-cache' \
-H 'fiware-service: factory' \
-H 'fiware-servicepath: /robots' \
-d '{
"contextElements": [
{
"type": "Robot",
"isPattern": "false",
"id": "Robot:robot1",
"attributes": [
{
"name": "Message",
"type": "string",
"value": "SOS!"
}
]
}
],
"updateAction": "UPDATE"
}'
I get:
{
"errorCode": {
"code": "404",
"reasonPhrase": "No context element found",
"details": "error forwarding update"
}
}
this is the log:
iotagent_1 | time=2019-02-08T08:08:49.250Z | lvl=DEBUG | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=7e0537ee-3c70-4692-bef3-a3d673bdb436 | op=IoTAgentNGSI.GenericMiddlewares | srv=factory | subsrv=/robots | msg=Request for path [//updateContext] from [iotagent:4041] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.250Z | lvl=DEBUG | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=7e0537ee-3c70-4692-bef3-a3d673bdb436 | op=IoTAgentNGSI.GenericMiddlewares | srv=factory | subsrv=/robots | msg=Body:
iotagent_1 | {
iotagent_1 | "contextElements": [
iotagent_1 | {
iotagent_1 | "type": "Robot",
iotagent_1 | "isPattern": "false",
iotagent_1 | "id": "Robot:robot1",
iotagent_1 | "attributes": [
iotagent_1 | {
iotagent_1 | "name": "Message",
iotagent_1 | "type": "string",
iotagent_1 | "value": "SOS!"
iotagent_1 | }
iotagent_1 | ]
iotagent_1 | }
iotagent_1 | ],
iotagent_1 | "updateAction": "UPDATE"
iotagent_1 | }
iotagent_1 | | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.251Z | lvl=DEBUG | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=7e0537ee-3c70-4692-bef3-a3d673bdb436 | op=IoTAgentNGSI.ContextServer | srv=factory | subsrv=/robots | msg=Handling update from [iotagent:4041] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.251Z | lvl=DEBUG | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=7e0537ee-3c70-4692-bef3-a3d673bdb436 | op=IoTAgentNGSI.ContextServer | srv=factory | subsrv=/robots | msg=[object Object] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.251Z | lvl=DEBUG | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=7e0537ee-3c70-4692-bef3-a3d673bdb436 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=factory | subsrv=/robots | msg=Looking for device with name [Robot:robot1]. | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.255Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Looking for group params ["service","subservice","type"] with queryObj {"service":"factory","subservice":"/robots","type":"Robot"} | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.256Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Device group for fields [["service","subservice","type"]] not found: [{"service":"factory","subservice":"/robots","type":"Robot"}] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.257Z | lvl=ERROR | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | 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
iotagent_1 | time=2019-02-08T08:08:49.257Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=deviceData: {"lazy":[{"name":"Message","type":"string","object_id":"Message"}],"active":[{"name":"Battery","type":"number","object_id":"Battery"}],"commands":[{"name":"Position","type":"location","object_id":"Position"}],"staticAttributes":[],"subscriptions":[],"_id":"5c5d373b99391b001423dff5","creationDate":"2019-02-08T08:00:59.203Z","id":"robot1","type":"Robot","name":"Robot:robot1","service":"factory","subservice":"/robots","registrationId":"5c5d373be5fdde598ad1b046","internalId":null,"internalAttributes":{"lwm2mResourceMapping":{"Battery":{"objectType":7392,"objectInstance":0,"objectResource":1},"Message":{"objectType":7392,"objectInstance":0,"objectResource":2},"Position":{"objectType":7392,"objectInstance":0,"objectResource":3}}}} | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.257Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.DeviceService | srv=n/a | subsrv=n/a | msg=deviceData2: {"lazy":[{"name":"Message","type":"string","object_id":"Message"}],"active":[{"name":"Battery","type":"number","object_id":"Battery"}],"commands":[{"name":"Position","type":"location","object_id":"Position"}],"staticAttributes":[],"subscriptions":[],"_id":"5c5d373b99391b001423dff5","creationDate":"2019-02-08T08:00:59.203Z","id":"robot1","type":"Robot","name":"Robot:robot1","service":"factory","subservice":"/robots","registrationId":"5c5d373be5fdde598ad1b046","internalId":null,"internalAttributes":[{"lwm2mResourceMapping":{"Battery":{"objectType":7392,"objectInstance":0,"objectResource":1},"Message":{"objectType":7392,"objectInstance":0,"objectResource":2},"Position":{"objectType":7392,"objectInstance":0,"objectResource":3}}}]} | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.257Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IOTAgent.NGSIHandlers | srv=n/a | subsrv=n/a | msg=Handling device data update from the north port for device [Robot:robot1] of type [Robot] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.258Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IOTAgent.NGSIHandlers | srv=n/a | subsrv=n/a | msg=New attributes;
iotagent_1 | [object Object] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.258Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Looking for device with name [Robot:robot1]. | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.260Z | lvl=ERROR | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.Alarms | srv=n/a | subsrv=n/a | msg=Releasing [MONGO-ALARM] | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.260Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=n/a | subsrv=n/a | msg=Looking for device with name [Robot:robot1]. | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.262Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=IoTAgentNGSI.MongoDBGroupRegister | srv=n/a | subsrv=n/a | msg=Selecting ID from the stored device data | comp=IoTAgent
iotagent_1 | time=2019-02-08T08:08:49.262Z | lvl=DEBUG | corr=31f6217e-704c-48ce-a59a-47a1ff244ee4 | trans=31f6217e-704c-48ce-a59a-47a1ff244ee4 | op=LWM2MLib.DeviceManagement | srv=n/a | subsrv=n/a | msg=Writting a new value [SOS!] on resource /7392/0/2 in device [2] | comp=IoTAgent
orion_1 | time=Friday 08 Feb 08:08:54 2019.246Z | lvl=ERROR | corr=c3caf7e0-2b78-11e9-a143-0242ac130004 | trans=1549612847-482-00000000028 | from=192.168.1.32 | srv=factory | subsrv=/robots | comp=Orion | op=postUpdateContext.cpp[190]:updateForward | msg=Runtime Error (error 'Timeout was reached' forwarding 'Update' to providing application)
Thank you in advance.