C ++ с использованием CPPRestSDK («Касабланка») для аутентификации в Azure IoT Hub - PullRequest
0 голосов
/ 30 октября 2018

РЕДАКТИРОВАТЬ: мне удалось получить работающую версию C # (ниже)

Оригинальный вопрос:

Я пытаюсь подключиться к IoT-концентратору Azure через cpprestsdk и POST через json-структуру. Тем не менее, я не могу найти что-либо относительно аутентификации в любом месте.

Я следовал этому примеру MSDN и пытался заполучить всю доступную документацию, но я не уверен, как люди подключаются к Azure iot Hub через этот оставшийся SDK. Есть ли какое-то расширение, о котором я не знаю? Потому что я не могу найти примеры, где используется авторизация. Но в примерах MSDN они нажимают и получают. Этот SDK должен работать только локально без какой-либо авторизации? Я в замешательстве ... Может кто-нибудь уточнить или дать мне пример того, как пройти аутентификацию в Azure iot Hub, а затем передать сообщение служебной шине? Я уже настроил свою маршрутизацию для этого.

Для справки: я использую v120 и cpprestsdk 2.9.1.1 .

C ++ попытка

// Upload result to Azure Hub.
pplx::task<void> UploadDataToHttpServerAsync(std::wstring data)
{
    //using concurrency::streams::file_stream;
    //using concurrency::streams::basic_istream;

    // create a stream from a text string. 
    auto ss = concurrency::streams::wstringstream::open_istream(data);


    try
    {
        // HTTP request.

        http_client client(L"LINK-I-GUESS");    
        return client.request(methods::POST, L"WHAT-LINK-SHOULD-THIS-BE?", data).then([data](pplx::task<http_response> previousTask)
        {
            std::wostringstream wss;
            try
            {
                auto response = previousTask.get();
                wss << L"Server returned status code " << response.status_code() << L"." << std::endl;
                if (response.status_code() == status_codes::OK)
                {
                    cout << L"data was sent";
                }
                else 
                {
                    cout << L"Error: " << response.status_code() << std::endl;
                }
            }
            catch (const http_exception& e)
            {
                wss << e.what() << std::endl;
            }
            std::wcout << wss.str();
        });
    }
    catch (const std::system_error& e)
    {
        std::wostringstream wss;
        wss << e.what() << std::endl;
        std::wcout << wss.str();

        // Return an empty task. 
        return pplx::task_from_result();
    }

}

Azure Dashboard.

Я ищу эти соединения не в том месте?

enter image description here

Другие ресурсы, на которые я смотрел:

(c #) https://blogs.msdn.microsoft.com/chmitch/2016/11/16/sending-events-to-iot-hub-over-http-via-rest/

https://github.com/Microsoft/cpprestsdk/wiki

https://microsoft.github.io/cpprestsdk/namespaces.html

https://www.example -code.com / cpp / azure_service_bus_send_message_to_queue.asp - не имеет значения, но пришлось искать, как это делали другие библиотеки.

https://blogs.msdn.microsoft.com/vcblog/2013/07/10/intercepting-http-requestresponse-using-c-rest-http-library/

https://blogs.msdn.microsoft.com/vcblog/2013/02/26/the-c-rest-sdk-casablanca/

http://aka.ms/azure-iot-hub-vs-cs-2017-c

Любая помощь, которая может направить меня в правильном направлении, высоко ценится!

РЕДАКТИРОВАТЬ: c # версия

using System;
using Microsoft.Azure.Devices.Client;
using Newtonsoft.Json;
using System.Text;
using System.Threading.Tasks;

class AzureIoTHubClient
{
    private static DeviceClient s_deviceClient;
    private readonly static string s_connectionString = "HostName={0}.azure-devices.net;DeviceId={1};SharedAccessKey={2}";

    // Async method to send simulated telemetry
    private static async void SendDeviceToCloudMessagesAsync(string sData)
    {
        // Initial telemetry values   
        string currentTopic = "productionevent";

        // Create JSON message
        var telemetryDataPoint = new
        {
            topic = currentTopic,
            data = sData,
        };
        var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
        var message = new Message(Encoding.ASCII.GetBytes(messageString));

        // IoT hub can filter these properties without having access to the message body.
        message.Properties.Add("topic", "productionevent");

        // Send the telemetry message
        await s_deviceClient.SendEventAsync(message);
        Console.WriteLine("{0} > Sending message: {1}", DateTime.UtcNow, messageString);

        await Task.Delay(500);
    }
}

Мне удалось заставить его работать в c # с другим библиотека с именем Microsoft.Azure.Devices.Client .

Я сделал это, чтобы попытаться импортировать этот проект .NET в мою программу на С ++. Тем не менее, это не идеально:

  • Я бы предпочел увидеть решение на С ++.

  • Я мог бы попытаться запустить эту .NET-программу в моем c ++ приложении. Для этого я просмотрел следующие ресурсы:

Вызов кода C # из Visual C ++

Как вызвать библиотеку C # из Native C ++ (с использованием C ++ \ CLI и IJW) - это выглядит многообещающе

https://www.codeproject.com/Tips/695387/Calling-Csharp-NET-methods-from-unmanaged-C-Cplusp

Любая помощь по аутентификации в IoT-хабе Azure на c ++ очень ценится.

TL; DR:

  • Аутентификация в Azure iot Hub в C ++ v120 .NET 4.0 (предпочтительно, в противном случае 4.5)
  • Отправка json-сообщения на iot hub.
  • Включите «заголовки», которые ретранслируют сообщение на служебную шину (как видно в примере c #).
...