远程设备控制

This commit is contained in:
yj 2024-09-10 11:33:18 +08:00
parent e40ff8c931
commit edf7ce3629
4 changed files with 125 additions and 18 deletions

View File

@ -3,6 +3,7 @@
>div { >div {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 10px;
>span { >span {
color: #EEEEEE; color: #EEEEEE;
@ -15,5 +16,6 @@
>div:nth-child(2) { >div:nth-child(2) {
display: flex; display: flex;
justify-content: center; justify-content: center;
margin-top: 20px;
} }
} }

View File

@ -1,18 +1,30 @@
import styles from '@/components/EquipmentManagement/index.module.scss' import styles from '@/components/EquipmentManagement/index.module.scss'
import { Button, Modal } from 'antd'; import { onInvoke } from '@/utils/package/signalr';
import { Button, Modal, Select } from 'antd';
import { useState, useImperativeHandle, forwardRef } from "react"; import { useState, useImperativeHandle, forwardRef } from "react";
// import { agora } from '@/utils/package/agora';
const EquipmentManagement = forwardRef((_props: any, ref: any) => { const EquipmentManagement = forwardRef((_props: any, ref: any) => {
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
changeModal: () => { changeModal: async (uid: string, userName: string) => {
setCallerUid(uid)
setDeviceInfo({})
await onInvoke('getDrivers', {
uid
})
setUserName(userName)
setEquipmentManagementModal(true) setEquipmentManagementModal(true)
},
setData: (data: any) => {
setDeviceInfo(data)
} }
})) }))
const [equipmentManagementModal, setEquipmentManagementModal] = useState(false) const [equipmentManagementModal, setEquipmentManagementModal] = useState(false)
const [callerUid, setCallerUid] = useState('')
const [deviceInfo, setDeviceInfo] = useState<any>({})
const [userName, setUserName] = useState<any>({})
return ( return (
<> <>
<Modal <Modal
title="设备管理" title={`设备管理(${userName})`}
open={equipmentManagementModal} open={equipmentManagementModal}
footer={null} footer={null}
centered centered
@ -24,20 +36,47 @@ const EquipmentManagement = forwardRef((_props: any, ref: any) => {
<div> <div>
<div> <div>
<span></span> <span></span>
<Select
placeholder={deviceInfo?.videoList?.length ? '请选择设备' : '未检测到摄像头'}
options={deviceInfo?.videoList} style={{ flexGrow: 1 }}
value={deviceInfo?.videoDeviceId} onChange={async (e) => {
setDeviceInfo({
...deviceInfo,
videoDeviceId: e
})
}} />
</div> </div>
<div> <div>
<span></span> <span></span>
<Select
placeholder={deviceInfo?.ecordingList?.length ? '请选择设备' : '未检测到麦克风'}
options={deviceInfo?.ecordingList} style={{ flexGrow: 1 }}
value={deviceInfo?.ecordingDeviceId} onChange={async (e) => {
setDeviceInfo({
...deviceInfo,
ecordingDeviceId: e
})
}} />;
</div> </div>
<div> <div>
<span></span> <span></span>
<Select
placeholder={deviceInfo?.playBackList?.length ? '请选择设备' : '未检测到麦克风'}
options={deviceInfo?.playBackList} style={{ flexGrow: 1 }}
value={deviceInfo?.playBackDeviceId} onChange={async (e) => {
setDeviceInfo({
...deviceInfo,
playBackDeviceId: e
})
}} />;
</div> </div>
</div> </div>
<div> <div>
<Button type="primary" className='m-ant-btn' onClick={() => { <Button type="primary" className='m-ant-btn' onClick={() => {
onInvoke('setDrivers', {
uid: callerUid,
driversJsonString: JSON.stringify(deviceInfo)
})
}}></Button> }}></Button>
<Button type="primary" <Button type="primary"
style={{ backgroundColor: '#31353A', marginLeft: '10px' }} style={{ backgroundColor: '#31353A', marginLeft: '10px' }}

View File

@ -457,11 +457,55 @@ const Meeting: React.FC = () => {
break; break;
// 设备列表 // 设备列表
case 'DriverList': case 'DriverList':
console.log(item); const setting = JSON.parse(storage.getItem('setting') as string)
Promise.all([
agora.getVideoDeviceManager(),
agora.getAudioMediaList(),
]).then((res) => {
const data = {
videoList: res[0].list.map((row: any) => {
return {
value: row.deviceId,
label: row.deviceName
}
}),
videoDeviceId: setting.videoDeviceId,
ecordingList: res[1].ecordingList.map((row: any) => {
return {
value: row.deviceId,
label: row.deviceName
}
}),
ecordingDeviceId: setting.ecordingDeviceId,
playBackList: res[1].playBackList.map((row: any) => {
return {
value: row.deviceId,
label: row.deviceName
}
}),
playBackDeviceId: setting.playBackDeviceId,
}
onInvoke('sendDrivers', {
uid: item.callerUid,
driversJsonString: JSON.stringify(data)
})
})
break; break;
// 设置设备 // 设置设备
case 'SetDriver': case 'SaveDriver':
console.log(item); if (item.driver) {
const data = JSON.parse(item.driver);
await agora.setVideoDeviceManager(data.videoDeviceId)
await agora.setRecordingDevice(data.ecordingDeviceId)
await agora.setPlaybackDevice(data.playBackDeviceId)
}
break;
// 显示设备列表
case 'ShowDriverList':
if (item.driversJsonString) {
const data = JSON.parse(item.driversJsonString);
equipmentManagementRef.current.setData(data)
}
break; break;
} }
}) })
@ -909,7 +953,8 @@ const Meeting: React.FC = () => {
await postOpenCamera(true, user.uid) await postOpenCamera(true, user.uid)
break; break;
case '设置': case '设置':
stupWizardRef.current.changeModal() equipmentManagementRef.current.changeModal('26', '杨洁')
// stupWizardRef.current.changeModal()
break; break;
case '邀请人员': case '邀请人员':
await getUserRoomInfo().then(async (res) => { await getUserRoomInfo().then(async (res) => {
@ -1130,8 +1175,8 @@ const Meeting: React.FC = () => {
}, 0); }, 0);
} }
// 设备管理 // 设备管理
const equipmentManagement = (uid: string, userName: string): void => { const equipmentManagement = async (uid: string, userName: string): Promise<void> => {
equipmentManagementRef.current.changeModal() equipmentManagementRef.current.changeModal(uid, userName)
} }
// 开关麦克风 // 开关麦克风
const postOpenMicr = async (enableMicr: boolean, uid: string, isAll: boolean = false): Promise<void> => { const postOpenMicr = async (enableMicr: boolean, uid: string, isAll: boolean = false): Promise<void> => {

View File

@ -161,18 +161,26 @@ export const onSignalr = (callBack: Function) => {
}) })
}); });
// 设备列表 // 设备列表
connection.on("DriverList", () => { connection.on("DriverList", (callerUid: string) => {
callBack({ callBack({
key: 'DriverList' key: 'DriverList',
callerUid
}) })
}); });
// 设置设备 // 设置设备
connection.on("SetDriver", (driver:string) => { connection.on("SaveDriver", (driver: string) => {
callBack({ callBack({
key: 'SetDriver', key: 'SaveDriver',
driver driver
}) })
}); });
// 显示设备列表
connection.on("ShowDriverList", (driversJsonString: string) => {
callBack({
key: 'ShowDriverList',
driversJsonString
})
});
} }
} }
export const offSignalr = () => { export const offSignalr = () => {
@ -193,6 +201,7 @@ export const offSignalr = () => {
connection.off('Watch'); connection.off('Watch');
connection.off('DriverList'); connection.off('DriverList');
connection.off('SetDriver'); connection.off('SetDriver');
connection.off('ShowDriverList');
} }
} }
export const onInvoke = async (str: string, data: any) => { export const onInvoke = async (str: string, data: any) => {
@ -204,6 +213,18 @@ export const onInvoke = async (str: string, data: any) => {
// 4:屏幕共享 // 4:屏幕共享
await connection.invoke(str, data.roomNum, data.type) await connection.invoke(str, data.roomNum, data.type)
break; break;
case 'getDrivers':
// 获取某个人的设备列表
await connection.invoke(str, data.uid)
break;
case 'sendDrivers':
// 发送设备列表给某个人
await connection.invoke(str, data.uid, data.driversJsonString)
break;
case 'setDrivers':
// 设置某个人的设备列表
await connection.invoke(str, data.uid, data.driversJsonString)
break;
} }
} }
export const onStop = async () => { export const onStop = async () => {