Ответ на команду Hono на устройстве AMQP

Я пытаюсь создать прототип устройства, способного получать команды от hono и отвечать на них.

Я установил hono 1.10.9 и запустил следующий код на Python

      import threading
import time
from proton import Message
from proton.reactor import Container
from amqp import AmqpSender, AmqpReceiver
from hono import tenantId, deviceId, devicePassword, device_uri, biz_app_uri


correlation_id = 'myCorrelationId'
command_reply_to = f'command_response/{tenantId}/{correlation_id}'

print("Business application subscribing for the command reply--------------------------------------------")
cr_container = Container(AmqpReceiver(biz_app_uri, command_reply_to, "consumer@HONO", "verysecret"))
cr_thread = threading.Thread(target=lambda: cr_container.run(), daemon=True)
cr_thread.start()
# Give it some time to link
time.sleep(5)


print("Device subscribing for commands-------------------------------------------------------------------")
c_container = Container(AmqpReceiver(device_uri, f'command', f'{deviceId}@{tenantId}', devicePassword))
c_thread = threading.Thread(target=lambda: c_container.run(), daemon=True)
c_thread.start()
# Give it some time to link
time.sleep(2)


print("Business application sending a command------------------------------------------------------------")
msg = Message(
    address=f'command/{tenantId}/{deviceId}',
    reply_to=command_reply_to,
    correlation_id=correlation_id,
    content_type="text/plain",
    subject="call",
    body="Hello Bob!"
)
#as in example https://stackoverflow.com/questions/64698271/difficulty-in-sending-amqp-1-0-message
Container(AmqpSender(biz_app_uri, [msg], "consumer@HONO", "verysecret", address=f'command/{tenantId}')).run()
time.sleep(2)


print("Device sending a command response-----------------------------------------------------------------")
resp = Message(
    address=command_reply_to,
    correlation_id=correlation_id,
    content_type="text/plain",
    properties={
        'status': 200,
        'device_id': deviceId,
        'tenant_id': tenantId
    },
    subject="call",
    body="Hello Alice!"
)
Container(AmqpSender(device_uri, [resp], f'{deviceId}@{tenantId}', devicePassword)).run()
time.sleep(2)


print("Device stops listeing for commands----------------------------------------------------------------")
c_container.stop()
c_thread.join(timeout=5)
print("Business application stops listening for command responsets---------------------------------------")
cr_container.stop()
cr_thread.join(timeout=5)
print("everything stopped")

Я сделал эту реализацию с помощью трудности при отправке сообщения AMQP 1.0 и в соответствии с моим пониманием https://www.eclipse.org/hono/docs/api/command-and-control/ и https: //www.eclipse .org / hono / docs / user-guide / amqp-adapter / # отправка-ответа-на-команде .

На данный момент я не кажусь таким неправильным, поскольку устройство получает команду, а также отправка сообщения не показывает никаких ошибок. Однако на прием ничего не приходит. Чтобы уточнить, реализация AmqpReceiver работает для сценария, в котором я прослушиваю данные телеметрии. Следовательно, если реализация должна быть такой же (за исключением другого адреса), то это не должно быть проблемой.

Я очень верю, что что-то не так с адресом / reply_to в сообщении, но я не могу подтвердить, поскольку журналы в модулях hono ничего мне не говорят :(

br Армин

1 ответ

Решение

Похоже, что ответ на команду, отправленный вашим устройством, содержит неправильный адрес. Как указано в Руководстве пользователя адаптера AMQP, свойство ответа должно быть установлено равным значению свойства команды. Это значение обычно НЕ совпадает со значением, которое ваше приложение устанавливает в командном сообщении, потому что адаптер протокола должен закодировать некоторую дополнительную информацию в ответ на адрес, чтобы иметь возможность определить правильный идентификатор устройства при пересылке ответа на команду в нисходящем направлении. .

Поэтому в вашем коде вам необходимо проверить командное сообщение на стороне устройства и использовать его reply-to значение как ответ на команду address ценить.

Другие вопросы по тегам