H5+nodejs实现com口通信

661 阅读3分钟

一.安裝nodejs 步驟

  1. 下载对应你系统的Node.js版本:下载地址
  2. 选择安装目录进行安装
  • 自定义安装在D盘下Develop\nodejs文件夹下,选择安装文件路径下一步直到完成
  • 打开cmd窗口输入 node -vnpm -v 查看是否安装成功 clipboard.png
  1. 在env/node文件夹下配置模块路径和缓存路径 ,创建文件夹node_global和node_cache clipboard2.png

  2. 创建完后打开cmd 命令窗口输入 npm config set prefix "D:\Develop\nodejs\node_global" npm config set cache "D:\Develop\nodejs\node_cache clipboard3.png

  3. 接下来设置环境变量,关闭cmd窗口,“我的电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量” clipboard4.png

  4.  进入环境变量对话框,在【系统变量】下新建【NODE_PATH】,输入【D:\Develop\nodejs\node_global\node_modules】,将【用户变量】下的【Path】修改为【D:\Develop\nodejs\node_global】 clipboard5.png

clipboard6.png

clipboard7.png

clipboard8.png 7. 配置完后,安装个module测试下,我们就安装最常用的express模块,打开cmd窗口,输入如下命令进行模块的全局安装 npm install express -g # -g是全局安装的意思 clipboard5.png

clipboard6.png

clipboard7.png

clipboard8.png 上面ok之后  我们安装淘宝的cnpm镜像,因为国外的很慢。我们可以采用cnpm install  来代替npm安装 npm install -g cnpm --registry=https://registry.npm.taobao.org npm默认的仓库地址是在国外网站,速度较慢,建议大家设置到淘宝镜像。但是切换镜像是比较麻烦的。推荐一款切换镜像的工具:nrm 我们首先安装nrm,这里-g代表全局安装 ,输入命令npm install nrm -g

  1. 然后通过nrm ls命令查看npm的仓库列表,带*的就是当前选中的镜像仓库: clipboard10.png
  • 注意: 输入nrm ls 如果报错:
  • nrm运行出错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value);

  • 成功后

  • ![clipboard11.png](p3-juejin.byteimg.com/tos-cn-i- k3u1fbpfcp/963819f8c5ec4e2db342ce7978912d26~tplv-k3u1fbpfcp-watermark.image?)

  1. 通过nrm use taobao来指定要使用的镜像源,并测试速度
    clipboard12.png clipboard13.png

  2. 安装模块

  • forever 模块(作用是node程序保活,关闭cmd窗口也存在) 安装命令 :npm install forever -g
  • serialport 模块 安装命令: npm install serialport -g
  • nodejs-websocket 模块 安装命令: npm install nodejs-websocket -g

到此nodejs环境安装完成,一定要重启电脑

  1. 创建页面
<HTML>
    <head>
    <title>lodop</title>
    <script src="jquery-1.9.1.min.js"></script>
    </head>
    <script>
     var   ws1 = new WebSocket('ws://localhost:5001');
        ws1.onopen = function () {
    alert("人脸设备客户端已连接")
            // oUl.innerHTML += "<li>人脸设备客户端已连接</li>";
        }
        ws1.onmessage = function (evt) {
            //该evt为回传数据,使用evt.data获取;
            //收到消息在去调用您页面上的具体业务逻辑如收到串口返回的消息就去调用支付方法,长连接。如果串口不回消息就一直等待。直到获取到信息。该处很关键。省去在用js方法轮询接口有没有返回数据。
          alert("获得数据:"+evt.data)
        }
        ws1.onclose = function () {
         alert("客户端已断开连接")
        };
        ws1.onerror = function (evt) {
           alert("错误:"+evt.data)
        };
// 向串口发送消息
function sendCom(){
    var str= "1C";
        ws1.send(str);
}
    </script>
   <BODY>
    <button onclick="sendCom()">发送消息</button>
    </BODY>
    </HTML>
  1. 创建socketServer.js文件,打开cmd窗口,到文件所在文件夹下输入命令:forever socketServer.js 连接成功后会提示:IsOpen:true
let facestr="";
let value;
var wsface=require('nodejs-websocket'); 
var SerialPort = require('serialport')
var serialPort = new SerialPort("COM2", {
 baudRate9600, 
 dataBits8,  
 parity'none',  
 stopBits1, 
 flowControlfalse,
 autoOpen:false
}, false);
serialPort.open(function (err) {
  console.log('IsOpen:',serialPort.isOpen)
})
serialPort.on('error',function (error) {
  console.log('error: '+error)
  facestr=error;
})
var server = wsface.createServer(function (conn, res) {
 conn.on("text",function(str1){
   facestr="";
   console.log(str1);
      //H5页面定义以空分割
      const arr=str1.split(" ");
      if(arr==null){
          return
      }
     if(arr.length!=2){
          return
      }
        const resultStr="";
      for(const i=0;i<arr.length;i++){
          resultStr+=new Buffer(arr[i],"hex").toString('utf8')
      }
    serialPort.write(resultStr, function (error, result) { })
     conn.sendText(facestr);
  });
  conn.on("close",function(code,reason){
    console.log('connection closed');
  facestr="close";
  })
  //处理错误事件信息
  conn.on('error',function(err){
    console.log('throw err',err);
  facestr=err;
  })
}).listen(5001);
serialPort.on('data'function (data) {
 facestr= new Buffer(data, 'hex').toString('utf8');
  console.log("facestr conn="+facestr);
  server.connections.forEach(function (conn) {
    conn.sendText(facestr); facestr="";
  })
});
  1. window开机自动开启node服务,下面文件放到启动文件夹下建文件cmd.bat(问题:开机可以启动但是不能关闭cmd窗口,不知道怎么写)
@echo off
start  "C:\Windows\System32\cmd.exe" 
D:
forever  mydata/socket/socketServer.js
taskkill /f /im cmd.exe
exit

--- 结束 ---