Nodejs 串口通信 : websocket , serialport

2024-09-07 02:48

本文主要是介绍Nodejs 串口通信 : websocket , serialport,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在学习如何实现web页面和串口间通信,网页请求使用websocket,实现的基本功能如下:

1、基本需求:硬件:有两个信号灯(TLA-505-1T),一个485继电器(开关),电压转换器,工业触屏一体机。

2、原理图:

                

3工作原理:

首先一体机中采用node开发服务器,网页请求采用websocket协议,直接放代码了:

var express = require('express');
var SerialPort = require('serialport');
var app = express();
var expressWs = require('express-ws')(app);
var util = require('util');
/*
var com =require('./com.js');
var logger = require('./log.js').logger;
*/


app.use(express.static('public'));
//ejs
app.set('view engine','ejs');app.get('/',function(req,res){res.render('control');
})app.ws('/ws', function(ws, req) {util.inspect(ws);ws.on("message",function(str){console.log('1234');//hander(str,ws);});ws.on("close",function(code,reason){console.log('connection closed');})//处理错误事件信息
    ws.on('error',function(err){console.log('throw err',err);})})
function hander(str,ws) {//发送数据到客户端
    //console.log(str);
    var arr = str.split('');if(arr[2]==1){//close
        arr[2]=0;}else{arr[2]=1;}//console.log(arr.join(''));
    ws.send(arr.join(''));
}app.listen(3004);

这样一个server服务写好,然后在写html界面:

<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="js/jquery.mobile-1.4.5.min.css">
<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/jquery.mobile-1.4.5.min.js"></script><title>Title</title><style>form{margin: 30px auto;width: 35%;}</style></head>
<body>
<br>
<form class="form"><fieldset><legend>websocket 控制</legend><br><br><div>  <button type="button" style="background: #EEF9F3" id="deng1" value="100">灯1关闭状态</button><button type="button" style="background: #EEF9F3" id="deng2" value="110">灯2关闭状态</button></div><br><span id='content'>客户端未连接</span></br><input type="button" value="连接" id="connect" class="connect"/></fieldset>
</form>
<script>var oUl=document.getElementById('content');var oConnect=document.getElementById('connect');var oSend=document.getElementById('send');var oInput=document.getElementById('message');var ws=null;oConnect.onclick=function(){ws = new WebSocket('ws://localhost:3004/ws');ws.onopen=function(){document.getElementById('content').innerHTML = "客户端已连接";}ws.onmessage=function(evt){ //document.getElementById('states').innerHTML = "deng : "+evt.data
            var arr = evt.data.split('');if(arr[1]==0){//deng1
                var deng = "deng1";changeState(deng,'states1');}else if(arr[1]==1){//deng2
                var deng = "deng2";changeState(deng,'states2');} function changeState(deng,state){$('#'+deng).val(evt.data);if(arr[2]==1){//open 
                   // document.getElementById(state).innerHTML = deng+" open:"+evt.data;
                    document.getElementById(deng).innerHTML = (deng =='deng1'?'灯1':'灯2')+"关闭状态";$('#'+deng).css("background-color","#B3B4A6");}else if(arr[2]==0){// document.getElementById(state).innerHTML = deng+" close:"+evt.data;
                    document.getElementById(deng).innerHTML = (deng =='deng1'?'灯1':'灯2')+"打开状态";$('#'+deng).css("background-color","#EEF9F3");}}   }ws.onclose=function(){document.getElementById('content').innerHTML = "客户端已断开连接";};ws.onerror=function(evt){oUl.innerHTML+="<li>"+evt.data+"</li>";};};//$(document).on("pagecreate","#pageone",function(){
      $("#deng1").on("tap",function(){  ws.send($("#deng1").val());});                       
//});
      $("#deng2").on("tap",function(){ ws.send($("#deng2").val());});  /*function clickDend(val){
        console.log(val)
        if(ws){
            ws.send(val);
        }
    }*/
</script>
</body>
</html>

这样一个完整的websocket协议完成,最后在socket协议中加入串口通信:

var express = require('express');
var SerialPort = require('serialport');
var app = express();
var expressWs = require('express-ws')(app);
var util = require('util');
var com =require('./com.js');
/*
var com =require('./com.js');
var logger = require('./log.js').logger;
*/


app.use(express.static('public'));
//ejs
app.set('view engine','ejs');app.get('/',function(req,res){res.render('control');
})app.ws('/ws', function(ws, req) {util.inspect(ws);var sendDelay = 2000;ws.on("message",function(str){console.log('1234');var arr = str.split('');if(arr[2]==1){//close
            arr[2]=0;}else{arr[2]=1;}sendData(arr,ws);//setInterval(sendData,sendDelay);

    });ws.on("close",function(code,reason){console.log('connection closed');})//处理错误事件信息
    ws.on('error',function(err){console.log('throw err',err);})})var defaults = {//reportVersionTimeout: 5000,
    receiveInterval: 100,sendInterval: 500,repeatSendTimes: 30,  // ??????
    SerialName:'/dev/ttyAMA0',SerialPort: {baudRate: 9600,autoOpen: false,parity: 'none',xon: false,xoff: false,xany: false,rtscts: false,hupcl: true,dataBits: 8,stopBits: 1,bufferSize: 11
    }
};var SerialPort = com.SerialPort;
//logger.info('List all serialport');
SerialPort.list(function (err, ports) {ports.forEach(function(port) {console.log(port.comName);console.log(port.pnpId);console.log(port.manufacturer);});
});var test = new com.SerialPort(defaults.SerialName, defaults.SerialPort);var count=0;
var sendTime = Date.now();
test.on('data', function (data) {console.log("receive:"+util.inspect(data));count++;var elapsed = Date.now() - sendTime;console.log("count:"+count+",elapsed:"+elapsed+" ms");
});test.on('error',function (err){console.log("error:"+err);
});test.on('close',function (){console.log("close occured");
});test.open(function (error) {console.log(error);console.log('com port opened');});var cmd1 = Buffer.from([0xaa,0x07,0xde,0x03,0x03,0x01,0x27,0x34,0x10,0x08,0x09]);
var cmd2 = Buffer.from([0xaa,0x07,0xde,0x03,0x03,0x01,0x27,0x34,0x10,0x02,0x03]);
var cmd3 = Buffer.from([0xFE,0x05,0x00,0x00,0xFF,0x00,0x98,0x35]);
var cmd4 = Buffer.from([0xFE,0x05,0x00,0x00,0x00,0x00,0xD9,0xC5]);var cmd5 = Buffer.from([0xFE,0x05,0x00,0x01,0xFF,0x00,0xc9,0xf5]);
var cmd6 = Buffer.from([0xFE,0x05,0x00,0x01,0x00,0x00,0x88,0x05]);var sendCount = 0;
function sendData(arr,ws){console.log("send count:"+arr[1]);if(arr[1]==0){if(arr[2]==0){test.write(cmd3); //灯1 打开
            arr[2]==1;}else if(arr[2]==1){test.write(cmd4);  //灯1 关闭
            arr[2]==0;}}else if(arr[1]==1){if(arr[2]==0){test.write(cmd5); //灯1 打开
            arr[2]==1;}else if(arr[2]==1){test.write(cmd6);  //灯1 关闭
            arr[2]==0;}}ws.send(arr.join(''));
}app.listen(3004);
ok,就可以在一体机上单机按钮,控制灯的开关啦。






这篇关于Nodejs 串口通信 : websocket , serialport的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143845

相关文章

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket