罗广辉
2025-10-22 fa4191dfe098fe356bdb1d24ab5762dd5728ab22
feat: 喊话和广播
3 files modified
1 files added
73 ■■■■■ changed files
package.json 1 ●●●● patch | view | raw | blame | history
src/api/drone.js 9 ●●●●● patch | view | raw | blame | history
src/manifest.json 3 ●●●● patch | view | raw | blame | history
src/subPackages/droneConsole/index.vue 60 ●●●●● patch | view | raw | blame | history
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",
src/api/drone.js
New file
@@ -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,
  })
}
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打包配置 */
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})
})