数据未通过套接字循环发送数据

时间:2019-03-04 22:35:32

标签: node.js raspberry-pi3 mpu6050

我正在尝试将传感器信息从NodeJ实例发送到另一个(最终在另一个服务器上)。启用下面的客户端代码中的while循环时,没有连接或数据发送到服务器。但是,当while循环被注释掉时,我得到了连接和数据。它只是数据的单个对象,但是在不以循环方式提取传感器数据时可以预期。

服务器代码:

'use strict';
const net = require('net');
const PORT = 5000;
const ADDRESS = '127.0.0.1';

let server = net.createServer(onClientConnected);
server.listen(PORT, ADDRESS);

function onClientConnected(socket) {
    console.log(`New client: ${socket.remoteAddress}:${socket.remotePort}`);
    socket.destroy();
}

console.log(`Server started at: ${ADDRESS}:${PORT}`);

function onClientConnected(socket) {
    let clientName = `${socket.remoteAddress}:${socket.remotePort}`;
    console.log(`${clientName} connected.`);
    socket.on('data', (data) => {
    let m = data.toString().replace(/[\n\r]*$/, '');
    var d = {msg:{info:m}};
    console.log(`${clientName} said: ${data.toString()}`);
    socket.write(`We got your message (${m}). Thanks!\n`);
});

socket.on('end', () => {
    console.log(`${clientName} disconnected.`);
});

客户代码:

var n = require('net');
var s = n.Socket();
s.connect(5000, 'localhost');
var i2c = require('i2c-bus');
var MPU6050 = require('i2c-mpu6050');

var address = 0x68;
var i2cl = i2c.openSync(1);
var sensor = new MPU6050(i2cl, address);

//while (true) {
    var data = sensor.readSync();
    console.log(data);
    s.write(data.toString());
//}

1 个答案:

答案 0 :(得分:1)

Node的主事件循环是单线程的,因此在任何时候都只执行一件事。特定线程不会将控制权交还给事件循环以继续处理更多事件,直到完成为止。 Socket.write实际上在被调用时并没有写入套接字。而是在事件循环队列中创建一个任务。 while循环导致当前线程永不退出,并有效地阻止了事件循环,因此以后的套接字写入事件将永远不会得到处理。

以此替换客户端代码应该可以正常工作,并且可以有效地实现您要执行的操作:

var n = require('net');
var s = n.Socket();
s.connect(5000, 'localhost');
var i2c = require('i2c-bus');
var MPU6050 = require('i2c-mpu6050');

var address = 0x68;
var i2cl = i2c.openSync(1);
var sensor = new MPU6050(i2cl, address);

const readData = () => {
    var data = sensor.readSync();
    console.log(data);
    s.write(data.toString());
    setImmediate(readData);
}

readData();

setImmediate表示在处理完其他事件之后执行该功能,在这种情况下,它将是来自Socket.write的事件。 Socket.write函数还提供了一个回调,一旦完成向套接字的数据写入,就会调用该回调。