256 lines
6.0 KiB
JavaScript
256 lines
6.0 KiB
JavaScript
|
|
'use strict'
|
||
|
|
/*
|
||
|
|
XDNoticeSdk
|
||
|
|
*/
|
||
|
|
class XDNoticeSdk {
|
||
|
|
|
||
|
|
VERSION="1.0.0"
|
||
|
|
MAX_SENT_RETRY_COUNT = 9;
|
||
|
|
WS_URL = 'ws://'+process.env.VUE_APP_WS_HOST+'/ws/';
|
||
|
|
|
||
|
|
userId = null;
|
||
|
|
|
||
|
|
|
||
|
|
AUTH_TOKEN=null;
|
||
|
|
|
||
|
|
WS_INIT = 0;
|
||
|
|
WS_OPEN = 1;
|
||
|
|
WS_CLOSING = 2;
|
||
|
|
WS_CLOSE = 3;
|
||
|
|
|
||
|
|
// 和服务端连接的socket对象
|
||
|
|
ws = null;
|
||
|
|
// WS 回调函数
|
||
|
|
onOpenCallback =[];
|
||
|
|
onCloseCallback=[];
|
||
|
|
onErrorCallback =[];
|
||
|
|
// onMessageCallback =[];
|
||
|
|
|
||
|
|
onMessageCallback=[];
|
||
|
|
|
||
|
|
// 自定义 回调函数
|
||
|
|
callbacks ={}
|
||
|
|
|
||
|
|
// 标识:是否连接成功 , 记录重试的次数,重新连接尝试的次数
|
||
|
|
connected = false;
|
||
|
|
printerIsRead = false;
|
||
|
|
sendRetryCount = 0;
|
||
|
|
connectRetryCount = 0;
|
||
|
|
|
||
|
|
static instance = null;
|
||
|
|
constructor() {
|
||
|
|
this.instance = null
|
||
|
|
}
|
||
|
|
static getInstance() {
|
||
|
|
if (!this.instance) {
|
||
|
|
this.instance = new XDNoticeSdk()
|
||
|
|
}
|
||
|
|
return this.instance
|
||
|
|
}
|
||
|
|
// 外部方法----------------------------------------------------------------
|
||
|
|
init(userId){
|
||
|
|
// 初始化参数建立连接
|
||
|
|
// this.token=getToken();
|
||
|
|
this.userId=userId;
|
||
|
|
this.connect();
|
||
|
|
this.start();
|
||
|
|
}
|
||
|
|
|
||
|
|
setOnOpen(callback){
|
||
|
|
this.onOpenCallback.push(callback);
|
||
|
|
|
||
|
|
if(this.connected){
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
setOnClose(callback){
|
||
|
|
this.onCloseCallback.push(callback);
|
||
|
|
|
||
|
|
if(!this.connected){
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
setOnError(callback){
|
||
|
|
this.onErrorCallback.push(callback);
|
||
|
|
}
|
||
|
|
|
||
|
|
setOnMessage(callback){
|
||
|
|
this.onMessageCallback.push(callback);
|
||
|
|
if(this.connected){
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
getRequestId() {
|
||
|
|
let requestId = 'req' + new Date().getTime().toString(36) + Math.random().toString(36).substring(2, 9);
|
||
|
|
return requestId;
|
||
|
|
}
|
||
|
|
|
||
|
|
//--内部方法--------------------------------------------------------------
|
||
|
|
|
||
|
|
// 连接服务器的方法
|
||
|
|
connect() {
|
||
|
|
// 连接服务器
|
||
|
|
if (!window.WebSocket) {
|
||
|
|
console.log('您的浏览器不支持WebSocket');
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!this.ws || this.getWSReadyState() === this.WS_CLOSING || this.getWSReadyState() === this.WS_CLOSE) {
|
||
|
|
try {
|
||
|
|
this.ws = new WebSocket(this.WS_URL+""+this.userId);
|
||
|
|
|
||
|
|
this.ws.onerror = () => {
|
||
|
|
// console.log("ws onerror!");
|
||
|
|
if(this.onErrorCallback.length>0){
|
||
|
|
this.onErrorCallback.forEach(callback=>{
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.ws.onopen = () => {
|
||
|
|
// console.log("ws onopen!");
|
||
|
|
|
||
|
|
this.connected = true
|
||
|
|
this.connectRetryCount = 0
|
||
|
|
|
||
|
|
if(this.onOpenCallback.length>0){
|
||
|
|
this.onOpenCallback.forEach(callback=>{
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
this.ws.onpong = () => {
|
||
|
|
// console.log("ws onpong!");
|
||
|
|
}
|
||
|
|
|
||
|
|
this.ws.onclose = () => {
|
||
|
|
// console.log("ws onclose!");
|
||
|
|
|
||
|
|
this.connected = false;
|
||
|
|
this.connectRetryCount++;
|
||
|
|
|
||
|
|
if(this.connectRetryCount>120){
|
||
|
|
this.connectRetryCount=0;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(this.onCloseCallback.length>0){
|
||
|
|
this.onCloseCallback.forEach(callback=>{
|
||
|
|
if(callback!=null){
|
||
|
|
callback();
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
// * this.connectRetryCount
|
||
|
|
|
||
|
|
setTimeout(() => {
|
||
|
|
this.connect()
|
||
|
|
}, 1000 )
|
||
|
|
};
|
||
|
|
|
||
|
|
this.ws.onmessage = e => {
|
||
|
|
// console.log('ws onmessage:' + e.data)
|
||
|
|
if(this.onMessageCallback.length>0){
|
||
|
|
this.onMessageCallback.forEach(callback=>{
|
||
|
|
if(callback!=null){
|
||
|
|
callback(e);
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
// if (e.data.charAt(0) === "{") {
|
||
|
|
// var data = this.jsonToObj(e.data);
|
||
|
|
// if(this.onMessageCallback){
|
||
|
|
// this.onMessageCallback(data);
|
||
|
|
// }
|
||
|
|
// // if(msg["CMD"]=='printerIsRead'){
|
||
|
|
// // printerIsRead=true;
|
||
|
|
// // }
|
||
|
|
// // else{
|
||
|
|
|
||
|
|
// // }
|
||
|
|
// } else {
|
||
|
|
// console.log("数据格式非法:" + e.data);
|
||
|
|
// }
|
||
|
|
};
|
||
|
|
|
||
|
|
} catch (ex) {
|
||
|
|
setTimeout(() => {
|
||
|
|
this.connect()
|
||
|
|
}, 1000 )
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return this.ws;
|
||
|
|
}
|
||
|
|
|
||
|
|
jsonToObj(json){
|
||
|
|
return JSON.parse(json)
|
||
|
|
}
|
||
|
|
|
||
|
|
objToJson(obj){
|
||
|
|
return JSON.stringify(obj)
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* readyState->0:尚未建立连接;1:已经建立连接;2:正在关闭;3:已经关闭或不可用
|
||
|
|
* @param thisWs
|
||
|
|
* @returns {*}
|
||
|
|
*/
|
||
|
|
getWSReadyState() {
|
||
|
|
if (this.ws.readyState !== undefined) {
|
||
|
|
return this.ws.readyState;
|
||
|
|
}
|
||
|
|
return this.WS_INIT;
|
||
|
|
};
|
||
|
|
|
||
|
|
// 发送数据的方法
|
||
|
|
send(data) {
|
||
|
|
// console.log("send:"+data)
|
||
|
|
if (this.getWSReadyState() === this.WS_OPEN ) {
|
||
|
|
this.sendRetryCount = 0
|
||
|
|
this.ws.send(data)
|
||
|
|
return 1;
|
||
|
|
} else {
|
||
|
|
console.log("Ws is abnormal,send faild!!")
|
||
|
|
return -1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 关闭socket连接
|
||
|
|
close() {
|
||
|
|
if (this.ws) {
|
||
|
|
this.ws.close();
|
||
|
|
this.connected = false; // 更新连接状态
|
||
|
|
clearInterval(this.heartbeatInterval); // 清除心跳检测定时器
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 开启心跳检测
|
||
|
|
start() {
|
||
|
|
// this.heartbeatInterval = setInterval(() => {
|
||
|
|
// if (this.getWSReadyState() === this.WS_OPEN ) {
|
||
|
|
// // this.ws.ping();
|
||
|
|
// this.ws.send(0x9);
|
||
|
|
// }
|
||
|
|
// }, 1000);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
export default XDNoticeSdk;
|