node+webSocket连接设备

app.js

var wsWorkStation = require('./lib/wsWorkStation');

wsWorkStation.initWorkStations();

lib/wsWorkStation

const WebSocket = require('ws');
const log4js = require('../log-config');
const logger = log4js.getLogger('wsclient');
const db = require('./mysqldb');
const WorkStationSql = require('../models/workstation');

const wsWorkStations = [];

exports.initWorkStations = function () {
	db.query(WorkStationSql.listeWorkStations, [], function (err, rows) {
        if (err) {
        	logger.error("Database operation error! error:" + err);
        } else if (rows.length > 0) {
        	logger.info("Work Stations connection state is being initialized! ");
        	var stationArr = rows;
            var actions = [];
            var updateOnlineStatus = function (port, ipAddress, callback) {
                new Promise((resolve, reject) => {
                	var wsClient = exports.newWorkStation(ipAddress, port);	
   					 resolve(wsClient);
                }).then((wsClient) => {
                	if (wsClient.readyState == 1) {
                		db.query(WorkStationSql.updateOnlineStatusByIp,[1,ipAddress],function(err,rows){
                		if(err){
                                logger.info(err);
						}else{
                                logger.info("The IP  with the successful workstation connection is " + ipAddress);
                                return callback(0);
                        }
                      })
                       } else {
                        db.query(WorkStationSql.updateOnlineStatusByIp,[0,ipAddress],function(err,rows){
  						  if(err){
                                logger.info(err);
							}else{
                                logger.error("The IP with the failed workstation connection is " + ipAddress);
 							 return callback(1);
                            }
        })  
                    }
                })
          for (var i = 0; i < stationArr.length; i++) {
              var action = () => { // 将每一次循环方法定义为一个方法变量
                 return new Promise((resolve, reject) => { // 每个方法返回一个Promis
                 	 ((index) => {
                            updateOnlineStattus(stationArr[index].port, stationArr[index].ipAddress, function (err, retTtem) {
                                resolve();
                            });
                   })(i)
                    })
                }
                 actions.push(action());  // 将每次循环调用的方法添加到方法数组中
                 Promise.all(actions).then(() => { // 调用Promise的all方法,传入方法数组,
                  logger.info("All workstations initiate websocket connection")
                   })
        } else {
            logger.info("There is no  workstation, please create a workstation! ");
        }
 })
}
exports.newWorkStation = function (ipaddress, port) {
	return new Promise((resolve, reject) => {
		 var createdWsClient = wsWorkStations.filter(item => item.ipaddress == ipaddress);
		 	if (createdWsClient.length == 0) {
		 		if(!ipaddress){
                logger.error("The ipaddress is empty!")
                 }
            if(!port){
                logger.error("The port is empty!")
            }
            var wsClient = new WebSocket('ws://' + ipaddress + ':' + port);
            if (wsClient) {
            	 wsClient.on('open', function open() {
            	 	wsClient.ipaddress = ipaddress;
            	 	wsClient.port = port;
                    wsWorkStations.push(wsClient);
                    resolve(wsClient);
             });
                wsClient.on('message', function (message) {
                    
                });
                wsClient.on("error", (error) => {
                     resolve(wsClient);
                });
                wsClient.on("close", () => {
                    resolve(wsClient);
                });
                 }
        } else {
        	 resolve(createdWsClient[0]);
        }
    })
}                              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值