From 94f79d602d7fd57ca0f656898bb8f2a1294e9bb0 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Thu, 23 Oct 2025 17:06:44 +0800
Subject: [PATCH] Merge branch 'lgh/喊话和广播'
---
src/api/drone.js | 21 +++++++
src/config/env.js | 2
package.json | 1
src/subPackages/droneConsole/index.vue | 130 ++++++++++++++++++++++++++++++++++++++++++-
src/manifest.json | 3
vite.config.js | 2
6 files changed, 152 insertions(+), 7 deletions(-)
diff --git a/package.json b/package.json
index 118abfc..97808fb 100644
--- a/package.json
+++ b/package.json
@@ -76,6 +76,7 @@
"@dcloudio/uni-quickapp-webview": "3.0.0-4070520250711001",
"@dcloudio/uni-ui": "^1.5.11",
"dayjs": "^1.11.18",
+ "js-audio-recorder": "^1.0.7",
"js-base64": "^3.7.4",
"js-md5": "^0.7.3",
"leaflet": "^1.9.4",
diff --git a/src/api/drone.js b/src/api/drone.js
new file mode 100644
index 0000000..ca58a98
--- /dev/null
+++ b/src/api/drone.js
@@ -0,0 +1,21 @@
+import {request} from "@/utils/request"
+
+export const startVoice = data => {
+ return request({
+ url: `/drone-device-core/speak/api/v1/startVoice`,
+ method: 'post',
+ data,
+ })
+}
+
+// 上传音频文件
+export const uploadSpeak = data => {
+ return request({
+ url:'/drone-device-core/speak/api/v1/uploadSpeak',
+ method: 'post',
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ },
+ data,
+ })
+}
diff --git a/src/config/env.js b/src/config/env.js
index b17f88e..75bb396 100644
--- a/src/config/env.js
+++ b/src/config/env.js
@@ -3,7 +3,7 @@
const development = {
VITE_APP_ENV:'development',
// 开发环境这里改为自己的
- VITE_APP_WEBVIEW_URL: 'https://wrj.shuixiongit.com/drone-app-web-view/#/webViewWrapper',
+ VITE_APP_WEBVIEW_URL: 'http://localhost:5173/drone-app-web-view/#/webViewWrapper',
VITE_API_BASE_URL: 'https://wrj.shuixiongit.com/api',
}
diff --git a/src/manifest.json b/src/manifest.json
index 01c7411..2aa2971 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -49,7 +49,8 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
- "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+ "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+ "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />"
]
},
/* ios打包配置 */
diff --git a/src/subPackages/droneConsole/index.vue b/src/subPackages/droneConsole/index.vue
index 8755c84..8df7c7b 100644
--- a/src/subPackages/droneConsole/index.vue
+++ b/src/subPackages/droneConsole/index.vue
@@ -1,20 +1,142 @@
<template>
<WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage"/>
+ <up-toast ref="uNotifyRef"></up-toast>
</template>
<script setup>
import {onHide, onLoad, onShow} from "@dcloudio/uni-app";
import WebViewPlus from "@/components/WebViewPlus.vue";
-import {getWebViewUrl} from "@/utils/index.js";
+import {getEnvObj, getWebViewUrl} from "@/utils/index.js";
+import Recorder from "js-audio-recorder";
+import dayjs from "dayjs";
+import {useUserStore} from "@/store/index.js";
-const viewUrl = ref('')
const wayLineJodInfoId = ref(null)
-function onPostMessage(event) {
+const startState = ref('0')
+let recorder
+const soundVideoName = ref('') // 喊话名称
+soundVideoName.value = `${dayjs().format('YYYYMMDDHHmmss')}实时喊话`
+const droneHornState = ref('0')
+const updateKey = ref(0)
+const uNotifyRef = ref(null)
+const viewUrl = computed(() => {
+ return getWebViewUrl('/DroneConsole', {
+ wayLineJodInfoId: wayLineJodInfoId.value,
+ startState: startState.value,
+ droneHornState: droneHornState.value,
+ updateKey: updateKey.value
+ })
+})
+
+function onPostMessage(data) {
+ if (data.type === 'record') {
+ startState.value = '1'
+ recorder = new Recorder({
+ sampleBits: 16, // 采样位数,支持8或16,默认16
+ sampleRate: 16000, // 采样率,支持11025、16000、22050、24000、44100、48000
+ numChannels: 1, // 声道,支持1或2,默认1
+ })
+ nextTick(() => {
+ recorder.start().then(() => {
+ recorder.onprocess = duration => {
+ }
+ })
+ })
+ } else if (data.type === 'stopRecord') {
+ startState.value = '2'
+ recorder.stop()
+ } else if (data.type === 'trialListening') {
+ recorder.play()
+ } else if (data.type === 'resetRecording') {
+ startState.value = '0'
+ droneHornState.value = '0'
+ recorder?.destroy().then(() => {
+ recorder = null // 释放资源
+ })
+ } else if (data.type === 'pushToDrone') {
+ pushToDrone(data)
+ } else if (data.type === 'saveSound') {
+ saveSound(data)
+ }
+}
+
+const {VITE_API_BASE_URL} = getEnvObj()
+
+function uploadUtil(options) {
+ const {formData, file, url} = options
+ return new Promise((resolve, reject) => {
+ let accessToken = useUserStore()?.$state?.userInfo?.access_token;
+ const file = new File([recorder.getWAVBlob()], '.wav')
+ uni.uploadFile({
+ url: `${VITE_API_BASE_URL}${url}`,
+ name: 'file',
+ header: {'Blade-Auth': 'bearer ' + accessToken},
+ file,
+ formData,
+ success: (res) => {
+ const resData = JSON.parse(res.data)
+ if (resData.code === 200 || resData.code === 0) {
+ resolve(res)
+ } else {
+ showToast(resData.message)
+ reject(res)
+ }
+ },
+ fail: (err) => {
+ reject(err)
+ }
+ });
+ })
+}
+
+function showToast(message) {
+ uNotifyRef.value.show({
+ type: 'default',
+ message,
+ });
+}
+
+
+// 保存喊话至广播列表内
+function saveSound(data) {
+ const file = new File([recorder.getWAVBlob()], '.wav')
+ uploadUtil({
+ file,
+ formData: {
+ fileName: data.soundName,
+ sn: data.dockSn
+ },
+ url: '/drone-device-core/speak/api/v1/uploadSpeak'
+ }).then(res => {
+ showToast('保存成功')
+ })
+}
+
+// 无人机开始喊话
+function pushToDrone(data) {
+ const wavBlob = recorder.getWAVBlob()
+ const file = new File([wavBlob], new Date().getTime() + '.wav')
+ uploadUtil({
+ file,
+ formData: {
+ name: data.soundName,
+ sn: data.dockSn,
+ psdk_index: 2,
+ volumn: 100,
+ },
+ url: '/drone-device-core/speak/api/v1/startVoice'
+ }).then(res => {
+ droneHornState.value = '1'
+ showToast('播放成功')
+ }).catch(() => {
+ droneHornState.value = '0'
+ }).finally(() => {
+ updateKey.value += 1
+ })
}
onLoad((options) => {
wayLineJodInfoId.value = options.wayLineJodInfoId
- viewUrl.value = getWebViewUrl('/DroneConsole', {wayLineJodInfoId: wayLineJodInfoId.value})
})
diff --git a/vite.config.js b/vite.config.js
index a9bdfac..4a556cc 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -13,7 +13,7 @@
const { UNI_PLATFORM,UNI_CUSTOM_DEFINE } = process.env
const ENV_NAME = UNI_CUSTOM_DEFINE && JSON.parse(UNI_CUSTOM_DEFINE)?.ENV_NAME
console.log("平台 -> ", UNI_PLATFORM) // 得到 mp-weixin, h5, app 等
- console.log("环境 -> ", ENV_NAME) // 得到 development,test 等
+ console.log("环境 -> ", ENV_NAME || 'development') // 得到 development,test 等
const env = loadEnv(mode, fileURLToPath(new URL("./env", import.meta.url)))
// console.log("环境变量 env -> ", env)
--
Gitblit v1.9.3