Я пытаюсь создать пример, в котором клиент отправляет сообщение объекту, а объект отвечает клиенту. Он подключен к Eclipse Ditto через соединение MQTT, а клиент моделируется с помощью команды curl. Для этого я взял несколько частей из следующих двух уроков: https://www.eclipse.org/ditto/2018-12-05-example-command-and-control.html и https://github.com/eclipse/ditto-examples/tree/master/mqtt-bidirectional.
Помимо того, что Ditto не перенаправляет сообщения от клиента на объект очень надежным способом (я бы сказал, что одно из трех сообщений не доставляется клиенту), клиент не может получить ответное сообщение от вещи, даже с очень высоким значением тайм-аута.
Это мой Python код, который действует как вещь:
import logging
import time
import random
import json
import paho.mqtt.client as mqtt
def on_message(client, userdata, message):
response = json.dumps({
"topic": "org.eclipse.ditto/teapot/things/live/messages/brew",
"headers": {
"content-type": "application/json",
"correlation-id": "command-and-control"
},
"path": "/inbox/messages/brew",
"value": {
"eta": 58
},
"status": 200
})
client.publish(outTopic, response)
inTopic = "ditto-tutorial/org.eclipse.ditto:teapot/#";
outTopic = "ditto-tutorial/";
thingId = "teapot";
interval = 10
broker_address = "test.mosquitto.org"
client = mqtt.Client(thingId) #create new instance
client.on_message = on_message #attach function to callback
client.connect(broker_address) #connect to broker
client.loop_start() #start the loop
client.subscribe(inTopic)
while True:
time.sleep(interval)
Это моя команда curl, которая имитирует клиента:
curl -i -X POST 'http://localhost:8080/api/2/things/org.eclipse.ditto:teapot/inbox/messages/brew?timeout=60' \
-u ditto:ditto \
-H 'x-correlation-id: command-and-control' \
-d '{"targetTemperature":85}'
В начале Я думал, что что-то не так с протоколом Ditto, но я полагаю, что это не так, поскольку correlation-id
одинаков как в запросе, так и в ответе, а другие поля кажутся в порядке.