我正在使用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经纪人。
答案 0 :(得分:1)
我可以像这样调用命令(这很不方便):
这是一条直接指向IoT代理本身的北端口的命令-教程指出,该命令仅应用于测试连接性。您永远不需要自己做这-这是Orion上下文代理发送到IoT代理的命令
或者在注册命令后,我可以使用Orion Context Broker:
使用PATCH命令是一种方法-在较新版本的IoT Agent库中,无需预先注册命令。
如何创建发送到IoTAgent(通过MQTT或HTTP)的消息,该消息将调用发送到MQTT Broker的命令?只要在MQTT Broker中接收到该命令,就可以在执行器-arduino中进一步管理该命令。
上下文代理仅接收上下文的更改并通知订阅的服务。在本教程中,使用HTTP请求以编程方式将NSGI v2 PATCH请求发送到Context Broker:
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());
});