IotAgent Ultralight 2.0中的命令FIWARE

时间:2017-06-01 12:20:07

标签: fiware fiware-orion

我正在尝试使用Orion + Ultralight 2.0向设备发送命令。 设备已注册,我可以轻松发送措施。我想在池模式下工作以执行命令,但是当我执行updateContext操作时,IDAS找不到实体。以下是配置和日志:

配置:

var config = {};

config.mqtt = {
    host: 'mosquitto',
    port: 1883
};

config.http = {
    port: 7896
};

config.iota = {
    logLevel: 'DEBUG',
    timestamp: true,
    contextBroker: {
        host: 'MY_IP',
        port: '1026'
    },
    server: {
        port: 4041
    },
    deviceRegistry: {
        type: 'mongodb'
    },
    mongodb: {
        host: 'mongo',
        port: '27017',
        db: 'iotagentul'
    },
    types: {},
    service: 'howtoService',
    subservice: '/howto',
    providerUrl: 'http://YIP:4041',
    deviceRegistrationDuration: 'P1M',
    defaultType: 'Thing'
};

config.defaultKey = 'TEF';

module.exports = config;

我尝试了不同的IP和路由,最后我尝试使用公共IP,确保从外部到这些端口之间的通信。

设备注册:

curl -X POST \
  http://MYIP:4041/iot/devices \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -d '{
    "devices": [{
        "device_id": "muvone",
        "protocol": "IoTA-UL",
        "entity_name": "muvone",
        "entity_type": "Thing",
        "attributes": [{
            "object_id": "t",
            "name": "temperature",
            "type": "Float"
        }],
        "commands": [{
            "name":"blink",
            "type": "command",
            "value": "muvone@blink|%s"
        }],
        "static_attributes": []
    }]
}'

然后我从物理设备和POSTMAN发送一些观察结果:

curl -X POST \
  'http://MYIP:7896/iot/d?i=muvone&k=TEF&getCmd=1' \
  -H 'cache-control: no-cache' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -d 'temperature|16'

实际上正确地更新了实体,如Orion Context Broker中所示: 查询:

curl -X GET \
  http://MYIP:1026/v2/entities \
  -H 'cache-control: no-cache' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \

响应:

[
  {
    "id": "muvone",
    "type": "Thing",
    "TimeInstant": {
      "type": "ISO8601",
      "value": "2017-06-01T11:37:52.537Z",
      "metadata": {}
    },
    "blink_info": {
      "type": "commandResult",
      "value": " ",
      "metadata": {}
    },
    "blink_status": {
      "type": "commandStatus",
      "value": "UNKNOWN",
      "metadata": {}
    },
    "temperature": {
      "type": "Float",
      "value": "16",
      "metadata": {
        "TimeInstant": {
          "type": "ISO8601",
          "value": "2017-06-01T11:37:52.537Z"
        }
      }
    }
  }
]

所以现在,如果我想发送一个命令,我已经在很多方面做到了。我尝试按照本指南进行操作:

http://fiware-iot-stack.readthedocs.io/en/master/topics/device_connection/index.html

所以我尝试使用以下请求:

curl -X PUT \
  http://MYIP:1026/v2/entities \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -d '{
  "id": "muvone",
  "type": "Thing",
  "blink": {
    "type" : "command",
    "value" : "true"
  }
}'

回答是:

{
  "error": "MethodNotAllowed",
  "description": "method not allowed"
}

所以我尝试更新单个属性,在这种情况下是blink属性,这是一个命令。这应该触发Orion Context Broker充当NGSI代理并将请求传递给IoTAgent,这就发生了。但问题是IoTAgent找不到实体,因为它可以在日志中看到:

curl -X PUT \
  'http://MYIP:1026/v2/entities/muvone/attrs/blink?type=Thing' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -d '{
    "type": "command",
    "value": "true"
}' 

