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();
}
所以。在所有背景下(对不起!),我将这个问题视为两个问题:
- 正确格式的PubNub JSON数据。
- 在当前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);