C++ C++;使用CPPRestSDK(“卡萨布兰卡”)向azure IoT中心进行身份验证 编辑:我设法使c版本正常工作(见下文)

C++ C++;使用CPPRestSDK(“卡萨布兰卡”)向azure IoT中心进行身份验证 编辑:我设法使c版本正常工作(见下文),c++,azure,azure-iot-hub,casablanca,cpprest-sdk,C++,Azure,Azure Iot Hub,Casablanca,Cpprest Sdk,原始问题: 我正试图通过cpprestsdk连接Azure的物联网中心,并向其发布json结构的obj。但是,我在任何地方都找不到任何有关身份验证的信息 我遵循了这一点,并试图获得所有可用的文档,但我不确定人们如何通过RESTSDK连接到azure iot hub。有我不知道的扩展吗?因为我找不到任何使用授权的例子。但在MSDN的例子中,他们推得到。这个sdk应该只在本地运行而不启用任何形式的授权吗?我很困惑。。。有人能澄清一下或给我举个例子,说明如何向azure iot hub进行身份验证,然

原始问题:

我正试图通过cpprestsdk连接Azure的物联网中心,并向其发布json结构的obj。但是,我在任何地方都找不到任何有关身份验证的信息

我遵循了这一点,并试图获得所有可用的文档,但我不确定人们如何通过RESTSDK连接到azure iot hub。有我不知道的扩展吗?因为我找不到任何使用授权的例子。但在MSDN的例子中,他们推得到。这个sdk应该只在本地运行而不启用任何形式的授权吗?我很困惑。。。有人能澄清一下或给我举个例子,说明如何向azure iot hub进行身份验证,然后将消息中继到服务总线吗? 我已经为此设置了路由

供参考:我正在使用v120和

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();
    }

}
我设法让它在c#中以不同的方式工作 名为的库

我这样做是为了尝试将这个.NET项目导入到我的C++程序中。然而,这并不理想:

    我宁愿在C++中看到解决方案。
  • 我可以尝试让这个.NET程序在我的c++应用程序中运行。 为此,我浏览了以下资源:

这看起来很有希望

<>对在C++中对Azure的IOT集线器进行认证的任何帮助都是非常值得赞赏的。p> TL;博士:
  • 在C++ V120 .NET 4(首选,否则4.5)
  • 中对Azure IOT集线器进行身份验证
  • 向物联网中心发送json解析消息
  • 包括将消息中继到服务总线的“头”(如c#示例所示)
是否要连接到设备或Azure站点?当然,您可以连接到任何想要连接的https链接。这不仅仅是为了当地人。此外,在发出webrequest时,必须指定标题。过去,我在项目中使用过卡萨布兰卡cpprestsdk。它工作得很好。
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);
    }
}