看到nodejs提供了net module,可以发起tcp连接,于是想到了我们的multicastserver,可以用node去接受数据,然后通过websocket,来实时显示后台发送的socket数据。
有想法已经很久了,但是之前只是写到获取到了socket发送来的数据,但是解析数据这块有点问题,没有能很完整的解析所有数据。最近几天又开始写了,卡在了读取byte[]成一个double,纠结了2天,未果。。后来问了群里,才知道node本来就有个buffers模块,直接调用里面的方法就好,有从8位int到32位int和float,double的读取和写入。。。尼玛,早知道就省事多了。。我也想了。。node这种跑在后端的代码,怎么可能不能读取tcp发来的这种byte[]呢。。。
下面是自己写的一个读取short,int,long,String,double转date的工具类,node的buffer没直接读取64位int的。。所以我自己的getLong还是有点用。。。
var byteArrayUtil=(function() {
getShort=function(b,offset){
var value = 0;
for (var i = 0; i < 2; i++) {
var shift = i * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
getInt=function(b,offset){
var value = 0;
for (var i = 0; i < 4; i++) {
var shift = i * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
getLong=function(b,offset){
var value = 0;
for (var i = 0; i < 8; i++) {
var shift = i * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
getDouble=function(b,offset){
var value = 0;
for (var i = 0; i < 8; i++) {
var shift = i * 8;
value += (b[i + offset] & 0x000000FF) << shift;
}
return value;
}
getString=function(b,offset,length){
var value="";
for (var i = 0; i < length; i++) {
var c=b[offset+i];
if(c!=0){
value+=String.fromCharCode(c);
}else{
break;
}
}
return value;
}
doubleToDate=function(time){
var date=new Date();
date.setFullYear(1899);
date.setMonth(11);
date.setDate(30);
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
var baseTime=date.getTime();
baseTime+=Math.floor(time*24*60*60*1000);
date.setTime(baseTime);
return date;
}
return this;
})();
然后是接受到socket的data事件后的处理代码,只是写了最最简单的控制台打印,websocket的东西之后继续加上:
socket.on("data",function(data){
var offset=5;
var buffer=new Buffer(data);
console.log("buffer length:"+buffer.length);
var magiccode=buffer.readUInt16LE(offset);
//console.log(magiccode.toString(16));
if(magiccode.toString(16)=="abcd"){
var size=buffer.readUInt32LE(data,offset+2);
console.log("size:"+size);
var type=buffer.readUInt16LE(offset+6);
//console.log("type:"+type);
if(type==13){
var time=buffer.readDoubleLE(offset+8);
//console.log("time:"+time+" typeof():"+typeof(time)); //number
var date=byteArrayUtil.doubleToDate(time);
console.log(date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
var queue=byteArrayUtil.getString(data,offset+16,16);
console.log("queue:"+queue);
var totalAgent=byteArrayUtil.getLong(data,offset+32);
console.log("totalAgent:"+totalAgent);
}
}
});
有空还是要多看看node的文档。。只凭着自己瞎搞,效率太低了。。
在windows上装了node-0.6.11,安装真心简单,装好后cmd里就可以用node了。。。本来的cygwin里的是0.5.0的,调用buffer的read方法时候一直报typeerror,开始还纳闷,想了好久猜测也许是版本不对,老版本大概还没这方法,换了新的果然OK了。。爽~~
buffer.readDoubleLE(offset)好棒~~
分享到:
相关推荐
这个项目中的`node_tcp_proxy-master`文件可能包含了实现上述功能的完整代码,你可以进一步研究其源码以获取更深入的理解。通过这样的实践,你不仅可以学习到TCP代理的实现,还可以掌握Node.js处理网络连接和数据流...
Modbus TCP / IP流 这是一个非常简单的模块,使用NodeJS Streams2读取Modbus TCP数据并将其转换为JSON,反之亦然。安装如果您只是开始或尝试使用该库,建议您尝试使用 。 它更完整(它支持所有标准功能代码),并且...
本案例中,我们将讨论如何使用Modbus TCP协议从华为逆变器远程采集设备数据。华为逆变器是太阳能发电系统中的重要组件,负责将太阳能电池板产生的直流电转换为交流电并入电网。通过Modbus TCP,我们可以实现对逆变器...
Java调用OPC(OLE for Process Control)获取点位数据是一项常见的工业自动化任务,尤其在SCADA(Supervisory Control and Data Acquisition)系统中。OPC是微软平台上的一个标准接口,它允许不同厂商的软件应用程序...
FINS是欧姆龙专为工业网络设计的一种通信协议,它允许设备间进行数据交换,包括读取和写入PLC的存储区、执行控制命令等。FINS协议支持多种网络拓扑,如环形、总线型和星型,并且具有高度的兼容性,可应用于不同型号...
本篇文章将深入探讨如何使用Node.js和Socket.IO来实现后台连接并获取数据。 首先,我们要理解Socket.IO的工作原理。它是基于WebSocket协议的,但同时也支持其他几种 fallback 技术,如polling、long-polling等,...
在Node.js中,TCP(传输控制协议)是一个底层网络接口,用于实现可靠的数据流传输。在TCP通信中,由于协议的特性,可能会出现“粘包”和“分包”的问题,这在处理实时性要求高的数据传输时尤为关键。本文将深入探讨...
基于TCP传输的H264流解码,首先需要接收端通过TCP连接接收到H264编码的视频数据流。这些数据通常是以NAL单元(Network Abstraction Layer units)的形式,每个NAL单元包含一段完整的视频信息,如I帧、P帧或B帧。然后...
本篇文章将详细探讨如何使用Node.js创建一个简单的TCP套接字服务器,以此来实现客户端和服务器之间的数据交换。 标题中的"node-tcp-socket"指的是使用Node.js来实现TCP(传输控制协议)套接字。TCP是一种面向连接的...
通过编程,NodeMCU可以连接各种传感器,获取环境参数如温度、湿度、光照等,并将这些数据通过Wi-Fi发送到云端服务器。常用编程语言为Lua,但也可以通过Arduino IDE等工具使用C/C++进行开发。 其次,微信小程序是...
这使得S7-300能够通过组态TCP连接以及使用开放式通信的功能块与其他设备建立TCP连接,实现数据交换。本文将详细介绍如何配置S7-300 CPU作为TCP客户端,与PC机上运行的TCP&UDP Debug软件模拟的服务器进行通信的过程。...
例如,读取或写入的寄存器地址、数据值需要转换成16位的整数。 3. **Modbus功能码**:根据Modbus协议定义的功能码(如0x03用于读离散输入,0x06用于写单个保持寄存器)构建Modbus报文。 4. **报文构建**:构造包含...
例如,你可以通过HTTP请求接收订单数据,然后使用"node-escpos"将订单信息转化为打印机可识别的格式并发送到打印机。 在开发过程中,"node-escpos"的API文档是必不可少的参考资料。它详细介绍了如何初始化打印机...
此外,我们可以通过监听`data`事件来读取客户端发送的数据,通过设置`setEncoding`方法来指定数据编码。`socket.bytesRead`属性记录了累计接收的字节数。当客户端关闭连接时,会触发`end`事件,我们可以通过监听这个...
它利用 Node 的 Node 的 CLI API 来读取用户的输入。 聊天室 安装 克隆仓库。 使用node src/server.js启动服务器 使用node src/client.js启动客户端 CLI 应用程序( node src/client.js 键入每个客户
可写流是消费数据的,从可读流中获取数据,对拿到的 Buffer 数据进行处理消耗,把它写入目标对象。 duplex streams 也叫双工流,它既是可读流也是可写流,例如 Tcp socket 是可读可写的双工流。Transform streams ...
**app端处理流程**: vppcom_wait_for_session_state_change等待服务端session状态变为STATE_LISTEN,通过从app_event_queue中获取消息,并调用vcl_handle_mq_event根据消息类型进行处理。 #### 2. VPP TCP挥手断连...
本文将深入讲解如何在Node.js中创建TCP服务器,并通过实例来演示TCP数据通讯的过程。 首先,创建TCP服务器的关键是使用`net.createServer()`函数。此函数接受一个可选的`options`对象和一个`connectionListener`回...
3. **读取数据**:在代码中调用DHT11库的函数获取温度和湿度值。例如,`dht.read11(DHTPIN)`,其中DHTPIN是DHT11连接的GPIO引脚。 4. **网络通信**:利用ESP8266的WiFi功能,如`WiFiClient`库,建立TCP连接到服务器...
《Professional Node.js》一书深度探索了Node.js的高级应用,为读者提供了全面且深入...无论是初学者还是有经验的开发者,都能从中获取宝贵的知识,提升自己的编程技能,构建出更加稳定、高效和安全的Node.js应用程序。