将消息发送到Azure Iot集线器

时间:2018-01-14 16:06:12

标签: c# azure azure-iot-hub scada

我是AzureIot的初学者,我已经获得了拥有IOT中心的azure帐户的权限。 从天蓝色的门户网站我看到一个形式的连接字符串: HostName=iothub-mycompany.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=_somekey_in_base64_

现在我只需要将JSON有效负载发送到此IOT中心。任何协议都可以。

假设,当我发送消息时,我可以使用this device explorer tool看到此消息。但是我不确定我做错了什么,或者我的理解是否存在缺陷。

我尝试了博客,msdn等的示例。最后,我提出了以下代码

它运行,但我不知道它在做什么,在哪里查找此消息是否已发送

  • 设备资源管理器不显示任何内容。

  • 我查看了Activity Login portal.azure.com,但它似乎更像是登录活动日志。

  • 同样在天蓝色的门户网站探索者我看到Iot Devices。我看到了我需要定位的设备名称。(我知道它存在)

以下是代码,是.Net4.5.2 ConsoleApplication的一部分。

Program.cs

class Program
{
    static DeviceClient deviceClient;
    const string IOT_HUB_CONN_STRING = "connection str in format specified above.";
    const string IOT_HUB_DEVICE_LOCATION = "_some_location.";
    const string IOT_HUB_DEVICE = "device_id";

    static void Main(string[] args)
    {
        var ret = SendMessageToIoTHubAsync("temperature", 15);


        Console.WriteLine("completed:" + ret.IsCompleted);


    }
    private static async Task SendMessageToIoTHubAsync(string sensorType, int sensorState)
    {
        deviceClient = DeviceClient.CreateFromConnectionString(IOT_HUB_CONN_STRING, TransportType.Mqtt);//i tried other trsnsports
        try
        {
            var payload = "{" +
                "\"deviceId\":\"" + IOT_HUB_DEVICE + "\", " +
                "\"location\":\"" + IOT_HUB_DEVICE_LOCATION + "\", " +
                "\"sensorType\":\"" + sensorType + "\", " +
                "\"sensorState\":" + sensorState + ", " +
                "\"localTimestamp\":\"" + DateTime.Now.ToLocalTime() + "\"" +
                "}";

            var msg = new Message(Encoding.UTF8.GetBytes(payload));

            Debug.WriteLine("\t{0}> Sending message: [{1}]", DateTime.Now.ToLocalTime(), payload);

            await deviceClient.SendEventAsync(msg);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("!!!! " + ex.Message);
        }
    }
}

作为旁注,我的设备"是ClearScada。我将使用C#Driver从ClearScada实例中获取数据,此驱动程序应将该数据发送到azure iot中心。 本质上我只需要从C#算起来发送  到Azure iot。的问题:

  • 我在哪里可以看到我的消息。
  • 我的功能是正确的还是我的理解存在缺陷。

1 个答案:

答案 0 :(得分:1)

  
      
  • 我在哪里可以看到我的消息。?
  •   

您可以在设备资源管理器中看到您的消息,如下所示:

enter image description here

  
      
  • 我的功能是正确的还是我的理解存在缺陷。
  •   

您的功能有两个问题:

  • 首先,您需要使用设备指定的连接字符串而不是 Azure IoT Hub连接字符串。它具有以下格式:

    " HostName = [你的中心名称] .azure-devices.net; DeviceId = [设备ID]; SharedAccessKey = [设备密钥]"

您可以通过设备资源管理器轻松获取此连接字符串,如下所示:

enter image description here

  • 其次,您的程序完全退出发送操作之前。 您可以通过添加Console.ReadLine();来避免这种情况发生 这样的:

enter image description here

<强>更新

Retrieving the value of the Task.IsCompleted property does not block the calling thread until the task has completed.

您可以像这样编辑main方法:

    static void Main(string[] args)
    {
        var ret = SendMessageToIoTHubAsync("temperature", 15);

        ret.Wait();
        Console.WriteLine("completed:" + ret.IsCompleted);
        Console.ReadLine();
    }