feat: 完成监控相关UI+逻辑
This commit is contained in:
parent
5954c8a838
commit
abbbec9cdb
@ -5,7 +5,7 @@ import request from '../utils/request'
|
|||||||
// 获取p2pInfo
|
// 获取p2pInfo
|
||||||
export function getP2pInfo(data) {
|
export function getP2pInfo(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/v1/tencentYun/getDeviceDetail',
|
url: '/passthrough',
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
|
|||||||
@ -29,15 +29,6 @@
|
|||||||
"version": "latest",
|
"version": "latest",
|
||||||
"provider": "wx1319af22356934bf",
|
"provider": "wx1319af22356934bf",
|
||||||
"export": "exportForXp2pPlugin.js"
|
"export": "exportForXp2pPlugin.js"
|
||||||
},
|
|
||||||
"wechat-p2p-player": {
|
|
||||||
"version": "latest",
|
|
||||||
"provider": "wx9e8fbc98ceac2628",
|
|
||||||
"export": "exportForPlayerPlugin.js"
|
|
||||||
},
|
|
||||||
"wmpf-voip": {
|
|
||||||
"version": "latest",
|
|
||||||
"provider": "wxf830863afde621eb"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
21
pages.json
21
pages.json
@ -16,6 +16,7 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom",
|
||||||
"navigationBarTitleText": "监控",
|
"navigationBarTitleText": "监控",
|
||||||
|
"disableScroll": true,
|
||||||
"mp-weixin": {
|
"mp-weixin": {
|
||||||
"usingComponents": {
|
"usingComponents": {
|
||||||
"iot-p2p-player-with-mjpg": "plugin://xp2p/iot-p2p-player-with-mjpg",
|
"iot-p2p-player-with-mjpg": "plugin://xp2p/iot-p2p-player-with-mjpg",
|
||||||
@ -23,8 +24,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "authorizeWechat",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "微信授权",
|
||||||
|
"disableScroll": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"plugins": {
|
||||||
|
"wechat-p2p-player": {
|
||||||
|
"version": "latest",
|
||||||
|
"provider": "wx9e8fbc98ceac2628",
|
||||||
|
"export": "exportForPlayerPlugin.js"
|
||||||
|
},
|
||||||
|
"wmpf-voip": {
|
||||||
|
"version": "latest",
|
||||||
|
"provider": "wxf830863afde621eb"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"root": "pages/addDevice",
|
"root": "pages/addDevice",
|
||||||
|
|||||||
@ -221,6 +221,16 @@
|
|||||||
></image>
|
></image>
|
||||||
<view>消息提醒</view>
|
<view>消息提醒</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view
|
||||||
|
class="menu-main-view transform-scale-105"
|
||||||
|
@click="$basic.routeJump({ name: 'p2pPlayer' })"
|
||||||
|
>
|
||||||
|
<image
|
||||||
|
class="menu-main-image"
|
||||||
|
src="https://oss-lock.xhjcn.ltd/mp/icon_wechat_call.png"
|
||||||
|
></image>
|
||||||
|
<view>微信呼叫</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="setting" @click="$basic.routeJump({ name: 'setting' })">
|
<view class="setting" @click="$basic.routeJump({ name: 'setting' })">
|
||||||
|
|||||||
@ -1,20 +1,31 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<iot-p2p-player-with-mjpg
|
<iot-p2p-player-with-mjpg
|
||||||
|
v-if="deviceInfo"
|
||||||
id="playerRef"
|
id="playerRef"
|
||||||
:deviceInfo="deviceInfo"
|
:deviceInfo="deviceInfo"
|
||||||
:xp2pInfo="xp2pInfo"
|
:xp2pInfo="xp2pInfo"
|
||||||
:rotate="90"
|
:rotate="90"
|
||||||
:muted="isMute"
|
:muted="isMute"
|
||||||
|
mode="RTC"
|
||||||
|
:acceptPlayerEvents="true"
|
||||||
|
soundMode="speaker"
|
||||||
|
sceneType="live"
|
||||||
streamQuality="high"
|
streamQuality="high"
|
||||||
:minCache="0.2"
|
:minCache="0.2"
|
||||||
:maxCache="0.8"
|
:maxCache="0.8"
|
||||||
:fill="true"
|
:fill="true"
|
||||||
orientation="horizontal"
|
orientation="horizontal"
|
||||||
@statechange="handleStateChange"
|
@playsuccess="handlePlaySuccess"
|
||||||
>
|
>
|
||||||
</iot-p2p-player-with-mjpg>
|
</iot-p2p-player-with-mjpg>
|
||||||
|
<image
|
||||||
|
v-if="!isVideoLoaded"
|
||||||
|
src="https://oss-lock.xhjcn.ltd/mp/background_monitor.png"
|
||||||
|
class="w-full h-full absolute top-0 left-0"
|
||||||
|
></image>
|
||||||
<iot-p2p-voice
|
<iot-p2p-voice
|
||||||
|
v-if="deviceInfo"
|
||||||
id="voiceComponent"
|
id="voiceComponent"
|
||||||
:deviceInfo="deviceInfo"
|
:deviceInfo="deviceInfo"
|
||||||
:xp2pInfo="xp2pInfo"
|
:xp2pInfo="xp2pInfo"
|
||||||
@ -23,6 +34,7 @@
|
|||||||
</iot-p2p-voice>
|
</iot-p2p-voice>
|
||||||
|
|
||||||
<view
|
<view
|
||||||
|
v-if="isVideoLoaded"
|
||||||
class="fixed bottom-[calc(32rpx+env(safe-area-inset-bottom))] bg-[rgba(0,0,0,0.3)] rounded-xl p-4 shadow-lg mx-4 w-622"
|
class="fixed bottom-[calc(32rpx+env(safe-area-inset-bottom))] bg-[rgba(0,0,0,0.3)] rounded-xl p-4 shadow-lg mx-4 w-622"
|
||||||
>
|
>
|
||||||
<view class="flex items-center justify-around mx-10">
|
<view class="flex items-center justify-around mx-10">
|
||||||
@ -72,11 +84,22 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view
|
||||||
|
v-if="!isVideoLoaded"
|
||||||
|
class="fixed bottom-[calc(48rpx+env(safe-area-inset-bottom))] w-full flex justify-center"
|
||||||
|
>
|
||||||
|
<up-loading-icon
|
||||||
|
size="70rpx"
|
||||||
|
:vertical="true"
|
||||||
|
textSize="28rpx"
|
||||||
|
text="连接中"
|
||||||
|
mode="circle"
|
||||||
|
></up-loading-icon>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { getXp2pManager } from './xp2pManager'
|
|
||||||
import { useBluetoothStore } from '@/stores/bluetooth'
|
import { useBluetoothStore } from '@/stores/bluetooth'
|
||||||
import { useBasicStore } from '@/stores/basic'
|
import { useBasicStore } from '@/stores/basic'
|
||||||
import { onMounted, ref } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
@ -86,36 +109,30 @@
|
|||||||
const $bluetooth = useBluetoothStore()
|
const $bluetooth = useBluetoothStore()
|
||||||
const $basic = useBasicStore()
|
const $basic = useBasicStore()
|
||||||
|
|
||||||
let xp2pManager = null
|
|
||||||
|
|
||||||
const deviceInfo = ref()
|
const deviceInfo = ref()
|
||||||
const xp2pInfo = ref()
|
const xp2pInfo = ref()
|
||||||
|
|
||||||
const isVoice = ref(false)
|
const isVoice = ref(false)
|
||||||
|
|
||||||
const isMute = ref(false)
|
const isMute = ref(false)
|
||||||
|
const isVideoLoaded = ref(false)
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
if (!xp2pManager) {
|
|
||||||
xp2pManager = getXp2pManager()
|
|
||||||
}
|
|
||||||
|
|
||||||
const { code, data, message } = await getP2pInfo({
|
const { code, data, message } = await getP2pInfo({
|
||||||
lockId: $bluetooth.currentLockInfo.lockId
|
request_method: 'GET',
|
||||||
|
request_uri: '/api/v1/tencentYun/getDeviceDetailData',
|
||||||
|
post_args: {
|
||||||
|
lockId: $bluetooth.currentLockInfo.lockId
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
deviceInfo.value = {
|
deviceInfo.value = {
|
||||||
deviceId: `${data.productId}/${data.deviceId}`,
|
deviceId: `${data.productId}/${data.deviceName}`,
|
||||||
productId: data.productId,
|
productId: data.productId,
|
||||||
deviceName: data.deviceName
|
deviceName: data.deviceName
|
||||||
}
|
}
|
||||||
xp2pInfo.value = data.xp2pInfo
|
xp2pInfo.value = data.xp2pInfo
|
||||||
await xp2pManager.startP2PService({
|
|
||||||
deviceInfo: deviceInfo.value,
|
|
||||||
xp2pInfo: xp2pInfo.value,
|
|
||||||
caller: 1
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
$basic.backAndToast(message)
|
$basic.backAndToast(message)
|
||||||
}
|
}
|
||||||
@ -180,8 +197,8 @@
|
|||||||
voice.stopVoice()
|
voice.stopVoice()
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleStateChange = state => {
|
const handlePlaySuccess = () => {
|
||||||
console.log(11111111, state)
|
isVideoLoaded.value = true
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -1,29 +0,0 @@
|
|||||||
export const getUserId = () => {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
export function compareVersion(ver1, ver2) {
|
|
||||||
const v1 = ver1.split('.')
|
|
||||||
const v2 = ver2.split('.')
|
|
||||||
const len = Math.max(v1.length, v2.length)
|
|
||||||
|
|
||||||
while (v1.length < len) {
|
|
||||||
v1.push('0')
|
|
||||||
}
|
|
||||||
while (v2.length < len) {
|
|
||||||
v2.push('0')
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
const num1 = parseInt(v1[i])
|
|
||||||
const num2 = parseInt(v2[i])
|
|
||||||
|
|
||||||
if (num1 > num2) {
|
|
||||||
return 1
|
|
||||||
} else if (num1 < num2) {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
@ -1,118 +0,0 @@
|
|||||||
import { getUserId, compareVersion } from './utils'
|
|
||||||
|
|
||||||
let xp2pManager = null
|
|
||||||
export const getXp2pManager = () => {
|
|
||||||
if (!xp2pManager) {
|
|
||||||
let xp2pPlugin = requirePlugin('xp2p')
|
|
||||||
|
|
||||||
console.log(11111, xp2pPlugin)
|
|
||||||
|
|
||||||
const iotExports = xp2pPlugin.iot
|
|
||||||
const app = getApp()
|
|
||||||
|
|
||||||
// 用户id,微信用户在此小程序中的唯一标识
|
|
||||||
iotExports?.setUserId?.(getUserId() || 'demo')
|
|
||||||
|
|
||||||
// 开发版才打插件log
|
|
||||||
if (app.pluginLogger && uni.getAccountInfoSync().miniProgram.envVersion === 'develop') {
|
|
||||||
iotExports?.setPluginLogger?.(app.pluginLogger)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置优先使用的打洞协议
|
|
||||||
if (
|
|
||||||
compareVersion(uni.getSystemInfoSync().SDKVersion, '3.4.1') >= 0 &&
|
|
||||||
xp2pPlugin.p2p.setTcpFirst
|
|
||||||
) {
|
|
||||||
const tcpFirstKey = 'tcpFirst'
|
|
||||||
const tcpFirstTime = parseInt(uni.getStorageSync(tcpFirstKey), 10)
|
|
||||||
const tcpFirst = !!(tcpFirstTime && Date.now() - tcpFirstTime < 3600000 * 24) // 24小时内有效
|
|
||||||
console.log('tcpFirst', tcpFirst)
|
|
||||||
xp2pPlugin.p2p.setTcpFirst(tcpFirst)
|
|
||||||
|
|
||||||
// 给index页用,方便测试时调整tcpFirst
|
|
||||||
app.tcpFirst = tcpFirst
|
|
||||||
app.toggleTcpFirst = async () => {
|
|
||||||
const modalRes = await uni.showModal({
|
|
||||||
title: '确定切换 tcpFirst 吗?',
|
|
||||||
content: '切换后需要重新进入小程序'
|
|
||||||
})
|
|
||||||
if (!modalRes || !modalRes.confirm) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
uni.setStorageSync(tcpFirstKey, tcpFirst ? '' : Date.now())
|
|
||||||
app.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置是否连接对端stun
|
|
||||||
if (xp2pPlugin.p2p.setCrossStunTurn) {
|
|
||||||
const crossStunTurnKey = 'crossStunTurn'
|
|
||||||
const crossStunTurnTime = parseInt(uni.getStorageSync(crossStunTurnKey), 10)
|
|
||||||
const crossStunTurn = !!(crossStunTurnTime && Date.now() - crossStunTurnTime < 3600000 * 24) // 24小时内有效
|
|
||||||
xp2pPlugin.p2p.setCrossStunTurn(crossStunTurn)
|
|
||||||
// 给index页用,方便测试时调整crossStunTurn
|
|
||||||
app.crossStunTurn = crossStunTurn
|
|
||||||
app.toggleCrossStunTurn = async () => {
|
|
||||||
const modalRes = await uni.showModal({
|
|
||||||
title: '确定切换 crossStunTurn 吗?',
|
|
||||||
content: '切换后需要重新进入小程序'
|
|
||||||
})
|
|
||||||
if (!modalRes || !modalRes.confirm) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
uni.setStorageSync(crossStunTurnKey, crossStunTurn ? '' : Date.now())
|
|
||||||
app.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置切换端口
|
|
||||||
if (xp2pPlugin.p2p.updateStunPort) {
|
|
||||||
const portKey = 'STUN_PORT'
|
|
||||||
const stunPort = uni.getStorageSync(portKey) || 20002
|
|
||||||
xp2pPlugin.p2p.updateStunPort(stunPort)
|
|
||||||
app.stunPort = stunPort
|
|
||||||
app.togglePort = async port => {
|
|
||||||
const modalRes = await uni.showModal({
|
|
||||||
title: '确定切换 stunPort 吗?',
|
|
||||||
content: '切换后需要重新进入小程序'
|
|
||||||
})
|
|
||||||
if (!modalRes || !modalRes.confirm) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
uni.setStorageSync(portKey, port)
|
|
||||||
app.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置切换配置跟随
|
|
||||||
if (xp2pPlugin.p2p.setUseDeliveryConfig) {
|
|
||||||
const useDeliveryConfigKey = 'useDeliveryConfig'
|
|
||||||
const useDeliveryConfigTime = parseInt(uni.getStorageSync(useDeliveryConfigKey), 10)
|
|
||||||
const useDeliveryConfig = !!(
|
|
||||||
useDeliveryConfigTime && Date.now() - useDeliveryConfigTime < 3600000 * 24
|
|
||||||
) // 24小时内有效
|
|
||||||
xp2pPlugin.p2p.setUseDeliveryConfig(useDeliveryConfig)
|
|
||||||
app.useDeliveryConfig = useDeliveryConfig
|
|
||||||
app.toggleUseDeliveryConfig = async () => {
|
|
||||||
const modalRes = await uni.showModal({
|
|
||||||
title: '确定切换 使用设备跟随 吗?',
|
|
||||||
content: '切换后需要重新进入小程序'
|
|
||||||
})
|
|
||||||
if (!modalRes || !modalRes.confirm) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
uni.setStorageSync(useDeliveryConfigKey, useDeliveryConfig ? '' : Date.now())
|
|
||||||
app.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xp2pManager = iotExports.getXp2pManager()
|
|
||||||
app.logger?.log('xp2pManager', {
|
|
||||||
P2PPlayerVersion: xp2pManager.P2PPlayerVersion,
|
|
||||||
XP2PVersion: xp2pManager.XP2PVersion,
|
|
||||||
// uuid,插件随机生成的id,存储在小程序本地,删除小程序后会重新生成
|
|
||||||
uuid: xp2pManager.uuid
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return xp2pManager
|
|
||||||
}
|
|
||||||
@ -391,6 +391,11 @@ const pages = [
|
|||||||
name: 'p2pPlayer',
|
name: 'p2pPlayer',
|
||||||
path: '/pages/p2p/p2pPlayer',
|
path: '/pages/p2p/p2pPlayer',
|
||||||
tabBar: false
|
tabBar: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'authorizeWechat',
|
||||||
|
path: '/pages/p2p/authorizeWechat',
|
||||||
|
tabBar: false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -29,13 +29,13 @@ const request = config => {
|
|||||||
const timestamp = new Date().getTime()
|
const timestamp = new Date().getTime()
|
||||||
timer = setTimeout(() => {
|
timer = setTimeout(() => {
|
||||||
resolve({ code: -1, message: '网络访问失败,请检查网络是否正常' })
|
resolve({ code: -1, message: '网络访问失败,请检查网络是否正常' })
|
||||||
}, 7200)
|
}, 30200)
|
||||||
uni.request({
|
uni.request({
|
||||||
url: URL,
|
url: URL,
|
||||||
method,
|
method,
|
||||||
header,
|
header,
|
||||||
data,
|
data,
|
||||||
timeout: 7000,
|
timeout: 30000,
|
||||||
async success(res) {
|
async success(res) {
|
||||||
const { statusCode, data } = res
|
const { statusCode, data } = res
|
||||||
if (timer) {
|
if (timer) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user