Команда не пересылается из агента FIWARE JSON в MQTT брокера - PullRequest
0 голосов
/ 20 октября 2018

Я развернул стек iot с помощью докера.Это использованные контейнеры:

  • fiware / orion: 1.13.0
  • fiware / iotagent-json: 1.8.0
  • eclipse-mosquitto: 1.4.12
  • [другие контейнеры, не вовлеченные в проблему ...]

Я зарегистрировал на агенте следующее устройство:

{
     "device_id": "t3",
     "service": "lmobile",
     "service_path": "/lmobile_Industry",
     "entity_name": "t3",
     "entity_type": "Device",
     "endpoint": "tcp://<mqttborker_publicip>:<port>",
     "transport": "MQTT",
     "attributes": [{
                "object_id": "led",
                "name": "led",
                "type": "text"
     }],
     "lazy": [],
     "commands": [{
                "object_id": "c",
                "name": "c",
                "type": "Command"
     }],
     "static_attributes": [
                      ....
     ],
     "protocol": "JSON"
}

и соответствующеесущность была должным образом создана в OCB, и когда я публикую новую меру на mqttbroker, в теме /<apikey>/t3/attrs мера должным образом направлена ​​в OCB.

Чтобы отправить команду c вустройству я отправляю следующий updateContext в OCB:

curl -s -X POST http://<orionhost>:1026/v1/updateContext
       -H 'accept: application/json'
       -H 'cache-control: no-cache' 
       -H 'content-type: application/json'
       -H 'fiware-service: lmobile'
       -H 'fiware-servicepath: /lmobile_Industry'
       -d '{
             "contextElements": [
                 {
                    "type": "Device",
                     "isPattern": "false",
                     "id": "t3",
                     "attributes": [
                       {
                         "name":"c",
                         "type":"Command",
                         "value":100
                       }
                     ]
                 }
             ],
             "updateAction": "UPDATE"
         }'

и получаю следующий ответ об ошибке:

{
     "errorCode": {
         "code": "404",
         "reasonPhrase": "No context element found",
         "details": "invalid context provider response"
     }
}

В журнале OCB я вижу следующее ПРЕДУПРЕЖДАЮЩЕЕ сообщение: time=Thursday 18 Oct 08:55:54 2018.431Z | lvl=WARN | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=postQueryContext.cpp[169]:queryForward | msg=Other Error (context provider response to QueryContext is empty).В любом случае, updateContext правильно перенаправляется агенту.

В журнале агента (в отладке) я вижу следующее:

iotstack_agent-json.1.xyz@xerus-1    | time=2018-10-18T09:02:33.975Z | lvl=DEBUG | corr=8d2864ec-d2b4-11e8-b445-02420aff0161 | trans=de5680e7-0727-4577-ac44-ddeb59df1f31 | op=IoTAgentNGSI.GenericMiddlewares | srv=lmobile | subsrv=/lmobile_Industry | msg=Request for path [/updateContext] from [<agent_publicip>:<port>] | comp=IoTAgent
iotstack_agent-json.1.xyz@xerus-1    | time=2018-10-18T09:02:33.976Z | lvl=DEBUG | corr=8d2864ec-d2b4-11e8-b445-02420aff0161 | trans=de5680e7-0727-4577-ac44-ddeb59df1f31 | op=IoTAgentNGSI.GenericMiddlewares | srv=lmobile | subsrv=/lmobile_Industry | msg=Body:
iotstack_agent-json.1.xyz@xerus-1    |
iotstack_agent-json.1.xyz@xerus-1    | {
iotstack_agent-json.1.xyz@xerus-1    |     "contextElements": [
iotstack_agent-json.1.xyz@xerus-1    |         {
iotstack_agent-json.1.xyz@xerus-1    |             "type": "Device",
iotstack_agent-json.1.xyz@xerus-1    |             "isPattern": "false",
iotstack_agent-json.1.xyz@xerus-1    |             "id": "t3",
iotstack_agent-json.1.xyz@xerus-1    |             "attributes": [
iotstack_agent-json.1.xyz@xerus-1    |                 {
iotstack_agent-json.1.xyz@xerus-1    |                     "name": "c",
iotstack_agent-json.1.xyz@xerus-1    |                     "type": "Command",
iotstack_agent-json.1.xyz@xerus-1    |                     "value": "100"
iotstack_agent-json.1.xyz@xerus-1    |                 }
iotstack_agent-json.1.xyz@xerus-1    |             ]
iotstack_agent-json.1.xyz@xerus-1    |         }
iotstack_agent-json.1.xyz@xerus-1    |     ],
iotstack_agent-json.1.xyz@xerus-1    |     "updateAction": "UPDATE"
iotstack_agent-json.1.xyz@xerus-1    | }
iotstack_agent-json.1.xyz@xerus-1    |
iotstack_agent-json.1.xyz@xerus-1    |  | comp=IoTAgent
iotstack_agent-json.1.xyz@xerus-1    | time=2018-10-18T09:02:33.978Z | lvl=DEBUG | corr=8d2864ec-d2b4-11e8-b445-02420aff0161 | trans=de5680e7-0727-4577-ac44-ddeb59df1f31 | op=IoTAgentNGSI.DomainControl | srv=lmobile | subsrv=/lmobile_Industry | msg=response-time: 6 | comp=IoTAgent

Здесь я не вижу предупреждений или ошибок, ноникакие команды не передаются в MQTT Broker ни по одной теме (я подписан как на конкретную тему для команд /<apikey>/t3/cmd, так и на все темы с использованием подстановочного знака #).

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

@ fgalan правильный - вам не нужно поле endpoint при подготовке группы сервисов для MQTT

curl -iX POST \
  'http://localhost:4041/iot/services' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
 "services": [
   {
     "apikey":      "4jggokgpepnvsb2uv4s40d59ov",
     "cbroker":     "http://orion:1026",
     "entity_type": "Thing",
     "resource":    ""
   }
 ]
}'

Однако важно, чтобы файл config.json был настроен правильно для связи с MQTTБрокер.

Лично я бы использовал docker-compose и присвоил бы значения с помощью переменных среды Docker, но также можно редактировать файл config.json напрямую:

 environment:
     - "IOTA_MQTT_HOST=mosquitto" # The host name of the MQTT Broker
     - "IOTA_MQTT_PORT=1883" # The port the MQTT Broker is listening on to receive topics

Вототображение между ENV переменными и config.json настройками:

  • IOTA_MQTT_HOST - mqtt.host
  • IOTA_MQTT_PORT - mqtt.port
  • IOTA_MQTT_USERNAME - mqtt.username
  • IOTA_MQTT_PASSWORD - mqtt.password
  • IOTA_MQTT_QOS - mqtt.qos

Обратите внимание, что cbroker также является необязательным атрибутом- если он не предоставлен, агент IoT использует URL-адрес посредника контекста по умолчанию, определенный в файле конфигурации

. Tutorial для подготовки устройства через MQTT использует агента Ultralight IoT, ноJSON IoT Agent должен работать таким же образом.

0 голосов
/ 23 октября 2018

Не совсем уверен, но, возможно, это проблема на этапе подготовки.endpoint, начинающийся с tcp://, немного странно для меня ...

Более подробно, обращаясь к этой части документации Я прочитал:

В примере показано, что есть два различия, сравнивающих [предоставление MQTT] с предоставлением для HTTP:

  • Отсутствие поля "конечной точки"
  • Наличие поля "транспорта",какое значение должно быть "MQTT".

Поэтому я понимаю, что вы не должны использовать поле endpoint вообще во время подготовки.

...