curl -X PUT \
  'http://MYIP:1026/v2/entities/muvone/attrs/blink?type=Thing' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -H 'postman-token: 6b42d06d-2a9f-3081-e315-bd9919aeded5' \
  -d '{
    "value": "true"
}'

回复:

{
  "error": "NotFound",
  "description": "The requested entity has not been found. Check type and id"
}

编辑:发出这些请求后,获取v2 / entity到orion的结果是:

[
  {
    "id": "muvone",
    "type": "Thing",
    "TimeInstant": {
      "type": "ISO8601",
      "value": "2017-06-02T10:26:32.212Z",
      "metadata": {}
    },
    "blink_info": {
      "type": "commandResult",
      "value": " ",
      "metadata": {}
    },
    "blink_status": {
      "type": "commandStatus",
      "value": "UNKNOWN",
      "metadata": {}
    },
    "temperature": {
      "type": "Float",
      "value": "26",
      "metadata": {
        "TimeInstant": {
          "type": "ISO8601",
          "value": "2017-06-02T10:26:32.212Z"
        }
      }
    }
  }
]

现在,看一下Orion和IoTAgent日志,可以看出IoTAgent找不到实体:

Orion记录到请求:

time=Thursday 01 Jun 12:10:13 2017.880Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000039 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=logMsg.h[1832]:lmTransactionStart | msg=Starting transaction from 91.126.73.210:2880/v2/entities/muvone/attrs/blink
time=Thursday 01 Jun 12:10:13 2017.880Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000039 | from=91.126.73.210 | srv=pending | subsrv=/howto | comp=Orion | op=rest.cpp[872]:servicePathSplit | msg=Service Path 0: '/howto'
time=Thursday 01 Jun 12:10:13 2017.881Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000039 | from=91.126.73.210 | srv=howtoservice | subsrv=/howto | comp=Orion | op=connectionOperations.cpp[237]:collectionCount | msg=Database Operation Successful (count: { _id.id: "muvone", _id.type: "Thing", _id.servicePath: { $in: [ /^/howto$/ ] } })
time=Thursday 01 Jun 12:10:13 2017.881Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000039 | from=91.126.73.210 | srv=howtoservice | subsrv=/howto | comp=Orion | op=connectionOperations.cpp[92]:collectionQuery | msg=Database Operation Successful (query: { _id.id: "muvone", _id.type: "Thing", _id.servicePath: { $in: [ /^/howto$/ ] } })
time=Thursday 01 Jun 12:10:13 2017.881Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000039 | from=91.126.73.210 | srv=howtoservice | subsrv=/howto | comp=Orion | op=connectionOperations.cpp[175]:collectionRangedQuery | msg=Database Operation Successful (query: { query: { $or: [ { contextRegistration.entities: { $in: [ { id: "muvone", type: "Thing" }, { type: "Thing", id: "muvone" } ] } }, { contextRegistration.entities.id: { $in: [] } } ], expiration: { $gt: 1496319013 }, contextRegistration.attrs.name: { $in: [ "blink" ] }, servicePath: { $in: [ /^/howto$/ ] } }, orderby: { _id: 1 } })
time=Thursday 01 Jun 12:10:13 2017.882Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000040 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=logMsg.h[1832]:lmTransactionStart | msg=Starting transaction to http://MYIP:4041//updateContext
time=Thursday 01 Jun 12:10:13 2017.882Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000040 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=httpRequestSend.cpp[577]:httpRequestSendWithCurl | msg=Sending message 14 to HTTP server: sending message of 558 bytes to HTTP server
time=Thursday 01 Jun 12:10:13 2017.886Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000040 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=httpRequestSend.cpp[598]:httpRequestSendWithCurl | msg=Notification Successfully Sent to http://MYIP:4041//updateContext
time=Thursday 01 Jun 12:10:13 2017.886Z | lvl=INFO | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=1496315963-946-00000000040 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=logMsg.h[1916]:lmTransactionEnd | msg=Transaction ended
time=Thursday 01 Jun 12:10:13 2017.886Z | lvl=WARN | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=postUpdateContext.cpp[225]:updateForward | msg=Internal Error (error parsing reply from prov app: )
time=Thursday 01 Jun 12:10:13 2017.886Z | lvl=INFO | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=logMsg.h[1916]:lmTransactionEnd | msg=Transaction ended

