Как приложение Rust может отправить сообщение от облака к устройству на IoTHub, предназначенное для доступа к устройству?

#azure #rust #azure-iot-hub

#azure #Ржавчина #azure-iot-hub

Вопрос:

Я создаю приложение Rust на основе MQTT, которое отправляет сообщение на IoTHub, чтобы оно было перенаправлено на целевое устройство, которое прослушивает сообщения между облачными устройствами.

Целевое устройство «myDev» подписано на раздел devices/myDev/messages/devicebound/# и может получать сообщения из интерфейса IoTHub («Сообщение на устройство» на портале Azure).

В примерах, которые я нашел для достижения этой цели на других языках программирования, используется Azure IoT SDK, в котором есть клиентская служба. Смотрите, например, пример для Java: https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-java-java-c2d#send-a-cloud-to-device-message

Проблема в том, что на самом деле нет официального Azure IoT SDK для Rust. Я смог найти только этот проект https://github.com/damienpontifex/azure-iot-sdk-rs который я не могу использовать, потому что он имеет зависимость от Tokio> 1.x, и я должен пока придерживаться Tokio 0.x.

Однако я могу представить, что отправка сообщения cloud-to-device на IoTHub должна быть каким-то образом выполнима. Вероятно, требуемая информация: device_id, тело и свойства, которые являются полями, доступными в интерфейсе.

Но я нигде не нашел более подробной информации. Любая помощь приветствуется.

Ответ №1:

Действительно, официального SDK не существует, но есть несколько других реализаций, с которыми вы можете ознакомиться, например, в следующем примере:

 use tokio::time;
use azure_iot_sdk::{IoTHubClient, DeviceKeyTokenSource, Message};

#[tokio::main]
async fn main() -> azure_iot_sdk::Result<()> {
    let iothub_hostname = "iothubname.azure-devices.net";
    let device_id = "MyDeviceId";
    let token_source = DeviceKeyTokenSource::new(
        iothub_hostname,
        device_id,
        "TheAccessKey",
    ).unwrap();

    let mut client =
        IoTHubClient::new(iothub_hostname, device_id.into(), token_source).await?;

    let mut interval = time::interval(time::Duration::from_secs(1));
    let mut count: u32 = 0;

    loop {
        interval.tick().await;

        let msg = Message::builder()
            .set_body(format!("Message #{}", count).as_bytes().to_vec())
            .set_message_id(format!("{}-t", count))
            .build();

        client.send_message(msg).await?;

        count  = 1;
    }

    Ok(())
}
 

В качестве альтернативы, если Rust не является жестким требованием, по крайней мере, сквозным, возможно, вы можете создать независимую службу, которая занимается операциями с IoT Hub, и вызвать ее из вашего кода Rust как обычную службу REST.

Комментарии:

1. Спасибо. Я попробовал, но я не могу использовать его из-за зависимости sdk от использования Tokio>= 1.x (я использую 0.x). Я обновлю свой вопрос.