IoT Agent和MQTT-调用命令作为衡量指标

时间:2019-07-16 17:37:15

标签: mqtt fiware

我正在使用IoTAgent over MQTT configuration。在逐步浏览FIWARE网站上的教程后,是否可以使用IoT代理的测量输入来调用命令?

比方说,我有2个arduinos:一个是执行器,另一个是传感器。执行器带有LED,传感器带有按钮。我想通过命令ON从sensor-arduino发送一条消息(发送到MQTT Broker或直接通过HTTP作为Ultralight消息-据我测试的IoTA for Ultralight可以同时运行两种模式,这很好)将调用发送已定义的命令对于给定的设备。

假设我使用此配置:

curl -iX POST \
  'http://localhost:4041/iot/devices' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
  "devices": [
    {
      "device_id": "bell001",
      "entity_name": "urn:ngsi-ld:Bell:001",
      "entity_type": "Bell",
      "protocol": "PDI-IoTA-UltraLight",
      "transport": "MQTT",
      "commands": [
        { "name": "ring", "type": "command" }
       ],
       "static_attributes": [
         {"name":"refStore", "type": "Relationship","value": "urn:ngsi-ld:Store:001"}
      ]
    }
  ]
}
'

我可以像这样调用命令(这很不方便):

curl -iX POST \
  'http://localhost:4041/v1/updateContext' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
    "contextElements": [
        {
            "type": "Bell",
            "isPattern": "false",
            "id": "urn:ngsi-ld:Bell:001",
            "attributes": [
                { "name": "ring", "type": "command", "value": "" }
            ],
            "static_attributes": [
               {"name":"refStore", "type": "Relationship","value": "urn:ngsi-ld:Store:001"}
            ]
        }
    ],
    "updateAction": "UPDATE"
}'

或者在注册命令后,我可以使用Orion Context Broker:

curl -iX PATCH \
  'http://localhost:1026/v2/entities/urn:ngsi-ld:Lamp:001/attrs' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: openiot' \
  -H 'fiware-servicepath: /' \
  -d '{
  "on": {
      "type" : "command",
      "value" : ""
  }
}'

这些方法在Mosquitto订户中给了我答复。

如何创建发送到IoTAgent(通过MQTT或HTTP)的消息,该消息将调用发送到MQTT Broker的命令?只要在执行器-arduino中接收到该命令,该命令就会得到进一步管理MQTT经纪人。

1 个答案:

答案 0 :(得分:1)

使用IoT代理北端口

  

我可以像这样调用命令(这很不方便):

这是一条直接指向IoT代理本身的北端口的命令-教程指出,该命令仅应用于测试连接性。您永远不需要自己做这-这是Orion上下文代理发送到IoT代理的命令

使用NSGI v2

  

或者在注册命令后,我可以使用Orion Context Broker:

使用PATCH命令是一种方法-在较新版本的IoT Agent库中,无需预先注册命令。

如何使用FIWARE向Arduino发送命令

  

如何创建发送到IoTAgent(通过MQTT或HTTP)的消息,该消息将调用发送到MQTT Broker的命令?只要在MQTT Broker中接收到该命令,就可以在执行器-arduino中进一步管理该命令。

上下文代理仅接收上下文的更改并通知订阅的服务。在本教程中,使用HTTP请求以编程方式将NSGI v2 PATCH请求发送到Context Broker:

https://github.com/FIWARE/tutorials.Step-by-Step/blob/master/context-provider/controllers/ultraLight.js

const options = {
    method: 'PATCH',
    url: UL_CONTEXT_BROKER + '/entities/' + UL_NGSI_PREFIX + id + '/attrs',
    headers: {
      'Content-Type': 'application/json',
      'fiware-servicepath': '/',
      'fiware-service': 'openiot'
    },
    body: payload,
    json: true
  };

request(options, error => {
  if (error) {
    debug(error);
  }
});

使用已配置的IoT代理,结果将是发布到MQTT代理的主题。 设备中需要有一些代码,以确保它已订阅正确的主题,然后接收有效负载。

https://github.com/FIWARE/tutorials.Step-by-Step/blob/master/context-provider/iot.js

const mqtt = require('mqtt');
const apiKey = process.env.DUMMY_DEVICES_API_KEY || '1234';
const topics = '/' + apiKey + '/#';
const mqttBrokerUrl = process.env.MQTT_BROKER_URL || 'mqtt://mosquitto';
global.MQTT_CLIENT = mqtt.connect(mqttBrokerUrl);

MQTT_CLIENT.on('connect', () => {
  debug('Subscribing to MQTT Broker: ' + mqttBrokerUrl + ' ' + topics);
  MQTT_CLIENT.subscribe(topics);
  MQTT_CLIENT.subscribe(topics + '/#');
});

mqtt.connect(mqttBrokerUrl);

MQTT_CLIENT.on('message', function(topic, message) {
  // message is Buffer 
  Ultralight.processMqttMessage(topic.toString(), message.toString());
});