首页 > 其他分享 >vue + websocket + speak-tts 实现推送的告警消息弹框显示在右下角并语音播报出内容

vue + websocket + speak-tts 实现推送的告警消息弹框显示在右下角并语音播报出内容

时间:2024-05-24 15:09:39浏览次数:24  
标签:播报 vue websocket log tts 弹框 console 告警

最近接了个项目需求,给设备配置语音加弹框告警。用户登录项目后不管在哪个页面,有告警就全局在右下角消息弹框加语音播报,下面浅介绍下我在开发中的流程以及遇到的坑!!!

1、首先项目中安装speak-tts语音播报插件。

npm install speak-tts

2、创建一个全局的 speech.js文件,文件中引入插件并初始化后导出。
因为可能会一直读多条消息,防止初始化多个Speech对象,在全局api中初始化一个对象,方便播报的时候调用。

import Speech from 'speak-tts'
const speech=new Speech()
export default speech 

3、在项目点击登录按钮后调用全局的语音播报方法。
由于浏览器之间有安全限制,用户不主动触发语音播报方法, 语音播报不会主动发出声音,故在项目的登录处触发方法。

3.1、首先引入封装好的js文件

import Speech from '@/utils/speech'

3.2、在登录点击方法中调用speech方法的语言、语速等各种参数。

    initSpeech(){
      Speech.setLanguage('zh-CN')
      Speech.init({
        volume: 0.6, // 音量0-1
        lang: "zh-CN", // 语言
        rate: 2, // 语速1正常语速,2倍语速就写2
        pitch: 1, // 音调
        voice: "Microsoft Yaoyao - Chinese (Simplified, PRC)",
      })    
    }

4、在登录后的vue页面资源的首加载项,即页面入口文件处编写弹框样式及告警信息的接收等功能(我开发的项目入口文件是AppMain.vue 文件)

4.1、首先新建一个项目右下角可放多个全局弹框的div,我此处使用的是card样式

    <div class="alarmmodel" v-if=popupList.length>
      <el-card class="box-card" shadow="always" v-for="(item, index) in popupList" :key="index">
        <div slot="header" class="clearfix">
          <span v-if="item.alertLevel == 1" style="color: rgb(221, 39, 48)">红色告警</span>
          <span v-else-if="item.alertLevel == 2" style="color:rgb(255, 140, 0)">橙色告警</span>
          <span v-else-if="item.alertLevel == 3" style="color: rgb(255, 215, 0)">黄色告警</span>
          <el-button style="float: right; padding: 3px 0" type="text" @click='popupSubmit(item, index)'>确定</el-button>
        </div>
        <div class="text item">
          {{ item.msg }}
        </div>
      </el-card>
    </div>

4.2、项目中引入封装好的js文件

import Speech from '@/utils/speech'

4.3、data中定义四个对象,分别是websocket的初始化对象,websoket地址及播报的弹框数据和心跳监测对象

  data() {
    return {
      heartbeatTimer: null, // 监测心跳
      popupList: [],  // 存储弹框数据
      pathpopup: 'wss://www.aihs.dev.huanhuigroup.cn/dev/alert-service/websocket/voice',   // websocket链接地址
      socketpopup: null,  // 初始化websocket对象
    }
  },

4.4、mounted中调用初始化的方法 this.initPopupsoket()

 mounted() {
    this.popupList = [];
    this.initPopupsoket()
  },

4.5、编写链接websocket的方法initPopupsoket,接收弹框及语音数据,并进行前后端心跳检测。

 initPopupsoket() {
      if (typeof (WebSocket) === "undefined") {
        alert("您的浏览器不支持socket")
      } else {
        this.socketpopup = new WebSocket(this.pathpopup)
        this.socketpopup.onopen = this.openPopup
        this.socketpopup.onerror = this.errorPopup
        this.socketpopup.onmessage = this.getMessagepopup
      }
    },
   openPopup() {
      console.log("socketpopup连接成功")
      this.startHeartbeat()   // 添加心跳监测,用来防止websocket断开
    },
    startHeartbeat() {// 发送心跳消息
      var _this = this;
      if (_this.heartbeatTimer == null) {
        _this.heartbeatTimer = setInterval(function () {
          console.log('监测心跳')
          _this.socketpopup.send("ping");
        }, 10000);
      }
    },
    stopHeartbeat() { // 停止心跳
      if (this.heartbeatTimer !== null) {
        clearInterval(this.heartbeatTimer);
        this.heartbeatTimer = null;
      }
    },
    errorPopup() {
      console.log("1连接错误")
    },
    getMessagepopup(msg) {
      // console.log('1接受消息数据', msg.data)
      this.popupList.push(JSON.parse(msg.data)) // 将推送的单条数据存起来显示多个弹框,在用户点击确定后消除此条弹框
      this.startSpeech(JSON.parse(msg.data).msg) // 将数据中的告警传给播报的对象
    },
    closePopup() {
      console.log("socketpopup已经关闭")
      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
      window.onbeforeunload = function () {
        this.socketpopup.close();
      }
    },

