Записывать и получать данные внутри socket.on ('data') - PullRequest
0 голосов
/ 21 октября 2019
var net = require('net');
var MongoClient = require('mongodb').MongoClient;
const ObjectID = require('mongodb').ObjectID;

var url = "MONGOURL";
const machines=[
{
    _lastid:'',
    _lastevent:'',
    m_id:1,    
    ip:'10.12.2.254',
    socket:new net.Socket(),
    texfile:'e',
    pcs:0,
    start:false,
    },
/*{
    m_id:2,
    ip:'10.12.2.253',
    socket:new net.Socket(),
    texfile:'',
    pcs:0,      
    ctrlSocket: new net.Socket(),  
}*/
];




    MongoClient.connect(url, (err, db)=>{
        if (err) throw err;
        var dbo = db.db("circutest");
            //Itero per ogni macchina descritta nell'array
            machines.forEach(m => {

                //Mi connetto al socket della macchina
                m.socket.connect(//port,m.ip,(err)=>{
                    if (err) throw err;
                    console.log("CONNECTED TO HOST"+ m.ip);                       
                    var index=4;
                    var eventi=0;

                    const write=()=>{
                            m.socket.write(`TCP COMMAND`,{},(err)=>{
                                if (err) throw err;
                            });                                                       
                    }                       
                    setInterval(write,5000);
                    //Mi metto in ascolto per la ricezione di dati
                    m.socket.on('data', (data) =>{ 
                        //Aspetto la ricezione completa dei dati
                        var completeData=completeData + data;
                        console.log(completeData);
                        //Splitto i dati in un array
                        eventi=completeData.split('');
                        console.log(eventi[3]);
                        //Confronto il tipo di evento
                        if(eventi[3]=='result of 2nd command')
                        {   if(m._lastevent!='0109'){
                                m._lastid= new ObjectID();
                                console.log('ID Durante Inserimento'+m._lastid);                                    
                                console.log('Verifico Stato');                                                                             
                                m.texfile=eventi[eventi.length -2];
                                console.log(eventi[eventi.length -2]);
                                var newdocquery = { _id:m._lastid,m_id: m.m_id, date:Date.now(), texfile: m.texfile, pcs:0 };
                                dbo.collection("prova").insertOne(newdocquery, (err, res) =>{
                                    if (err) throw err;                       
                                });
                                m._lastevent='0109';
                            }   
                        }
                        if(eventi[3]=='1st command'){

                            //Itero gli elementi dell'array per vedere gli eventi
                            eventi.forEach(e=>{
                                if(e.substring(0,4)=='0109')
                                {   m.pcs=1;

                                    console.log("AZZERAMENTO DELLA MACCHINA");                                                                             
                                        m.socket.write(`2nd command`,{},(err)=>{
                                            if (err) throw err;                                                                                       
                                        });                                                                                                                           
                                }
                                if(e.substring(0,4)=='0401')
                                {   /*if(!m.start) 
                                    {

                                            dbo.collection("lastdocs").find({m_id:m.m_id},{ projection: { texfile: 1, lastID:1 } }).toArray(  (err,res)=>{
                                            m.texfile= res[0].texfile;
                                            m._lastid=`ObjectId("${res[0].lastID}")`;
                                            console.log(res[0].lastID);
                                            console.log("await");
                                        });
                                        m.start=true;
                                    }*/
                                    m.pcs=m.pcs+1;
                                    m._lastevent='0401';
                                    console.log("NUOVA CALZA"); 


                                    if(m._lastid==''){m._lastid=new ObjectID()};   
                                    console.log(m._lastid);                                    
                                    var myquery = {_id:m._lastid, m_id: m.m_id, texfile:m.texfile};
                                    var newvalues = {$setOnInsert:{_id:m._lastid}, $set: { pcs:m.pcs, date:Date.now()} };
                                    dbo.collection("prova").updateOne(myquery, newvalues, {upsert:true},(err, res) =>{
                                        if (err) throw err;    

                                    });                                                                             

                                }

                            });

                            if(index<500)
                            {
                                index=Number.parseInt(eventi[eventi.length-2])+1;
                                console.log(index);
                            }
                            if(index==500)
                            {
                                index=0;
                            }

                        }
                    });          
                });

            });



    });

Привет всем, я ищу способ управления примерно 40 производственными машинами. Я отправляю машине команду tcp, чтобы получить некоторую информацию о состоянии машины. Когда результат этой команды имеет определенную строку, мне нужно отправить еще одну команду на машину и ждать результата, прежде чем идти вперед. Теперь я использую forEach, чтобы проверить все строки, и когда я нашел нужную мне строку, я пишу с одним и тем же сокетом на машину. Но я не могу вернуть данные немедленно, цикл завершается, и после того, как он закончил, он возвращает данные, это не правильно. Как я могу это сделать? Не могли бы вы мне помочь? Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...