2016-08-08 2 views
0

У меня проблемы с архитектурой кода и я ищу совет. Я отправляю несколько запросов на чтение на сервер через udp и распечатываю ответ на чтение. Пример того, как выглядит запрос и ответ. Я возвращаю ответ как одну большую шестую строку, начинающуюся с 0008. Мне нужен способ для кода знать, сколько адресов было отправлено для чтения и какой размер данных был запрошен, и принять во внимание при печати данных. Поскольку размер данных может измениться, я не могу просто разбить строку вверх, используя определенное значение. Я не ищу фактический код, а скорее некоторые идеи о том, как можно справиться с этим.Архитектура кода с помощью узла js

Request 
    00 06 - Opcode 
    00 00 - Block # 
    02 - Count 
    34 97 00 20 - Address 1 
    04 00 - Data Size 1 (bytes) 
    30 97 00 20 - Address 2 
    01 00 - Data Size 2 (bytes) 


Response- 00080001e60300009 
    00 08 - Opcode 
    00 01 - Block # 
    e6 03 00 00 - Data 1 
    09 - Data 2 

    What I am printing right now- e603000009 
    How I want it printed - Address 1 = e6030000 
          Address 2 = 09 ... 

          Address 3 = 00 00 
          etc. 
    (it would know what it is a new data by the data size that was requested and the # of addresses that were requested) 

Часть кода, где я отправляю запрос на чтение и испускать его HTML

app.post('/output3', function(req, res){ 

    res.sendFile(__dirname + '/upload3.html'); 
//Define the host and port values of UDP 

    var HOST= '192.168.0.136'; 
    var PORT= 69;  

    var io = require('socket.io')(http); 

    //Mulitple parameters 
    //setInterval will send message constantly. 
    var client= dgram.createSocket('udp4'); 
    var counter = 0; 

     //array for addresses 
     var address=[]; 
     //array for size 
     var size=[]; 
     //iterate through all addresses and convert to little endian 
     for (var i=0; i<req.body.address.length; i++) { 
     var n= req.body.address[i]; 
     var s = n.toString(16).match(/.{1,2}/g); 
     address[i]= s.reverse().join("").toString(16); // ==> "0x985c0020" (= 2556166176) 
     } 

     //iterate through all size and make hex strings and little endian 
     for (var i=0; i<req.body.size.length; i++) { 
     function pad(number, length) { 
      var my_string = '' + number; 
      while (my_string.length < length) { 
      my_string = '0' + my_string; 
      } 
      return my_string; 
     } 

     var n2= pad(req.body.size[i], 4); 
     var s2 = n2.toString(16).match(/.{1,2}/g); 
     size[i]= s2.reverse().join("").toString(16); 
     } 

     //empty string to add address and size together 
     var x=''; 
     for (var i=0; i<req.body.address.length; i++) { 
     x += address[i]+size[i]; 
     } 

     console.log(req.body.size); 
     var mrq= read(x); 

     //Open listener to recieve intial message and print in to webpage 
     io.on('connection', function(socket){ 
     var mrq= read(x); 
      io.emit('mrq', mrq); 
     }); 
     function read() { 
     // Memory Read Request is a 16-bit word with a value of 6 
     var message = '0006' 
     // Block number is a 16-bit word that we will always set to 0 
     message += '0000' 
     // Count is variable, and calculated by the size of the parameter list 
     message += '02' 

     for (var i=0; i < arguments.length; i++) { 
      message += arguments[i]; 
     } 
     return message; 
     } 


     var message = new Buffer(mrq, 'hex'); 
     counter++; 

     var loop= setInterval(function() { 
     //Sends packets to UDP and setInterval sends packets again for specific time 
     client.send(message, 0, message.length, PORT, HOST, function (err, bytes) { 
     if (err) throw err; 
     }); 
     if (counter === 1000000000000000) { 
     clearInterval(loop); 
     } 
    }, 1/50); 



    //Open listener to recieve intial message and print in to webpage 
    io.on('connection', function(socket){ 
     client.on('message', function(message, rinfo){ 
     //hex string 
     var temp = message.readUIntBE(0, 2); 
     //console.log(message.toString(16)); 
     io.emit('temp', temp); 
     }); 
    }); 

ответ

0

Показаны текущий код поможет нам ответить на этот вопрос лучше.

но, в общем, способ будет использовать поток записи и вытолкнуть вашу строку в виде кусков, а не как целый блок.

+0

У меня есть частичный код выше. – jay

Смежные вопросы