Plot 实时数据和检索绘图

Plot 实时数据和检索绘图,plot,real-time,data-retrieval,Plot,Real Time,Data Retrieval,因此,我的问题如下:我正在开发一个移动应用程序,它从生命体征传感器获取数据并发送到远程健康服务器,这样医生就可以实时从服务器检索数据,并绘制曲线 由于我在这方面的背景非常薄弱,我的问题分为两个部分:a)我如何实时从服务器检索数据;b)我可以使用HTML5 LIB或类似的工具(如HighCharts、Meteor charts或ZingCharts)绘制数据,还是不可能?请非常具体,因为我在这方面的背景也很薄弱:)在ZingChart中,您可以通过两种方式来实现这一点: 方法1-通过WebSock

因此,我的问题如下:我正在开发一个移动应用程序,它从生命体征传感器获取数据并发送到远程健康服务器,这样医生就可以实时从服务器检索数据,并绘制曲线


由于我在这方面的背景非常薄弱,我的问题分为两个部分:a)我如何实时从服务器检索数据;b)我可以使用HTML5 LIB或类似的工具(如HighCharts、Meteor charts或ZingCharts)绘制数据,还是不可能?请非常具体,因为我在这方面的背景也很薄弱:)

在ZingChart中,您可以通过两种方式来实现这一点:

方法1-通过WebSocket-例如:

websocket传输是refresh/feed部分的一部分,其属性可以在这里找到:ZingChart JSON文档的Graph>>refresh部分。此外,还需要一个服务器套接字组件,它必须遵循一些标准协议,以便允许与客户端套接字进行连接和传输

要了解具体情况,请执行以下操作:

    ###############################
# NodeJS code
###############################

#!/usr/bin/env node

var WebSocketServer = require('websocket').server;
var http = require('http');

var server = http.createServer(function(request, response) {
  response.writeHead(404);
  response.end();
});
server.listen(8888, function() {
  console.log((new Date()) + ' Server is listening on port 8888');
});

wsServer = new WebSocketServer({
  httpServer: server,
  autoAcceptConnections: false
});

function originIsAllowed(origin) {
  return true;
}

wsServer.on('request', function(request) {
  if (!originIsAllowed(request.origin)) {
    request.reject();
    console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
    return;
  }

  var type = '',
    method = '',
    status = 0;

  var connection = request.accept('zingchart', request.origin);

  connection.on('message', function(message) {

    function startFeed() {
      console.log('start feed');
      status = 1;
      if (method == 'push') {
        sendFeedData();
      }
    }

    function stopFeed() {
      console.log('stop feed');
      status = 0;
    }

    function sendFeedData() {
      if (method == 'push') {
        var ts = (new Date()).getTime();
        var data = {
          "scale-x": ts,
          "plot0": [ts, parseInt(10 + 100 * Math.random(), 10)]
        };
        console.log('sending feed data (push)');
        connection.sendUTF(JSON.stringify(data));
        if (status == 1) {
          iFeedTick = setTimeout(sendFeedData, 500);
        }
      } else if (method == 'pull') {
        var data = [];
        var ts = (new Date()).getTime();
        for (var i = -5; i <= 0; i++) {

          data.push({
            "scale-x": ts + i * 500,
            "plot0": [ts + i * 500, parseInt(10 + 100 * Math.random(), 10)]
          });
        }
        console.log('sending feed data (pull)');
        connection.sendUTF(JSON.stringify(data));
      }
    }

    function sendFullData() {
      var data = {
        type: "bar",
        series: [{
          values: [
            [(new Date()).getTime(), parseInt(10 + 100 * Math.random(), 10)]
          ]
        }]
      };
      console.log('sending full data');
      connection.sendUTF(JSON.stringify(data));
      if (status == 1) {
        if (method == 'push') {
          setTimeout(sendFullData, 2000);
        }
      }
    }

    if (message.type === 'utf8') {
      console.log('************************ ' + message.utf8Data);
      switch (message.utf8Data) {
      case 'zingchart.full':
        type = 'full';
        break;
      case 'zingchart.feed':
        type = 'feed';
        break;
      case 'zingchart.push':
        method = 'push';
        break;
      case 'zingchart.pull':
        method = 'pull';
        break;
      case 'zingchart.startfeed':
        startFeed();
        break;
      case 'zingchart.stopfeed':
        stopFeed();
        break;
      case 'zingchart.getdata':
        status = 1;
        if (type == 'full') {
          sendFullData();
        } else if (type == 'feed') {
          sendFeedData();
        }
        break;
      }

    }
  });

  connection.on('close', function(reasonCode, description) {
    status = 0;
    console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
  });
});

###############################################
# Sample JSON settings for socket transport
###############################################

refresh: {
    type: "feed",
    transport: "websockets",
    url: "ws://198.101.197.138:8888/",
    method: "push",
    maxTicks: 120,
    resetTimeout: 2400
}

or

refresh: {
    type: "feed",
    transport: "websockets",
    url: "ws://198.101.197.138:8888/",
    method: "pull",
    interval: 3000,
    maxTicks: 120,
    resetTimeout: 2400
}
###############################
#NodeJS代码
###############################
#!/usr/bin/env节点
var WebSocketServer=require('websocket').server;
var http=require('http');
var server=http.createServer(函数(请求、响应){
书面答复(404);
response.end();
});
侦听(8888,函数(){
log((new Date())+“服务器正在侦听端口8888”);
});
wsServer=新的WebSocketServer({
httpServer:server,
自动接受连接:false
});
允许函数原点(原点){
返回true;
}
wsServer.on('request',函数(request){
如果(!originIsAllowed(request.origin)){
request.reject();
console.log((new Date())+“来自源站的连接”+request.origin+“已拒绝”);
返回;
}
变量类型=“”,
方法=“”,
状态=0;
var connection=request.accept('zingchart',request.origin);
connection.on('message',函数(message){
函数startFeed(){
log('start feed');
状态=1;
如果(方法=='push'){
sendFeedData();
}
}
函数stopFeed(){
console.log('stop feed');
状态=0;
}
函数sendFeedData(){
如果(方法=='push'){
var ts=(新日期()).getTime();
风险值数据={
“x标度”:ts,
“plot0:[ts,parseInt(10+100*Math.random(),10)]
};
console.log('发送提要数据(推送)');
connection.sendUTF(JSON.stringify(data));
如果(状态==1){
iFeedTick=设置超时(sendFeedData,500);
}
}else if(方法=='pull'){
var数据=[];
var ts=(新日期()).getTime();
对于(var i=-5;i