IDAS日志:

time=2017-06-01T12:10:13.882Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.GenericMiddlewares | srv=howtoservice | subsrv=/howto | msg=Request for path [//updateContext] from [MYIP:4041] | comp=IoTAgent
time=2017-06-01T12:10:13.882Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.GenericMiddlewares | srv=howtoservice | subsrv=/howto | msg=Body:

{
    "contextElements": [
        {
            "type": "Thing",
            "isPattern": "false",
            "id": "muvone",
            "attributes": [
                {
                    "name": "blink",
                    "type": "command",
                    "value": "true"
                }
            ]
        }
    ],
    "updateAction": "UPDATE"
}

 | comp=IoTAgent
time=2017-06-01T12:10:13.883Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.ContextServer | srv=howtoservice | subsrv=/howto | msg=Handling update from [MYIP:4041] | comp=IoTAgent
time=2017-06-01T12:10:13.883Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.ContextServer | srv=howtoservice | subsrv=/howto | msg=[object Object] | comp=IoTAgent
time=2017-06-01T12:10:13.883Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=howtoservice | subsrv=/howto | msg=Looking for entity with name [muvone]. | comp=IoTAgent
time=2017-06-01T12:10:13.883Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.MongoDBDeviceRegister | srv=howtoservice | subsrv=/howto | msg=Entity [muvone] not found. | comp=IoTAgent
time=2017-06-01T12:10:13.884Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.ContextServer | srv=howtoservice | subsrv=/howto | msg=There was an error handling the update action: [object Object]. | comp=IoTAgent
time=2017-06-01T12:10:13.884Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.ContextServer | srv=howtoservice | subsrv=/howto | msg=Update error [ENTITY_NOT_FOUND] handing request: The entity with the requested id [muvone] was not found. | comp=IoTAgent
time=2017-06-01T12:10:13.884Z | lvl=DEBUG | corr=446f4532-46c3-11e7-b1a4-0242ac110003 | trans=8dcc19e7-e3ce-472a-a1bb-c7983dad7025 | op=IoTAgentNGSI.DomainControl | srv=howtoservice | subsrv=/howto | msg=response-time: 2 | comp=IoTAgent

在mongo数据库中,可以看到注册,实体和所有内容都已正确设置。

我已经解决了这个问题几天没有结果。 任何帮助将不胜感激。提前致谢

更新

使用Orion API的v1后,结果与v2给出的结果相同:

curl -X POST \
  http://MYIP:1026/v1/updateContext \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'fiware-service: howtoService' \
  -H 'fiware-servicepath: /howto' \
  -d '{
    "contextElements": [
        {
            "type": "Thing",
            "isPattern": "false",
            "id": "muvone",
            "attributes": [
                {
                    "name": "blink",
                    "type": "command",
                    "value": "true"
                }
            ]
        }
    ],
    "updateAction": "UPDATE"
} '

结果:

{
  "errorCode": {
    "code": "404",
    "reasonPhrase": "No context element found"
  }
}

第二次更新 我有一个服务将我发出的命令发送到上下文代理。不同之处在于,如果在设备中定义了命令,则会响应404错误,但如果未在预配置中定义,则它将使用代码472进行响应:

未定义的命令

curl -X POST \
  http://localhost:3000/api/devices/1111/sendCommand/update_firmware \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
    "value":"example value"
}'

472:

{
  "contextResponses": [
    {
      "contextElement": {
        "type": "Thing",
        "isPattern": "false",
        "id": "muvone",
        "attributes": [
          {
            "name": "update_firmware",
            "type": "command",
            "value": ""
          }
        ]
      },
      "statusCode": {
        "code": "472",
        "reasonPhrase": "request parameter is invalid/not allowed",
        "details": "action: UPDATE - entity: [muvone, Thing] - offending attribute: update_firmware"
      }
    }
  ]
}