4.6、语音播报弹框中的数据,每推一条播报一条(注:此处是后端单条数据推送,推送一条播报一条,只读最新的,但是弹框需要显示登录网站后的全部数据,需要用户手动点击确定后弹框消失,故在消息推送后调用语音播报,并将数据存到数组显示弹框。若考虑到数据较多,告警还没读完数据就推送过来,可考虑遍历告警数据进行播报,就不在接收到消息推送后调用此方法)

    startSpeech(text) {
      Speech.speak({
        text: text,
        listeners: {
          //开始播放
          onstart: () => {
            console.log("Start utterance")
          },
          //判断播放是否完毕
          onend: () => {
            console.log("End utterance");
          },
          //恢复播放
          onresume: () => {
            console.log("Resume utterance")
          },
        },
      }).then(() => {
        console.log("读取成功")
      })
    },

4.7、点击确认后消除弹框告警

popupSubmit(item, index) {
      console.log('点击告警弹框', item, index)
      updateCurrentAlertsStatus(item.id, 'READ').then(() => {
        this.$message.success('操作成功!');
        this.popupList.splice(index, 1);
      })
        .catch(() => {
          this.$message.error('操作失败!')
        })
    }

5、页面关闭后清空掉各种方法及数据

 beforeDestroy() {
    this.speech.cancel();  // 取消播放      
    this.speech = null;
    console.log('离开页面', this.speech)
    this.socketpopup.onclose = this.closePopup
  },

遇到的坑:
1、由于浏览器安全限制,用户不主动触发语音告警不会主动出声音,故解决方法是初始化一个全局的
speech-tts方法,在点击登录的时候调用,详情见上
2、websocket链接的时候,如果域名是https的话websocket请求地址需是wss,要不会报错

以上就是我的开发流程,具体有不明白的留言给我!!

标签:播报,vue,websocket,log,tts,弹框,console,告警
From: https://www.cnblogs.com/lhp103/p/18210995

相关文章

  • Vue面试不得不会的20个题——第三篇
    13.Vue中的混入(Mixins)是什么?Vue中的混入(Mixins)是一种分发Vue组件中可复用功能的非常灵活的方式。混入对象是一个包含组件选项的对象,可以包含data、components、created、methods、computed、watch等等。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。......
  • Vue 3 中如何使用全局 API?
    在Vue3中,全局API的使用方式相比Vue2有所变化,主要是由于Vue3引入了CompositionAPI和对Tree-Shaking的优化。以下是一些在Vue3中使用全局API的常见方法:1.创建Vue应用实例在Vue3中,你需要使用createApp方法来创建一个新的Vue应用实例。这是所......
  • Django+Vue前后端分离的原理
    Django+Vue创建项目并实现前后端分离的原理,主要涉及两个主要部分:Django作为后端框架,负责处理业务逻辑和数据;Vue作为前端框架,负责构建用户界面和与后端进行通信。以下是对这一原理的详细讲解:前后端分离的概念:前后端分离是一种软件架构模式,它将应用程序的前端(用户界面)和后端(数......
  • 社区医院|基于SprinBoot+vue的社区医院管理服务系统(源码+数据库+文档)
    社区医院管理服务系统目录基于SprinBoot+vue的社区医院管理服务系统一、前言二、系统设计三、系统功能设计 1系统功能模块2管理员功能模块3用户功能模块4医生功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博......
  • 家政服务|基于SprinBoot+vue的家政服务管理平台(源码+数据库+文档)
    家政服务管理平台目录基于SprinBoot+vue的家政服务管理平台一、前言二、系统设计三、系统功能设计 1前台模块设计2后台功能模块5.2.1管理员功能模块5.2.2用户功能模块5.2.3服务人员功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推......
  • 家乡特色|基于SprinBoot+vue的家乡特色推荐系统(源码+数据库+文档)
    家乡特色推荐系统目录基于SprinBoot+vue的家乡特色推荐系统一、前言二、系统设计三、系统功能设计 1系统功能模块2管理员功能模块3用户功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设......
  • 家政服务|基于SprinBoot+vue的家政服务管理平台(源码+数据库+文档)
    家政服务管理平台目录基于SprinBoot+vue的家政服务管理平台一、前言二、系统设计三、系统功能设计 1前台模块设计2后台功能模块5.2.1管理员功能模块5.2.2用户功能模块5.2.3服务人员功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推......
  • 家乡特色|基于SprinBoot+vue的家乡特色推荐系统(源码+数据库+文档)
    家乡特色推荐系统目录基于SprinBoot+vue的家乡特色推荐系统一、前言二、系统设计三、系统功能设计 1系统功能模块2管理员功能模块3用户功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设......
  • 家政服务|基于SprinBoot+vue的家政服务管理平台(源码+数据库+文档)
    家政服务管理平台目录基于SprinBoot+vue的家政服务管理平台一、前言二、系统设计三、系统功能设计 1前台模块设计2后台功能模块5.2.1管理员功能模块5.2.2用户功能模块5.2.3服务人员功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推......
  • 家政服务|基于SprinBoot+vue的家政服务管理平台(源码+数据库+文档)
    家政服务管理平台目录基于SprinBoot+vue的家政服务管理平台一、前言二、系统设计三、系统功能设计 1前台模块设计2后台功能模块5.2.1管理员功能模块5.2.2用户功能模块5.2.3服务人员功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推......