2015-12-23 270 views
0

我试图将这个简单的PHP脚本移植到node.js. 电视机使用RS232,命令为PON打开; POF关闭。将此PHP RS232代码移植到Node.js

这个例子成功地打开我的电视:

<?php 
$rs232_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($rs232_sock, '10.0.1.155', '4999'); 
$rs232_in = pack("H*" ,'02'.bin2hex('PON').'03'); 
socket_write($rs232_sock, $rs232_in, strlen($rs232_in)); 
?> 

我有这样开始了的NodeJS:

var net = require('net'); 
var jspack = require('jspack/jspack.js').jspack;  

client.connect('4999','10.0.1.155', function(){ 
    console.log('CONNECTED'); 
     // Send the RS232 command 
     client.write(jspack.Pack("H",'02'+bin2hex(command)+'03')); 
}).on('data', function(data) { 
    // log the response 
    console.log('DATA: ' + data); 
    // Close the connection 
    client.destroy(); 
}); 

这导致:

net.js:618 
    throw new TypeError('invalid data'); 
    ^

TypeError: invalid data 
    at Socket.write (net.js:618:11) 
    at Socket.<anonymous> (/Users/paul/Sites/homebridge-globalcache-gc100/test.js:79:10) 
    at Socket.g (events.js:261:16) 
    at emitNone (events.js:73:20) 
    at Socket.emit (events.js:167:7) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1051:10) 
+0

我对这个知之甚少,但在[php](http://php.net/manual/en/function.pack.php)中,pack函数接受一个十六进制字符串的“H *”,但[jspack lib](https://github.com/pgriess/node-jspack)似乎使用H作为unsigned short。很确定你不想那样。 “s”还是“c”? – James

回答

1

你不需要额外的库发送二进制数据。这样的事情应该是足够了:

var net = require('net'); 
var PON_MSG = new Buffer('\x02PON\x03', 'binary'); 
var POF_MSG = new Buffer('\x02POF\x03', 'binary'); 

client.connect('4999','10.0.1.155', function() { 
    console.log('CONNECTED'); 
    // Replace `PON_MSG` with `POF_MSG` to do POF instead 
    client.write(PON_MSG); 
}).on('data', function(data) { 
    console.log('DATA: %j', data); 
}); 

另外要注意的是,data事件可以触发多次,所以,当你可以安全地结束连接(如果远程端不这样做自动)取决于协议(以确保您已收到整个回复)。

+0

完美的作品,非常感谢你! –