定义的命令:

curl -X POST \
  http://localhost:3000/api/devices/1111/sendCommand/blink \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
    "value":"asd"
}'

404:

{
  "errorCode": {
    "code": "404",
    "reasonPhrase": "No context element found"
  }
}

2 个答案:

答案 0 :(得分:2)

我找到了解决这个问题的方法,我认为必须将其视为一个错误。这是camelcases的一个问题。 就我而言,我正在使用标题howtoService来获取Fiware-service头,并在数据库中存储正确:

{ "_id" : ObjectId("5935316c4cfcb20001ec6181"), "polling" : true, "transport" : "HTTP", "protocol" : "IoTA-UL", "internalId" : null, "registrationId" : "5935316c5937ac933167d477", "subservice" : "/howto", "service" : "howtoService", "name" : "muvone", "type" : "Thing", "id" : "muvone", "creationDate" : ISODate("2017-06-05T10:24:44.336Z"), "subscriptions" : [ ], "staticAttributes" : [ ], "commands" : [ { "object_id" : "blink", "value" : "muvone@blink|%s", "type" : "command", "name" : "blink" } ], "active" : [ { "type" : "Float", "name" : "temperature", "object_id" : "ta" } ], "__v" : 0 }

但是,当来自IOTAgent的操作到来时,它使用小写,导致mongo过滤器找不到操作:

{ "op" : "query", "ns" : "iotagentul.devices", "query" : { "find" : "devices", "filter" : { "subservice" : "/howto", "service" : "howtoservice", "name" : "muvone" }, "projection" : { "__v" : 0 }, "limit" : 1, "batchSize" : 1, "singleBatch" : true }, "keysExamined" : 0, "docsExamined" : 1, "cursorExhausted" : true, "keyUpdates" : 0, "writeConflicts" : 0, "numYield" : 0, "locks" : { "Global" : { "acquireCount" : { "r" : NumberLong(2) } }, "Database" : { "acquireCount" : { "r" : NumberLong(1) } }, "Collection" : { "acquireCount" : { "r" : NumberLong(1) } } }, "nreturned" : 0, "responseLength" : 124, "protocol" : "op_query", "millis" : 0, "execStats" : { "stage" : "LIMIT", "nReturned" : 0, "executionTimeMillisEstimate" : 0, "works" : 3, "advanced" : 0, "needTime" : 2, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "limitAmount" : 1, "inputStage" : { "stage" : "PROJECTION", "nReturned" : 0, "executionTimeMillisEstimate" : 0, "works" : 3, "advanced" : 0, "needTime" : 2, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "transformBy" : { "__v" : 0 }, "inputStage" : { "stage" : "COLLSCAN", "filter" : { "$and" : [ { "name" : { "$eq" : "muvone" } }, { "service" : { "$eq" : "howtoservice" } }, { "subservice" : { "$eq" : "/howto" } } ] }, "nReturned" : 0, "executionTimeMillisEstimate" : 0, "works" : 3, "advanced" : 0, "needTime" : 2, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "direction" : "forward", "docsExamined" : 1 } } }, "ts" : ISODate("2017-06-05T10:40:37.401Z"), "client" : "172.17.0.4", "allUsers" : [ ], "user" : "" }

在数据库中更新howtoService to howtoservice后,命令正常工作

答案 1 :(得分:0)

不确定我要说的是什么可以解决你的问题,但在阅读你的问题之后需要考虑的一些事项:

  • PUT /v2/entities导致“方法不允许”是正常的。考虑到根据NGSIv2 specification/v2/entities URL仅接受动词:GET(检索实体列表)和POST(创建新实体)。这不是更新现有实体的方式。
  • 关于您PUT /v2/entities/muvone/attrs/blink?type=Thing遇到的“未找到”错误,请查看此issue report。根据该信息,该命令正在进行,事实上,这种情况正在发生(如IOTA日志中的第二行所示)。