使用 Plotly.js 和 Node.js 获取和绘制数据

Using Plotly.js and Node.js to get and plot data

我正在尝试创建一个简单的网页,它从微控制器 (MSP432) 获取数据并将其实时绘制在图表上。

我已经研究过,目前正在使用 plotly.js 和 html 来创建图表。我目前有一个图表,可以实时使用随机数据更新自身。

我附上了下面页面的代码。

我现在想将数据流式传输进来,我查看了 node.js,尤其是串行端口库。我想我已经安装了串口 npm。

我感到困惑的部分是 node.js 代码如何适应我的 html/plotlyjs 索引文件?

我以前从未使用过javascript。这是我第一次使用 nodejs,所以我很困惑。我应该把它放在 <script> 标签中 getX() getY() 函数中吗?

还有谁知道我该如何启动 nodejs 代码?我有点迷路了。

这是我的 index.html 文件:

     <!DOCTYPE html>

     <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
     <head>
         <script src="plotly.min.js"></script>
         <meta charset="utf-8" />
         <title>My Plot Page</title>
    </head>
    <body>
         <p>Plotly plot:</p>
         <div id="chart1"></div>
         <script>
            var counter = 0;
            function getX() {
             counter++;
             return counter;
            }
            function getY() {
             return Math.random();
            }
            Plotly.plot('chart1', [{
             x: [getX()],
             y: [getY()],
             type: 'line'
            }]);
            setInterval(function () {
              Plotly.extendTraces('chart1', { x: [[getX()]] , y: [[getY()]] }, [0])
    }, 200);
         </script>
    </body>
    </html>

根据经验(我使用数据可视化系统),我可以告诉你 Plotly 可能不是绘制 real-time 数据的最简单方法。它肯定可以做到,但它所做的是re-render每个新点的整个图,考虑到数据结构,这不是最有效的方法,更新时看起来有点不自然。

在您的用例中,我会推荐这个插件:http://smoothiecharts.org/ 它是轻量级的、免费的,而且 "smooth"。阅读他们网站上的“10 分钟教程”,您就可以开始了。

总而言之,对于每个 smoothiecharts 时间序列,您想使用 append() 方法添加每个新数据样本。您可以使用 setTimeInterval() JavaScript 方法调用它,从... URL(发出 AJAX GET 请求)获取值。您想要创建一个 URL 始终 return 来自您的传感器的最新读数,为此您需要创建一个本地网络服务器。

这就是您的 NodeJS 应用程序的用武之地:使用 GET 方法创建一个简单的 NodeJS 服务器,return从您的设备读取最新数据。这样的东西足以 return 像数字这样的简单内容: https://www.tutorialspoint.com/nodejs/nodejs_first_application ,您可以先打印一个随机数并对其进行处理,直到它起作用,然后再继续。

这里最难的部分是将微控制器的读数导入 NodeJS 应用程序。我不知道 MSP432 的具体细节或您如何连接到它,但通常您可以编写一个 C 脚本从中读取最新值并将其打印到控制台。

如果您设法做到这一点,您可以使用以下 NodeJS 代码来执行您的 C 程序并读取其控制台输出:

var exec = require('child_process').execFile;
var path = 'c:\yourprogram.exe';
var fun = function() {
   exec(path, function(err, data) {  
        console.log(err)
        console.log(data.toString());                       
    });
}
fun();

您可以轻松地将代码调整为一个函数,该函数更新您的服务器 returns 的 NodeJS 变量,并且 运行 它每 X 毫秒循环一次。

这就是您的完整可视化系统。

Node.js是一个开源服务器环境。它用于托管网络服务器,不能 运行 在网络浏览器中。可用于读取串口数据并发送给连接的客户端。

示例设置如下:

---------------------------------------------------------------------------
| MSP432              node.js server                  web page in browser |
|   M <==================>  N  <===========================>  W           |
|           serial                       websockets                       |
---------------------------------------------------------------------------

nodejs服务器(N)从串口读取数据,管理MSP432(M)。服务器 (N) 还托管一个网络服务器(使用 expressjs) and opens a websocket with the connected webpage (W) to transfer new data. An easy to use websocket library is socket.io.

可以通过以下方式创建一个简单的 nodejs 网络服务器:

express --view=pug <your application name>

请注意 ejs 也可以用来代替 pug

ajax也可以用来代替websockets