Как узнать общее количество устройств и общее количество сообщений, отправленных в Azure IoT hub c # - PullRequest
0 голосов
/ 21 октября 2018

у нас есть только эти два метода для Azure IoThub в c #.

Device device = await registryManager.GetDeviceAsync("deviceId");

и

device = await registryManager.GetDevicesAsync("max count");

, но как узнать количество доступных устройств или количество активных устройств, а такжеколичество сообщений с помощью c #?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Значения, которые вас интересуют, являются частью метрики Azure IoT Hub .В основном вы можете получить их:

  • , используя REST API и здесь
  • Добавление диагностических настроек дляAzure IoT Hub и выберите один из следующих пунктов назначения для AllMetrics :
    1. для архивирования в управляемом событиями хранилище .Используя подписчика, такого как функция EventGridTrigger, с привязкой входного блоба, метрики можно запрашивать в теле функции.
    2. или отправлять метрики в потоковый канал через Event Hub и использоватьзадание потоковой аналитики для запроса данных метрик.
0 голосов
/ 06 ноября 2018

Количество устройств можно получить с помощью запроса устройства , например:

SELECT COUNT() AS numberOfDevices FROM c

, который возвращает что-то вроде этого:

[ { "numberOfDevices": 123 } ]

Чтобы получить количество сообщений , вам необходимо подключиться к конечной точке, совместимой с концентратором событий, подключиться к каждому нижележащему разделу и посмотреть на каждый Информация о разделе ( Последний порядковый номер и Последовательный номер ).Однако при этом сохраняется некоторая задержка данных, поэтому, если вы не добавите к этому больше логики, вы получите число, представляющее число сообщений , находящихся на данный момент , присутствующих в концентраторе, а не общее количество с момента создания, а не общее оставшееся количество.

Обновление: вот код, показывающий пару методов для получения количества устройств:

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.Devices;
using Newtonsoft.Json;

namespace Test
{
    class Program
    {
        static async Task Main()
        {
            string connString = "HostName=_______.azure-devices.net;SharedAccessKeyName=_______;SharedAccessKey=_______";
            RegistryManager registry = RegistryManager.CreateFromConnectionString(connString);

            // Method 1: using Device Twin
            string queryString = "SELECT COUNT() AS numberOfDevices FROM devices";
            IQuery query = registry.CreateQuery(queryString, 1);
            string json = (await query.GetNextAsJsonAsync()).FirstOrDefault();
            Dictionary<string, long> data = JsonConvert.DeserializeObject<Dictionary<string, long>>(json);
            long count1 = data["numberOfDevices"];

            // Method 2: using Device Registry
            RegistryStatistics stats = await registry.GetRegistryStatisticsAsync();
            long count2 = stats.TotalDeviceCount;
        }
    }
}
0 голосов
/ 21 октября 2018

Насколько я знаю,

Не существует прямого способа получить total number of devices.В качестве альтернативы вы можете создать список, и всякий раз, когда вы добавляете устройства с помощью AddDeviceAsync, вы должны помещать объект в список.

То же самое с общим количеством сообщений, вы должны создаватьваш собственный способ сохранить значение обновленным.

Следующий код должен помочь.

static async Task startClient(string IoTHub, string IoTDevicePrefix, int deviceNumber, string commonKey, int maxMessages, int messageDelaySeconds)
{
    allClientStarted++;
    runningDevices++;
    string connectionString = "HostName=" + IoTHub + ";DeviceId=" + IoTDevicePrefix + deviceNumber + ";SharedAccessKey=" + commonKey;
    DeviceClient device = DeviceClient.CreateFromConnectionString(connectionString, Microsoft.Azure.Devices.Client.TransportType.Mqtt);
    await device.OpenAsync();
    Random rnd = new Random();
    int mycounter = 1;
    Console.WriteLine("Device " + IoTDevicePrefix + deviceNumber + " started");

    while (mycounter <= maxMessages)
    {
        Thread.Sleep((messageDelaySeconds * 1000) + rnd.Next(1, 100));
        string message = "{ \'loadTest\':\'True\', 'sequenceNumber': " + mycounter + ", \'SubmitTime\': \'" + DateTime.UtcNow + "\', \'randomValue\':" + rnd.Next(1, 4096 * 4096) + " }";
        Microsoft.Azure.Devices.Client.Message IoTMessage = new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(message));
        await device.SendEventAsync(IoTMessage);
        totalMessageSent++;
        mycounter++;
    }
    await device.CloseAsync();
    Console.WriteLine("Device " + IoTDevicePrefix + deviceNumber + " ended");
    runningDevices--;
}

static void createDevices(int number)
{
    for (int i = 1; i <= number; i++)
    {
        var registryManager = RegistryManager.CreateFromConnectionString(iotHubConnectionString);
        Device mydevice = new Device(IoTDevicePrefix + i.ToString());
        mydevice.Authentication = new AuthenticationMechanism();
        mydevice.Authentication.SymmetricKey.PrimaryKey = commonKey;
        mydevice.Authentication.SymmetricKey.SecondaryKey = commonKey;
        try
        {
            registryManager.AddDeviceAsync(mydevice).Wait();
            Console.WriteLine("Adding device: " + IoTDevicePrefix + i.ToString());
        }
        catch (Exception er)
        {
            Console.WriteLine("  Error adding device: " + IoTDevicePrefix + i.ToString() + " error: " + er.InnerException.Message);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...