如何防止Node.js服务器的重复响应

时间:2016-09-23 21:25:37

标签: node.js socket.io node-serialport

我们遇到了一个问题,我们从节点服务器发送多个响应,通过套接字服务器(socket.io)连接到Web客户端。通过使用Docklight进行监听,我可以看到我们实际上只是从串行设备获得单个响应,但由于某种原因,节点服务器正在发送多个,并且它们会累积,因此第一次发送串行命令时(并不重要的是什么命令)可能只会得到一对,下次再多一次,下次再多几次等等。因此,如果您运行多个串行命令,您将获得大量多个响应。

我们的环境是Windows 7 64位,Node V 4.5.0,serialport V 4.0.1。但是,这需要在Windows,Mac和Mac上运行。 Linux,当我们完成。开发团队(我和另外一个人)对Node来说都是相当新的,但是其他有能力的开发人员。

我认为发生的事情是我没有使用.flush()&amp; .drain()正常运行,串口缓冲区仍包含串行数据。我们的专有设备在命令完成时返回S><Executed/>提示,因此我将串行响应存储在缓冲区中,直到我看到其中一个,然后处理数据(在此示例中仅提供布尔响应,无论设备是否响应其中一个或另一个)。例如,如果我向其中一个设备发送<CR><LF>,则应该S>(或<Executed/>取决于)。

客户端使用以下命令调用服务器:

socket.on('getDeviceConnected', readDeviceResponse);

function readDeviceResponse(isDeviceResponding) {
    console.log('getDeviceConnected');
    console.log(isDeviceResponding);
}
function getDeviceConnected() {
    console.log("Sending carriage return / line feed.");
    socket.emit('getDeviceConnected', '\r\n');
}

在服务器上,我正在尝试:

    socket.on('getDeviceConnected', function (connectionData) {
        //write over serial buffer before the write occurs to prevent command accumulation in the buffer.
        serialBuffer = '';
        sbeSerialPort.write(connectionData, function (err, results) {
            //since there's no way to tell if the serial device hasn't responded, set a time out to return a false after allowing one second to elapse
            setTimeout(function () {
                console.log('Inside getDeviceConnected setTimeout');
                console.log('Is serial device responding:', isSerialDeviceResponding);
                if (!isSerialDeviceResponding) {
                    console.log('Serial device timed out.');
                    socket.emit('getDeviceConnected', false);
                }
            }, 1000);
            if (err) {
                console.log('Serial port error level:', err);
            }
            if (results) {
                if (results === 2) {
                    console.log('Serial port is responding');
                }
            }
        });

        sbeSerialPort.on('data', function (serialData) {
            isSerialDeviceResponding = true;
            console.log('Does S> prompt exist?', serialData.lastIndexOf('S>'));
            while(!serialData.lastIndexOf('S>') > -1 || !serialData.lastIndexOf('<Executed/>') > -1){
                serialBuffer += serialData;
                break;
            }

            if (isSerialDeviceResponding) {
                socket.emit('getDeviceConnected', true);
                isSerialDeviceResponding = true;
            }
            sbeSerialPort.flush(function (err, results) {
                if (err) {
                    console.log(err);
                    return;
                }
                if(results){
                    console.log('Serial port flush return code:', results);
                }                   
            });
        });

我对此处的.flush()实施情况不太确定,而且我省略了.drain()部分,因为它们似乎都没有做任何事情(假设它们是正确的)实现)。

.write()命令完成时,如何确保串行端口缓冲区中没有数据?或者您是否看到了我处理串行数据的其他问题?

在pastebin.com上编辑,源代码:

Server.js

Client.js

HTML

0 个答案:

没有答案