每个PubNub消息使用多个JSON数据对象渲染PubNub / eon图表行业



pubNub的eon图表寻找一个JSON对象数据集每个单独的PubNub消息。请参阅Git Hub上的Eon-Chart PubNub-C3.js。

要了解可能出现哪种数据,您可以看到PubNub的一些示例。PubNub传感器网络示例显示了预期的数据流格式,每个对象每个消息:https://www.pubnub.com/developers/RealTime-data-streams/sensor-network/

示例不在单个消息JSON看起来像这样(有关实时数据的上述URL):

{"timestamp":1466007459,"radiation_level":"202","humidity":"79.3726","ambient_temperature":"19.48","sensor_uuid":"probe-180ea910","photosensor":"857.83"}

当您每100ms左右发布数据时,这很棒,但是当您处理更快的采样率(每10至20ms一次采样)时,形成一系列对象,然后发送许多数据对象,有时更有利在一个单一的PubNub消息中。

我的问题集中在单个PubNub消息内发送多个JSON对象的能力,然后由Eon-charts解析,然后由Eon-charts渲染,每个JSON数组对象包含其自己的数据键/值对及其自身时间戳。

对于那些以前从未使用过PubNub eon-chart库的人,这是PubNub建议使用上述实时数据流的示例客户端代码:

<html>
  <head>
    <script type="text/javascript" src="http://pubnub.github.io/eon/v/eon/0.0.11/eon.js"></script>
    <link type="text/css" rel="stylesheet" href="http://pubnub.github.io/eon/v/eon/0.0.11/eon.css" />
  </head>
  <body>
    <div id="chart"></div>
    <script>
    // using the example stream from 
    // http://www.pubnub.com/developers/data-streams/sensor-network
    var pubnub = PUBNUB.init({
        subscribe_key: 'sub-c-5f1b7c8e-fbee-11e3-aa40-02ee2ddab7fe',
        ssl: true
    });
    eon.chart({
        pubnub: pubnub,
        history: false,
        channel: 'pubnub-sensor-network',
        limit: 100,
        rate: 10,
        ssl: true,
        debug: true,
        generate: {
            transition: {
                duration: 3
            },
            bindto: '#chart',
            data: {
                x: 'x'
            },
            axis: {
                x: {
                    type: 'timeseries',
                    tick: {
                        format: '%H:%m:%S'
                    }
                }
            }
        },
        transform: function(m) {
            return {
                eon: {
                    'Humidy': m.humidity,
                    'Temperature': m.ambient_temperature,
                    'Light': m.photosensor
                }
            }
        }
    });
    </script>
  </body>
</html>

在上面的示例中,使用所提供的订阅密钥来调用eon.chart(带有列出的选项)订阅列出的通道('pubNub-sensor-network')。在该PubNub订阅上收到新消息后,它使用转换函数转换数据:

transform: function(m) {
            return {
                eon: {
                    'Humidy': m.humidity,
                    'Temperature': m.ambient_temperature,
                    'Light': m.photosensor
                }
            }
        }

这将转换所有可能不是Eon-chart所期望的JSON,它可以理解并在数据处理/用于更新图表之前被调用。

我的感觉/猜测是我想使用的迭代代码循环遍历每个JSON对象(其中每个对象都包含在每个PubNub消息中)收到新的PubNub消息。

PubNub-C3.j中包含的EON-CHART主要功能还包括检索一系列历史记录的PubNub消息的选项(假设您启用了PubNub键/通道的历史记录)。

这很重要的原因是因为启用历史记录选项触发了导致PubNub发送一系列对象的功能,然后Eon-chart客户端通过它们遍布图表。

这几乎正是我们要做的。唯一的区别是我们试图通过每个PubNub消息的结果迭代,而不是专门迭代通过历史记录的消息,然后(完成时)交换到来自新传入消息的渲染数据。

目标是结合两个概念(变换功能和历史迭代概念)。

与历史功能有关的代码肉(pubnub_c3.js内部)看起来像这样:

self.pubnub.history({
          count: options.limit,
          channel: options.channel,
          end: timetoken,
          include_token: true,
          callback: function(payload) {
            var msgs = payload[0]; //data is here
            var start = payload[1]; 
            var end = payload[2];
            clog('History:', msgs.length + ' messages found');
            clog('History:', 'Complete... Rendering');
            i = 0;
            while (i < msgs.length) {
              var a = msgs[i];
              a.message = options.transform(a.message);
              if(a.message && a.message.eon) {
                a = appendDate(a.message.eon, a.timetoken);
                storeData(a, true); 
              } else {
                clog('Rejecting history message as improper format supplied.');
              }
              i++;
            }
            if (msgs.length > 1 && object.json.length < options.limit - 1) {
              page(end);
            } else {
              loadData(object);
              done();
            }

所以。在所有背景下(对不起!),我将这个问题视为两个问题:

  1. 正确格式的PubNub JSON数据。
  2. 在当前PubNub_c3.s函数中正确放置/迭代代码的正确放置。

为了回答这个问题,我在hyperdev.space上创建了一个实例,您可以在此处访问它(已构建了所有代码):https://hyperdev.com/#!/project/project/coal--编织

我的转换代码当前看起来像这样:

transform : function(data) { //I believe any code to itterate through data will happen here
      jsonTimeStampTest.innerText = data[0].vibeTimeStamp; //we properly get the time stamp
      jsonTimeStampTest.innerText = data[0].vibeValue; //we properly get the reading: 12
      jsonLength.innerText = data.length;  //we properly get 10
        var z = 0;
        for(z=0; z<10; z++)
          {
          return { columns : [
              ['x', data[z].vibeTimeStamp,
              'Value', data[z].vibeValue]
            ]};
          }
    }

...但是我最终在控制台中遇到了错误:EON.JS:8015EON消息必须以适当的格式。例如:对象{eon:array [3]}eon:array [3]

尝试了许多不同的品种,似乎无法获得转换代码以正确地添加值。希望你们能提供帮助。

每个有效载荷

多点

可以每个有效载荷发布多个情节点。而不是使用对象名称eon使用名称eons并提供Array。因为您使用 eons属性名称,所以库将知道要循环循环整个数组并绘制每个点。

请注意,如果每次有效载荷发布多个点,您必须使用x_type: "custom"并提供x_id

eons: [
  {
    x: new Date().getTime(),
    value: 1
  },
  {
    x: new Date().getTime(),
    value: 2
  }
] 

这是以100ms增量收集的数据的示例,但仅发布每1,000ms。每个有效载荷都包括10分,分别为100ms。在此处查看一个完整的示例。

setInterval(function(){
  var data = [];
  var date = new Date().getTime();
  for(var i = 0; i < 10; i++) {
      data.push({
          'pub_time': date + (100 * i),
          'Austin': Math.floor(Math.random() * 99)
      });
  }
  pubnub.publish({
    channel: channel,
    message: {
      eons: data
    }
  });
}, 1000);

最新更新