From fa4191dfe098fe356bdb1d24ab5762dd5728ab22 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Wed, 22 Oct 2025 19:42:38 +0800
Subject: [PATCH] feat: 喊话和广播

---
 src/api/drone.js                       |    9 ++++
 package.json                           |    1 
 src/subPackages/droneConsole/index.vue |   60 ++++++++++++++++++++++++++++-
 src/manifest.json                      |    3 +
 4 files changed, 69 insertions(+), 4 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..764eda3
--- /dev/null
+++ b/src/api/drone.js
@@ -0,0 +1,9 @@
+import {request} from "@/utils/request"
+
+export const startVoice = data => {
+  return request({
+    url: `/drone-device-core/speak/api/v1/startVoice`,
+    method: 'post',
+    data,
+  })
+}
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..48420da 100644
--- a/src/subPackages/droneConsole/index.vue
+++ b/src/subPackages/droneConsole/index.vue
@@ -5,16 +5,70 @@
 import {onHide, onLoad, onShow} from "@dcloudio/uni-app";
 import WebViewPlus from "@/components/WebViewPlus.vue";
 import {getWebViewUrl} from "@/utils/index.js";
+import Recorder from "js-audio-recorder";
+import dayjs from "dayjs";
+import {startVoice} from "@/api/drone.js";
+import {showToast} from "@dcloudio/uni-h5";
 
-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 viewUrl = computed(()=>{
+  return getWebViewUrl('/DroneConsole', {
+    wayLineJodInfoId: wayLineJodInfoId.value,
+    startState: startState.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'
+    recorder?.destroy().then(() => {
+      recorder = null // 释放资源
+    })
+  }else if(data.type === 'pushToDrone'){
+    pushToDrone()
+  }
+}
+
+// 无人机开始喊话
+function pushToDrone() {
+  let formData = new FormData()
+  const wavBlob = recorder.getWAVBlob()
+  const wavform = new File([wavBlob], new Date().getTime() + '.wav')
+  formData.append('file', wavform)
+  formData.append('sn', dockSn.value)
+  formData.append('psdk_index', 2)
+  formData.append('name', soundVideoName.value)
+  formData.append('volumn', 100)
+  startVoice(formData).then(res => {
+    showToast('喊话成功')
+  })
 }
 
 onLoad((options) => {
   wayLineJodInfoId.value = options.wayLineJodInfoId
-  viewUrl.value = getWebViewUrl('/DroneConsole', {wayLineJodInfoId: wayLineJodInfoId.value})
 })
 
 

--
Gitblit v1.9.3