ASP.NET Dynamic SignalR Концентраторы? группы? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть веб-элементы управления (датчики). Я создаю динамически от 1 до x (не более 30) в зависимости от настроек задания при загрузке страницы. Код SignalR Hub находится на таймере, который срабатывает каждые 20 секунд. Таким образом, мои динамические датчики получают данные каждые 30 секунд . Я устанавливаю значение для элемента управления с помощью функции javascript клиента guage.set_vale (). Эта функция циклически повторяется каждые 30 секунд, когда запускается концентратор, и устанавливает значения.

   For i As Integer = 0 To 7
        Dim UserControl As WebUserControl1 = CType(Me.LoadControl("~/WebUserControl1.ascx"), WebUserControl1)
        UserControl.ID = "RG" & (i)  ''1_RadGauge

        UserControl.ControlWidth = 9
        UserControl.setTankNumber = i + 20
        Me.Panel1.Controls.Add(UserControl)

    Next

В настоящее время все элементы управления получают данные из одного и того же концентратора. Данные, которые передают эти элементы управления, являются базой данных SQL на стороне сервера.

SELECT top(1) * from zSignalR_DB_Test order by id desc

Таким образом, все элементы управления показывают те же данные. Я хочу, чтобы каждый элемент управления показывал свои данные. Таким образом, каждый элемент управления будет получать свои собственные данные из базы данных

    SELECT top(1) * from zSignalR_DB_Test WHERE ID = 'MyControlID' order by id desc

Я смотрел на группы SignalR, но не видел, как делать то, что я пытаюсь сделать. Таким образом, все, что мне нужно сделать, это связать controlID с данными в базе данных.

Мои вопросы:

Нужен ли отдельный SignalR Hub для каждого элемента, который я создаю динамически?

Нужно ли динамически создавать эти концентраторы?

Является ли SignalR Groups правильным способом сделать это?

Если я обновляюсь каждые 30 секунд или минуту, могу ли я просто создать метод, который отправляет идентификатор обратно клиенту, и когда я перебираю каждый элемент управления в клиенте (возможно, добавляю паузу в 1 секунду), отправляю идентификатор запустить другой оператор SQL?

Любые мысли или примеры были бы великолепны.

Дополнительный код:

  <script type="text/javascript">
  $(function() {
        var logger = $.connection.loghub;
        logger.client.logMessage = function(msg) { 

            var ajaxPanel = document.getElementById("Panel1");  
            for (var x = 0; x < ajaxPanel.children.length; x=x+2) {  

                if (msg <=50){
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'visible'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'hidden'
                } else {
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'hidden'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'visible'
               }

                var TBValueElement = ajaxPanel.children[x].children[3].children[0];
                var TBValue = $find(TBValueElement.id);
                TBValue.set_value(msg + "%");

                var linearGaugeElement = ajaxPanel.children[x].children[4];
                var linearGauge = $find(linearGaugeElement.id);                           
                linearGauge.set_value(msg);  
            }
        };
        $.connection.hub.start();
    });     
</script>

1 Ответ

0 голосов
/ 05 мая 2018

В примере SignalIR указано .. «После запуска серверов и подключения клиентов сообщения, отправленные одним клиентом, будут отображаться во всех подключенных клиентах», вам просто нужно будет направить данные отдельных клиентов на правильный элемент управления или «датчик». Создайте класс для хранения, форматирования и доступа к вашим данным.

При этом SignalIR основан на WebSocket (s), который представляет собой прекрасный асинхронный сервис в режиме реального времени. Веб-сокеты не ограничены реализацией .Net, и даже если arduino может быть настроен как клиент или сервер.

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

ws.onmessage = function(e){
  var msg = "";
  var commandstring = "";
  var loadstring = "";
  if(e.data instanceof ArrayBuffer){
    msg = "BIN:";
    var bytes = new Uint8Array(e.data);
    for (var i = 0; i < bytes.length; i++) {
      msg += String.fromCharCode(bytes[i]);
    }
  } 
  else
  {
   msg = e.data;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...