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, чтобы проверить все строки, и когда я нашел нужную мне строку, я пишу с одним и тем же сокетом на машину. Но я не могу вернуть данные немедленно, цикл завершается, и после того, как он закончил, он возвращает данные, это не правильно. Как я могу это сделать? Не могли бы вы мне помочь? Большое спасибо.