vue3+ts 使用XSwitch 实现简易拨打电话功能

官方中文文档:JS SDK | XSwitch文档中心

1.安装xswitch/rtc

npm install @xswitch/rtc
yarn add @xswitch/rtc

2.初始化 verto,并在需要引入的组件中引入verto

这里举例在pendingTask.vue中引用

pendingTask.vue 

import verto, {Verto, VertoCallcenter} from '@xswitch/rtc'

3.根据文档 封装拨号函数

协议 : websocket

import verto from '@xswitch/rtc'
//用户信息
let cur_call = null;//外呼函数
let ola_extn = 'xxx'
let serIp = 'xxxxx'//用户名
let agentPwd = 'xxx' //密码
//verto 回调函数
let callbacks = {
	//收到消息时的回调
	onMessage: function (verto: any, dialog: any, msg: any, data: any) {
		console.log(msg)
	},
    //状态发生改变时的回调
	onDialogState: function (d: any) {
		cur_call = d.state;
		 switch (d.state.name) {
      case 'ringing':
        onLoading.value = true
        break;
      case 'trying':
        onLoading.value = true
        outTxt.value = '正在接通中...'
        break;
      case 'early':
        onLoading.value = true
        outTxt.value = '正在接通中...'
        break;
      case 'active':
        onLoading.value = true
        outTxt.value = '通话中...'
        break;
      case 'hangup':
      case 'destroy':
        cur_call = null;
        onLoading.value = false
        outTxt.value = '通话已完成'
        break;
      default:
        break;
    }
	},
	onEvent: function (v: any, e: any) {
		console.debug("GOT EVENT", e, v);
	}
}
//登录
const vertoLogin = () => {
	const params = {
		login: ola_extn + "@" + serIp,
		passwd: agentPwd,
		socketUrl: "wss://" + serIp + ":10085/webrtc",//请求地址
		tag: "webcam"
	}
	verto.connect(params, callbacks);
}

//外呼
const doCall = (phone: string) => {
	vertoLogin()
	cur_call = verto.newCall({
		destination_number: phone,
		caller_id_name: ola_extn,
		caller_id_number: ola_extn
	}, '', onSuccess, onError);
}
const onSuccess = () => {
	sessionStorage.setItem('txt', '正在呼叫中')
}
const onError = () => {
	sessionStorage.setItem('txt', '服务器繁忙,请刷新后重试')
}

export { doCall }

4.在组件中使用该方法

//html
<div @click="doOutbound">
    <el-button :loading="onLoading">
       <template #icon>
         <img src="@/assets/static/phone.png" alt="">
        </template>
         {{ outTxt }}
   </el-button>
</div>
  <!-- 外呼media 必须要有,不然听不到声音-->
  <video width=800 id="webcam" autoplay hidden="true"></video>

//js
<script lang="ts" setup>
import doCall from '@/utils/doCall'
//----------------------应用外呼函数
const onLoading = ref(false) //按钮加载状态
const outTxt = ref('外呼') //外呼按钮
const doOutbound = () => {
  if (onLoading.value) return //防止拨号的时候重复发websocket
  if (outTxt.value === '外呼') doCall('这里传入手机号')
  outTxt.value = '外呼'
}
//挂断
const closeOutbound = () => {
  cur_call.hangup()
}
//保持通话
const holdOutbound = () => {
  cur_call.hold();
  isHold.value = true
}
//关闭保持通话
const unHoldOutbound = () => {
  cur_call.unhold();
  isHold.value = false
}
</script>

5.综上,只需要点击一下外呼,即可打通你的第一个电话

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
首先,需要安装Vue3、TypeScript和Element Plus。 安装命令: ``` npm install vue@next vue-router@next typescript@latest --save-dev npm install element-plus --save ``` 接下来,创建一个Vue3 TypeScript项目,并在`main.ts`中引入Element Plus。 ```typescript import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; const app = createApp(App); app.use(router); app.use(ElementPlus); app.mount('#app'); ``` 在`App.vue`中,创建一个表单,包括车牌号码和设备号码两个输入框,并添加一个绑定按钮。 ```html <template> <div class="app"> <form class="form"> <el-form-item label="车牌号码"> <el-input v-model="carNumber"></el-input> </el-form-item> <el-form-item label="设备号码"> <el-input v-model="deviceNumber"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="bindDevice">绑定</el-button> </el-form-item> </form> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'App', setup() { const carNumber = ref(''); const deviceNumber = ref(''); const bindDevice = () => { // TODO: 实现绑定设备的逻辑 }; return { carNumber, deviceNumber, bindDevice, }; }, }); </script> ``` 在`bindDevice`方法中,可以调用API将车辆和设备进行绑定。这里使用mock数据模拟API请求。 ```typescript const bindDevice = () => { // TODO: 实现绑定设备的逻辑 console.log(`车牌号码:${carNumber.value},设备号码:${deviceNumber.value}`); // mock API请求 setTimeout(() => { console.log('绑定成功!'); carNumber.value = ''; deviceNumber.value = ''; }, 2000); }; ``` 最后,运行项目即可看到界面和绑定设备的功能。 完整代码如下: ```html <template> <div class="app"> <form class="form"> <el-form-item label="车牌号码"> <el-input v-model="carNumber"></el-input> </el-form-item> <el-form-item label="设备号码"> <el-input v-model="deviceNumber"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="bindDevice">绑定</el-button> </el-form-item> </form> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'App', setup() { const carNumber = ref(''); const deviceNumber = ref(''); const bindDevice = () => { console.log(`车牌号码:${carNumber.value},设备号码:${deviceNumber.value}`); // mock API请求 setTimeout(() => { console.log('绑定成功!'); carNumber.value = ''; deviceNumber.value = ''; }, 2000); }; return { carNumber, deviceNumber, bindDevice, }; }, }); </script> <style scoped> .app { display: flex; justify-content: center; align-items: center; height: 100vh; } .form { width: 400px; } </style> ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值