如何在 nodejs 中通过 TCP/IP 获取传感器数据?

Posted

技术标签:

【中文标题】如何在 nodejs 中通过 TCP/IP 获取传感器数据?【英文标题】:How to get sensor data over TCP/IP in nodejs? 【发布时间】:2014-04-16 05:16:27 【问题描述】:

我有一个带有 socket.io 的 nodejs 应用程序。 要对此进行测试,请将以下清单另存为 app.js。安装node,然后npm install socket.io,最后在命令提示符下运行:node app.js

var http = require('http'),
fs = require('fs'),
// NEVER use a Sync function except at start-up!
index = fs.readFileSync(__dirname + '/index.html');

// Send index.html to all requests
var app = http.createServer(function(req, res) 
    res.writeHead(200, 'Content-Type': 'text/html');
    res.end(index);
);

// Socket.io server listens to our app
var io = require('socket.io').listen(app);

// Send current time to all connected clients
function sendTime() 
    io.sockets.emit('time',  time: new Date().toJSON() );


// Send current time every 10 secs
setInterval(sendTime, 5000);

// Emit welcome message on connection
io.sockets.on('connection', function(socket) 
    socket.emit('welcome',  message: 'Welcome!' );

    socket.on('i am client', console.log);
);

app.listen(3000);

此代码将数据发送到文件 index.html。 运行 app.js 后,在浏览器中打开此文件。

<!doctype html>
<html>
    <head>
        <script src='http://code.jquery.com/jquery-1.7.2.min.js'></script>
        <script src='http://localhost:3000/socket.io/socket.io.js'></script>
        <script>
            var socket = io.connect('//localhost:3000');

            socket.on('welcome', function(data) 
                $('#messages').html(data.message);

                socket.emit('i am client', data: 'foo!');
            );
            socket.on('time', function(data) 
                console.log(data);
                $('#messages').html(data.time);
            );
            socket.on('error', function()  console.error(arguments) );
            socket.on('message', function()  console.log(arguments) );
        </script>
    </head>
    <body>
        <p id='messages'></p>
    </body>
</html>

现在发送的数据是当前时间,index.html 工作正常,每五秒更新一次时间。

我想修改代码,以便它通过 TCP 读取我的传感器数据。我的传感器通过数据采集系统连接,并通过 IP:172.16.103.32 端口:7700 中继传感器数据。 (这是通过 LAN 进行的,因此您无法访问。)

如何在 nodejs 中实现?

SensorMonkey 是一个可行的选择吗?如果是这样,关于如何使用它的任何指示?

【问题讨论】:

所以你的意思是说你想接收从 node.js 中的传感器发送的数据并且你想发送给客户端? 没错,也可能将数据存储在数据库中。 我认为如果您的传感器能​​够以某种方式将数据直接发送到您的 node.js 服务器运行的 IP/PORT,您的问题就可以解决。因此,您可以从“请求事件”获取发送给客户端的数据 【参考方案1】:

我现在有一个不错的 hack,我请求读者对此发表评论....


var net = require('net'),
http = require('http'),
port = 7700,                    // Datalogger port
host = '172.16.103.32',         // Datalogger IP address
fs = require('fs'),
// NEVER use a Sync function except at start-up!
index = fs.readFileSync(__dirname + '/index.html');

// Send index.html to all requests
var app = http.createServer(function(req, res) 
    res.writeHead(200, 'Content-Type': 'text/html');
    res.end(index);
);

// Socket.io server listens to our app
var io = require('socket.io').listen(app);

// Emit welcome message on connection
io.sockets.on('connection', function(socket) 
    socket.emit('welcome',  message: 'Welcome!' );

    socket.on('i am client', console.log);
);

//Create a TCP socket to read data from datalogger
var socket = net.createConnection(port, host);

socket.on('error', function(error) 
  console.log("Error Connecting");
);

socket.on('connect', function(connect) 

  console.log('connection established');

  socket.setEncoding('ascii');

);

socket.on('data', function(data) 

  console.log('DATA ' + socket.remoteAddress + ': ' + data);
  io.sockets.emit('livedata',  livedata: data );        //This is where data is being sent to html file 

);

socket.on('end', function() 
  console.log('socket closing...');
);

app.listen(3000);

参考资料:

    Socket.io 网站 - www.socket.io - 现在是流行语。 TCP Socket Programming Nodejs "net" module Simplest possible socket.io example.

【讨论】:

你好,我可以知道如何处理 TCP 通信中突然发生的网络错误或以太网电源关闭事件吗?当出现网络错误时,错误事件监听器的回调没有被正确调用,如何处理这种情况,请帮助我 - 这是我在项目中的问题之一 据我了解,NodeJS 只能“捕获”那些报告给它的错误,因此网络故障与以太网电源关闭没有任何不同。您可以添加一个关于此的新问题。在这种情况下,我通常会做的是,如果服务器崩溃,请重新启动它。 Node.js 在连接重置或类似情况时通知错误,或者如果服务器或客户端发送 FIN 数据包则结束连接 - 我所做的是在一定间隔内 ping 并确保一切都在线(现在的解决方案)如果有任何异常我重新连接/通知管理员

以上是关于如何在 nodejs 中通过 TCP/IP 获取传感器数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 pentaho CDE 中通过kettleTransFromFile 将参数传递给 pentaho 水壶

vue 项目中通过监听 localStorage 的变化进行父子页面传参

vue 项目中通过监听 localStorage 的变化进行父子页面传参

vue 项目中通过监听 localStorage 的变化进行父子页面传参

vue 项目中通过监听 localStorage 的变化进行父子页面传参

在C中通过命令行传递整数?