Создайте потоковую диаграмму в реальном времени за 5 минут (Smoothie JS + сервер Butterfly .NET)

Давайте создадим простое веб-приложение, которое передает и отображает данные в реальном времени с веб-сервера, как это…

Для этого нам всего лишь нужно…

  • Создайте сервер с помощью Butterfly Server .NET, который предоставляет данные в реальном времени
  • Создайте клиент, который подключается к Butterfly Server .NET и отображает данные в реальном времени в Smoothie Chart.

Чтобы создать наш клиент, мы изменим Учебное пособие по диаграммам Smoothie и будем использовать пакет Butterfly Client для подключения к серверу и получения данных в реальном времени (под капотом используется WebSocket).

Хотя конечный результат выглядит так же, как и в Учебнике по диаграммам смузи, есть важное отличие. В этом посте показано, как получать данные в реальном времени с сервера, а не просто генерировать случайные данные в клиенте.

Это предполагает, что у вас установлены Visual Studio и установлен npm.

Создание сервера

Сначала создайте новое консольное приложение .NET Core в Visual Studio с именем MyStreamingApp.

Затем установите Butterfly.Core и Butterfly.EmbedIO с помощью Консоли диспетчера пакетов

Install-Package Butterfly.Core
Install-Package Butterfly.EmbedIO

Затем замените Program.cs этим кодом сервера…

using System;
using Butterfly.Core.Util;
using Butterfly.EmbedIO;
using Dict = System.Collections.Generic.Dictionary<string, object>;
namespace Butterfly.Example.RealtimeStreamingChart {
  class Program {
    static readonly Random random = new Random();
    static void Main(string[] args) {
      using (var ctx = 
        new EmbedIOContext("http://+:8000/", "../../../www")) {
        
        // When a client subscribes to "feed", create
        // an instance of RunEvery that pushes
        // a new row over the channel every 1000ms
        ctx.SubscriptionApi.OnSubscribe("feed",(vars, channel) => {
          return new RunEvery(() => {
            var row = GetRow();
            channel.Queue("data", row);
          }, 1000);
        });
        ctx.Start();
        ProcessX.OpenBrowser($"http://localhost:8000/");
        Console.ReadLine();
      }
    }
    // Replace this with something that reads your real-time data
    static Dict GetRow() {
      return new Dict {
        ["timestamp"] = DateTime.Now.ToUnixTimestamp(),
        ["cpu_core_1"] = random.Next(),
        ["cpu_core_2"] = random.Next()
      };
    }
  }
}

Код выше…

  • Инициализирует веб-сервер EmbedIO для прослушивания порта 8000.
  • Прослушивает подписки на канал feed (подписчики получают случайные данные каждую секунду).

Вы также можете увидеть код сервера здесь.

Примечание. Если вы решите запустить это с помощью dotnet run вместо запуска в Visual Studio, вам нужно изменить "../../../www" на просто "www".

Создание клиента

Сначала создайте папку www в Visual Studio под своим проектом.

Затем откройте командную строку или терминал в каталоге MyStreamingApp/MyStreamingApp/www и запустите…

# just accept the defaults
npm init
npm install butterfly-client

Затем создайте index.html в папке www с этим содержимым…

<!DOCTYPE html>
<html lang="en">
<body>
<div style="text-align: center">
  <canvas id="mycanvas" width="400" height="100"></canvas>
</div>
<script src="//cdnjs.cloudflare.com/ajax/libs/smoothie/1.34.0/smoothie.js"></script>
<script src="node_modules/butterfly-client/lib/butterfly-client.js">
</script>
<script>
  var smoothie = new SmoothieChart({
    grid: {
      strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)',
      lineWidth: 1, millisPerLine: 250, verticalSections: 6,
    },
    labels: { fillStyle: 'rgb(60, 0, 0)' }
  });
  smoothie.streamTo(document.getElementById("mycanvas"), 1500);
  var line1 = new TimeSeries();
  var line2 = new TimeSeries();
  smoothie.addTimeSeries(line1, { 
    strokeStyle: 'rgb(0, 255, 0)', 
    fillStyle: 'rgba(0, 255, 0, 0.4)', 
    lineWidth: 3 
  });
  smoothie.addTimeSeries(line2, { 
    strokeStyle: 'rgb(255, 0, 255)', 
    fillStyle: 'rgba(255, 0, 255, 0.3)', 
    lineWidth: 3 
  });
  
  // Get data from server
  var butterflyClient = window['butterfly-client'];
  var channelClient = new butterflyClient.WebSocketChannelClient({
    url: '/ws'
  });
  channelClient.subscribe({
    channel: 'feed',
    handler: function (messageType, data) {
      console.debug('messageType=' + messageType
        + ',cpu_core_1=' + data.cpu_core_1
        + ',cpu_core_2=' + data.cpu_core_2);
      line1.append(data.timestamp * 1000, data.cpu_core_1);
      line2.append(data.timestamp * 1000, data.cpu_core_2);
    }
  });
  channelClient.connect();
</script>
</body>
</html>

Код выше…

  • Инициализирует Smoothie Chart (подробное объяснение см. в этом учебнике)
  • Использует Butterfly Client для создания экземпляра WebSocketChannelClient, который подключается к серверу и подписывается на канал feed (добавляя любые полученные данные в line1 экземпляры line2)

Вы также можете увидеть код клиента здесь.

пробовать это

В Visual Studio запустите MyStreamingApp. Это запустит сервер и откроет экземпляр браузера для http://localhost:8000/.

Вы должны увидеть что-то подобное в окне браузера…

Вот и все. Вы создали веб-приложение потоковой диаграммы в реальном времени, которое получает данные в реальном времени с сервера.

Следующие шаги

Этот пример демонстрирует способность Butterfly Server .NET передавать данные в реальном времени веб-клиентам; однако Butterfly Server .NET умеет гораздо больше. См. https://butterflyserver.io для получения дополнительной информации.