C ++ с использованием CPPRestSDK («Casablanca») для аутентификации в Azure IoT Hub

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

Я пытаюсь подключиться к 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.

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

введите описание изображения здесь

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

(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

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

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 в мою программу на C ++. Однако это не идеально:

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

  • Я мог бы попытаться заставить эту .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 ++ очень ценится.

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

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …