websocket的使用

2018-08-22  本文已影响8人  5df463a52098

封装的wsCommonMethods.js

/* ======== websocket 方法 ======== */
/* websocket 五大方法
1.websocket.onopen
2.websocket.onmessage
3.websocket.onclose
4.websocket.onerror
5.websocket.send
*/
let context = null
// websocket 错误处理拦截 暂时不需要暴露到外面
function InterceptorError (err) {
    context.$toast('请重启websocket服务')
    console.log('err',err)
}
// websocket 关闭处理拦截 暂时不需要暴露到外面
function InterceptorClose (e) {
    console.log(e)
}
// websocket 发送数据拦截的函数
function InterceptorSend (websocket, req, status) {
    if (status) {
        websocket.send(req)
    } else {
        console.log('连接失败')
    }
}

const WscommonMethods = {
    websocket: null,
    initwebsocket (url, vue) {
        context = vue
        if ('WebSocket' in window) {
            this.websocket = new WebSocket(url)
            // open
            this.websocket.onopen = e => {
                let str = this.open.toString()
                if (!(str.substring(str.indexOf('{'), str.indexOf('}') + 1) === '{}')) {
                    this.open()
                }           
            }
            // 错误处理函数
            this.websocket.onerror = err => {
                InterceptorError(err)
            }
            // 关闭websocket的 处理
            this.websocket.onclose = e => {
                InterceptorClose(e)
            }
            // 对onmessage 的错误处理
            this.websocket.onmessage = e => {
                let params = e.data.includes('{') ? JSON.parse(e.data) : e.data
                if (Number.parseInt(params.result) === 0) {
                    this.message(params)
                } else {
                    context.$toast(JSON.parse(event.data).result)
                }
            }
        } else {
            context.$toast('当前浏览器 Not support websocket')
            console.log('当前浏览器 Not support websocket')
        }
    },
    // 关闭websocket type=1 调用 断开链接的接口  type==2 调用 websocet.clsoe
    closeWebsocket (type, devID) {
        if (type === 1) {
            this.DisConnect(devID)
        } else if (type === 2) {
            this.websocket.close()
        }
    },
    // websocket.onmessage 拦截处理(以后备用)
    InterceptorMessage () {
        return true
    },
    // 监测websocket是不是已经连接成功
    isConnect () {
        if (!this.websocket || this.websocket.readyState === 3) {
            return false
        }
        return true
    },
    // message 的错误处理
    message (e) {
    },
    // open
    open () {
    },
    // 获取设备列表
    getDevList () {
        this.EnumDev()
    },
    // 请求接口
    request () {
    },
    /* ===========1.设备管理============ */
    // 枚举设备列表
    EnumDev () {
        const req = `{"function":"EnumDev"}`
        this.websocket.send(req)
    },
    // 断开设备连接 需要传一个参数设备id devID
    DisConnect (devID) {
        const req = `{"function":"DisConnect","devID":"${devID}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    /* ===========2.访问控制============ */
    // 验证PIN 需要传两个参数 1.devID 设备id 2.userType 2为管理员 其他为默认用户
    VerifyPIN (devID, userType) {
        // const req = JSON.stringify({"function":"VerifyPIN","devID": devID, "userType": userType})
        const req = `{"function":"VerifyPIN","devID":"${devID}","userType":${userType}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 修改用户PIN扩展 需要传两个参数 1.devID 设备id 2.userType 2为管理员 其他为默认用户
    ChangePINEX (devID, userType) {
        const req = `{"function":"ChangePINEX","devID":"${devID}","userType":${userType}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 密钥导入管理 KEY格式化 需要传两个参数 1.devID 设备id flag:1当应用或容器存在时,先删除再创建;0,当应用或容器存在时,不允许删除。
    KeyFormat (devID, flag) {
        const req = `{"function":"KeyFormat","devID":"${devID}","flag":${flag}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 生成签名密钥对 GenECCKeyPair 需要传1个参数 1.devID
    GenECCKeyPair (devID) {
        const req = `{"function":"GenECCKeyPair","devID":"${devID}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 导入用户加密密钥对 需要传三个参数 1.devID 设备id , 2.encEnvelopedKey base64编码的用户加密密钥对, 3.encEnvelopedKeyLen 可省略
    ImportECCKeyPair (devID, encEnvelopedKey, encEnvelopedKeyLen) {
        const req = `{"function":"ImportECCKeyPair","devID":"${devID}","encEnvelopedKey":"${encEnvelopedKey}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 导入数字证书 需要传入四个参数 1.devID 设备id 2.certType  证书类型,1是签名,2是加密 3. cert //base64编码的用户加密密钥对
    ImportECCCert (devID, certType, cert, certLen) {
        const req = `{"function":"ImportECCCert","devID":"${devID}","certType":${certType},"cert":"${cert}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    /* ===========3.文件管理============ */
    // 枚举文件 需要传入一个参数 1.devID 设备id
    EnumFiles (devID) {
        const req = `{"function":"EnumFiles","devID":"${devID}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 读文件 需要传入两个参数 1.devID 设备id 2. fileName 文件名称
    ReadFile (devID, fileName) {
        const req = `{"function":"ReadFile","devID":"${devID}","fileName":"${fileName}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 写文件 需要传入三个参数 1.devID 设备id 2. fileName 文件名称 3.fileData (文件数据是可见字符或者base64编码数据)
    WriteFile (devID, fileName, fileData) {
        const req = `{"function": "WriteFile","devID":"${devID}","fileName":"${fileName}","fileData":"${fileData}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    /* ===========4.产生随机数============ */
    // 产生随机数 需要传入三个参数 1.devID 设备id 2.randLen 随机数长度,无编码
    GenRandom (devID, randLen) {
        const req = `{"function":"GenRandom","devID":"${devID}","randLen":${randLen}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 数据摘要 需要传入两个参数 1.inData,2.inDataLen 最大长度20480
    SM3Digest (inData, inDataLen) {
        const req = `{"function":"SM3Digest","inData":"${inData}","inDataLen":${inDataLen}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 导出公钥 ExportPubKey 需要传入两个参数 1.devID 设备id 2.pubkeyType /1是签名,2是加密
    ExportPubKey (devID, pubkeyType) {
        const req = `{"function":"ExportPubKey","devID":"${devID}","pubkeyType":${pubkeyType}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 数字签名 需要传入两个参数 1.devID 设备id 2.inData//签名数据,函数内部做SM3摘要
    ECCSign (devID, inData) {
        const req = `{"function":"ECCSign","inData":"${inData}","devID":"${devID}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 验证签名 ECCVerify 需要传4个参数
    // 1.devID 设备id 2."publicKey": base64编码外来公钥 3."inData": 待验证签名数据,函数内部做摘要处理,4.signedData":base64编码的待验证的签名值
    ECCVerify (devID, publicKey, inData, signedData) {
        const req = `{"function":"ECCVerify","devID":"${devID}","publicKey":"${publicKey}","inData":"${inData}","signedData":"${signedData}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 私钥解密扩展 ECCDecryptEX
    // 需要传四个参数 1.devID 设备id ,2.encryptedData base64编码的密文数据, 3.encryptedDataLen,4.flag 111为修改设备认证码为服务器返回的值,其他保持不变
    ECCDecryptEX (devID, encryptedData, encryptedDataLen, flag) {
        const req = `{"function":"ECCDecryptEX","devID":"${devID}", "encryptedData":"${encryptedData}", "encryptedDataLen":${encryptedDataLen}, flag:${flag}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    /* ===========5.证书接口============ */
    // 导出数字证书 需要传两个参数  1."devID":设备id,2."certType" 1是签名,2是加密
    ExportCert (devID, certType) {
        const req = `{"function":"ExportCert","certType":${certType},"devID":"${devID}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 取证书公钥  从证书数据中读取 需要传一个参数 1."cert": base64编码的证书
    GetCertPubKey (cert) {
        const req = `{"function":"GetCertPubKey","cert":"${cert}"}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 取证书序列号  从KEY中读取 需要传两个参数  1.devID 设备id 2. certType:1是签名,2是加密
    GetCertSNEX (devID, certType) {
        const req = `{"function":"GetCertSNEX","devID":"${devID}","certType":${certType}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    // 取证书主题  从KEY读取 需要传两个参数  1.devID 设备id 2. certType:1是签名,2是加密
    GetCertSubjectEX (devID, certType) {
        const req = `{"function":"GetCertSubjectEX","devID":"${devID}","certType":${certType}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    },
    /* ===========6.其他============ */
    // 重置用户PIN码 需要传 1."devID":设备id,2."resetData" 3."resetDataLen" 4."flag":valueint//111为修改设备认证码为服务器返回的值,985修改为出厂值,其他保持不变
    ECCResetUserPIN (devID, resetData, resetDataLen, flag) {
        const req = `{"function":"ECCResetUserPIN","devID":"${devID}","resetData":"${resetData}","resetDataLen":${resetDataLen},"flag":${flag}}`
        InterceptorSend(this.websocket, req, this.isConnect())
    }
}
export default WscommonMethods

在main.js里引入:

import ws from './wsCommonMethods.js'
Vue.prototype.$ws = ws
let url = window.location.href
if (!Vue.prototype.$ws.isConnect() && url.indexOf('/Login') <= -1) { // 登录页刷新不连接,其他页面刷新需要重新链接
    Vue.prototype.$ws.initwebsocket('ws://127.0.0.1:10522', vue)
}

使用login.vue

 let wsParam = {}
                        this.$ws.initwebsocket('ws://127.0.0.1:10522', this)
                        this.$ws.open = () =>{
                            this.$ws.getDevList()
                        }
                        this.$ws.message = data => {
                            if (data.function === 'EnumDev') {
                                var devList = data.devList
                                if (devList.length <= 0) {
                                    this.isVisible = true
                                    this.message = '请插入USBKey'
                                    return
                                } else if (devList.length > 1) {
                                    this.isVisible = true
                                    this.message = '请插入一个USBKey'
                                    return
                                }
                                wsParam.devID = devList[0].devID
                                sessionStorage.setItem('devID', wsParam.devID)
                                this.$ws.VerifyPIN(wsParam.devID, 2)
                            }
                            if (data.function === 'VerifyPIN') {
                                this.$ws.GetCertSNEX(wsParam.devID, 1)
                            }
                            if (data.function === 'GetCertSNEX') {
                                wsParam.userId = data.certSN // 证书序列号
                                this.$ws.GenRandom(wsParam.devID, 1)
                            }
                            if (data.function === 'GenRandom') {
                                wsParam.rClent = data.randData
                                wsParam.plain =  `${wsParam.rClent}|${wsParam.userId}|${wsParam.devID}|${this.timeStamp}`// 参数排序进行ukey签名
                                // this.$ws.ECCSign(wsParam.devID, wsParam.plain)
                                wsParam.userId = wsParam.plain
                                this.$ws.request(wsParam)
                            }
                            /*if (data.function === 'ECCSign') { // 签名数据
                                wsParam.clientSign = data.signedData
                                this.$ws.request(wsParam)
                            }*/
                        }
                        this.$ws.request = (wsParam) => {
                            _that.http.post(_that.ports.USBKey.query, {
                                rClent: wsParam.rClent,
                                userId: wsParam.userId,
                                deviceID: wsParam.devID,
                                clientSign: wsParam.clientSign,
                            }, res => {
                                if (res.code === '0') {
                                    _that.$router.push({path: '/home'})
                                } else {
                                    this.$toast(res.errorMsg)
                                    // _that.isVisible = true
                                    // _that.message = res.errorMsg
                                }
                            })
                        }

在ie上弹出pin码框有6次限制,chrome上200次左右。
在ie上websocket的close事件会走向error,谷歌和火狐不会

上一篇 下一篇

猜你喜欢

热点阅读