浏览代码

修改代码

zhoutao 1 月之前
父节点
当前提交
0f07b107b2
共有 7 个文件被更改,包括 176 次插入98 次删除
  1. 84 39
      app.js
  2. 3 0
      app.json
  3. 43 22
      pages/home/home.js
  4. 3 3
      sysconfig/sysconfig.js
  5. 9 9
      utils/request.js
  6. 二进制
      wasm/aplm8000sdk.wasm
  7. 34 25
      worker/wasmapi.js

+ 84 - 39
app.js

@@ -1,3 +1,6 @@
+import { userMobileLogin } from './api/wxlogin.js'
+import sysconfig from './sysconfig/sysconfig.js'
+
 // app.js
 App({
     data: {//数据
@@ -6,13 +9,50 @@ App({
         wavFilePath: '',//wav文件路径
         readFileTimes: 0,//读取本地文件次数
         imuStartTimestamp: 0,//IMU开始时间戳
+        loginFlag: false,//登录标识符
     },
+    //初始化全局参数,在小程序存活期间onLaunch只执行一次
     onLaunch() {
+        // 用户登录登录(发送登录凭证[res.code]到后台换取openId、sessionKey和unionId)
+        wx.login({
+            success: (res) => {
+                var paramData = {};
+                paramData.code = res.code; //登录凭证
+                paramData.domain_name = sysconfig.domanName; //系统二级域名(用二级域名换取项目编号)
+
+                userMobileLogin(paramData).then((resp) => {
+                    //保存token
+                    const tokenKey = sysconfig.user.tokenKey
+                    wx.setStorageSync(tokenKey, resp.data.data.token)
+
+                    //保存用户数据
+                    const userInfoKey = sysconfig.user.userInfoKey
+                    wx.setStorageSync(userInfoKey, resp.data.data)
+
+                    this.data.loginFlag = true//登录成功
+                }).catch((err) => {
+                    this.data.loginFlag = false//登录失败
+                    console.log("%%%%%%%%", err.message)
+                    wx.showToast({
+                        title: '用户登录失败' + err.message,
+                        icon: 'error',
+                        duration: 10000
+                    })
+                })
+            }
+        })
     },
     //创建线程(listener:线程监听服务程序)
     createWorker(listener) {
         if (this.data.worker == null) {
-            this.data.worker = wx.createWorker("worker/worker.js")
+            this.data.worker = wx.createWorker("worker/worker.js", {
+                useExperimentalWorker: true//使用实验worker,提升ios下js运行效率
+            })
+
+            // 监听worker被系统回收事件
+            this.data.worker.onProcessKilled(() => {
+                this.createNewWorker()// 重新创建一个worker
+            })
 
             //设置线程监听服务程序
             if (typeof (listener) === 'function') {
@@ -58,8 +98,15 @@ App({
             })
         })
 
-        //延迟1秒后开始录音,以便让录音机稳定
-        setTimeout(this.startRecord, 1000)
+        //注册录音被打断回调函数
+        this.data.recorder.onInterruptionBegin(() => {
+            console.log("录音被打断")
+        })
+
+        //注册监听录音中断结束事件
+        this.data.recorder.onInterruptionEnd(() => {
+            this.resumeRecord()//恢复录音
+        })
     },
     //开始录音
     startRecord() {
@@ -69,24 +116,32 @@ App({
             //组织录音参数
             options.duration = 600000 //最长连续录音10分钟
             options.sampleRate = 48000 //采样频率
-            options.encodeBitRate = 320000 //TODO,编码率,不知道干什么用的
+            options.encodeBitRate = 320000 //编码率,与采样率配对适用,参照腾讯文档要求设置具体值
             options.numberOfChannels = 1 //单通道采样
             options.format = "pcm"
             options.frameSize = "22" //单位kB(数据不会太准确,因此需要缓存数据以实施成帧操作)
+            options.audioSource = "auto"//录音源,默认使用手机麦克风,插上耳麦后自动切换使用耳机麦克风,所有平台适用。
 
             //开始录音
             this.data.recorder.start(options)
         }
     },
+    //恢复录音
+    resumeRecord() {
+        if (this.data.recorder != null) {
+            this.data.recorder.resume()
+        }
+    },
     //打开蓝牙适配器
     openBleAdapter() {
         let self = this
 
         wx.openBluetoothAdapter({
-            mode: "central",
-            success: function (res) {//打开成功,开始扫描周边设备
+            mode: "central",//主机模式
+            //打开成功,开始扫描周边设备
+            success: function (res) {
                 wx.startBluetoothDevicesDiscovery({
-                    allowDuplicatesKey: true,
+                    allowDuplicatesKey: true,//允许重复上报同一设备,每次上报RSSI值会有不同
                     interval: 2000,//2秒扫描一次
                     powerLevel: "medium",
                     success() {
@@ -94,42 +149,14 @@ App({
                     }
                 })
             },
-            fail: function (err) {//打开失败
+            //打开失败
+            fail: function (err) {
                 console.log("open ble fail", err)
                 setTimeout(() => {
                     self.openBleAdapter()
                 }, 3000)
             }
         })
-
-        //this.monitorBleBtsScanResult();
-
-
-        // // 监听扫描到新设备事件
-        // wx.onBluetoothDeviceFound((res) => {
-        //     console.log("扫描到了蓝牙设备")
-        //     res.devices.forEach((device) => {
-        //         console.log('Device Found', device)
-        //     })
-        // })
-    },
-    //开始扫描周边蓝牙设备
-    startScanNearbyBleBts() {
-        let self = this
-
-        //扫描周边设备
-        wx.startBluetoothDevicesDiscovery({
-            allowDuplicatesKey: true,//允许重复上报已扫描到的设备
-            interval: 3000,//3秒扫描一次
-            powerLevel: "medium",
-            success: function () {
-                self.monitorBleBtsScanResult()//监听蓝牙基站扫描结果
-            },
-            fail: function () {
-                //500毫秒之后重新扫描
-                setTimeout(self.startScanNearbyBleBts, 500)
-            }
-        })
     },
     //监听蓝牙基站扫描结果
     monitorBleBtsScanResult() {
@@ -142,8 +169,8 @@ App({
             res.devices.forEach((element) => {
                 if (element.name && element.name.length == 23) {
 
-                    let bleName = element.name
-                    let subName = bleName.slice(-10)
+                    let bleName = element.name//蓝牙名称
+                    let subName = bleName.slice(-10)//蓝牙项目标识符
 
                     //该设备为本系统设备
                     if (subName === "IPS8000BLE") {
@@ -297,4 +324,22 @@ App({
             return { code: 0, data: e }
         }
     },
+    //开始扫描周边蓝牙设备
+    startScanNearbyBleBts() {
+        let self = this
+
+        //扫描周边设备
+        wx.startBluetoothDevicesDiscovery({
+            allowDuplicatesKey: true,//允许重复上报已扫描到的设备
+            interval: 3000,//3秒扫描一次
+            powerLevel: "medium",
+            success: function () {
+                self.monitorBleBtsScanResult()//监听蓝牙基站扫描结果
+            },
+            fail: function () {
+                //500毫秒之后重新扫描
+                setTimeout(self.startScanNearbyBleBts, 500)
+            }
+        })
+    },
 })

+ 3 - 0
app.json

@@ -13,5 +13,8 @@
     "componentFramework": "glass-easel",
     "sitemapLocation": "sitemap.json",
     "lazyCodeLoading": "requiredComponents",
+    "requiredBackgroundModes": [
+        "audio"
+    ],
     "workers": "worker"
 }

+ 43 - 22
pages/home/home.js

@@ -27,20 +27,16 @@ Page({
      * 生命周期函数--监听页面加载
      */
     onLoad(options) {
-        //创建线程
-        app.createWorker(this.workerMessageListenerHome)
-
-        //创建录音设备
-        //app.createRecorder()
-
-        //用户登录
-        this.userLogin()
-
-        //初始化画布
-        this.initCanvas()
-
-        //启动三轴加速计
-        app.startImu()
+        if (!app.data.loginFlag) {
+            const myTimer = setInterval(() => {
+                if (app.data.loginFlag) {
+                    clearInterval(myTimer) // 停止定时器
+                    this.init()//初始化
+                }
+            }, 500); // 每500毫秒检查一次
+        } else {
+            this.init()//初始化
+        }
     },
     /**
      * 生命周期函数--监听页面初次渲染完成
@@ -89,6 +85,23 @@ Page({
      */
     onShareAppMessage() {
     },
+    //初始化
+    init() {
+        // //初始化画布
+        // this.initCanvas()
+
+        //创建线程
+        app.createWorker(this.workerMessageListenerHome)
+
+        //创建录音设备
+        app.createRecorder()
+
+        //拉取基站参数(注意:需要在用户登录成功后才拉取参数)
+        this.getBtsParamList()
+
+        //启动三轴加速计
+        app.startImu()
+    },
     //线程监听服务程序
     workerMessageListenerHome(res) {
         switch (res.message) {
@@ -98,8 +111,8 @@ Page({
             case 'WORKER_MAIN_ORGANIZE_INSTALL_BTS_DATA':
                 this.organizeBtsDataForWasm()//组织基站数据
                 break
-            case 'WORKER_MAIN_START_REC'://开始录音
-                app.createRecorder()
+            case 'WORKER_MAIN_START_REC':
+                app.startRecord()//开始录音
                 break
             case 'WORKER_MAIN_CURRENT_LOCATION_COORD'://当前定位坐标
                 this.saveLocateCoord(res.data)
@@ -152,8 +165,8 @@ Page({
             //组织基站数据队列
             this.data.btsDataList = this.generateBtsDataList(this.data.btsParamList)
 
-            //计算最大最小坐标值
-            this.calMaxMinCoordXY(this.data.btsDataList)
+            //初始化画布
+            this.initCanvas()
         }).catch((err) => {
             console.log("查询基站参数失败", err)
         })
@@ -183,7 +196,10 @@ Page({
                 this.data.canvasCtx.scale(this.data.canvasPixelRatio, this.data.canvasPixelRatio)
 
                 //画网格
-                this.drawLocateTrack(0, 0, 0, this.data.coordDataList)
+                this.drawLocateTrack(0, 0, 0, 0)
+
+                //画基站坐标
+                this.calMaxMinCoordXY(this.data.btsDataList)
             }
         })
     },
@@ -191,10 +207,11 @@ Page({
     organizeBtsDataForWasm() {
         let dataList = []//数据队列
         let oneItem = {}
+        let dataListLen = this.data.btsDataList.length
 
         //按照wasm模块要求的数据格式组织数据
-        dataList.push(this.data.btsDataList.length)
-        for (let i = 0; i < this.data.btsDataList.length; i++) {
+        dataList.push(dataListLen)
+        for (let i = 0; i < dataListLen; i++) {
             oneItem = this.data.btsDataList[i]
             dataList.push(oneItem.dwBuildId)
             dataList.push(oneItem.dwLayerId)
@@ -229,7 +246,7 @@ Page({
         }
 
         //将基站数据发送给worker
-        if (app.data.worker != null) {
+        if (app.data.worker != null && dataListLen > 0) {
             app.data.worker.postMessage({
                 message: 'MAIN_WORKER_INSTALL_BTS_DATA',
                 data: dataList//安装基站数据
@@ -369,6 +386,10 @@ Page({
             radio = radioHeight
         }
 
+        //发布已经初始化
+        if (this.data.canvasCtx === null) {
+            return
+        }
         let positionCtx = this.data.canvasCtx
         positionCtx.fillStyle = "#0066FF"
         positionCtx.clearRect(0, 0, this.data.canvasWidth, this.data.canvasHeight)

+ 3 - 3
sysconfig/sysconfig.js

@@ -7,9 +7,9 @@ let config = {
         version: 'V2.0.00',
         snCode: 'T0T3061F!',
     },
-    domanName: 'csxm',//二级域名
-    baseURL: 'http://localhost:8080/msapi',//开发接口
-    //baseURL: 'https://www.locaty.com.cn/msapi',//生产接口
+    domanName: 'csxm',//二级域名,需要用二级域名换取项目编号
+    //baseURL: 'http://localhost:8080/msapi',//开发接口
+    baseURL: 'https://www.locaty.com.cn/msapi',//生产接口
     user: {
         tokenKey: 'apls-8000-token',
         userInfoKey: 'apls-8000-user-info-key'

+ 9 - 9
utils/request.js

@@ -1,20 +1,20 @@
-import sysconfig from '../sysconfig/sysconfig.js'
-import crypt from './crypt.js'
+import sysconfig from '../sysconfig/sysconfig.js'//注意:“../”表示上一级目录
+import crypt from './crypt.js'//注意“./表示同级目录”
 
 let Fly = require("flyio")//引入fly包
 let fly = new Fly()
 
-//接口地址
-fly.config.baseURL = sysconfig.baseURL
+
+//配置
+fly.config.timeout = 5000; //5秒超时
+fly.config.baseURL = sysconfig.baseURL//请求基地址
 
 //请求拦截,config是请求对象
 fly.interceptors.request.use((config) => {
-    //组织请求参数密钥
-    const aesKey = sysconfig.copyright + sysconfig.app.snCode
-
-    //同步读取本地token
-    const token = wx.getStorageSync(sysconfig.user.tokenKey)
+    const aesKey = sysconfig.copyright + sysconfig.app.snCode//组织请求参数密钥
+    const token = wx.getStorageSync(sysconfig.user.tokenKey)//读取本地token
 
+    //为请求添加token
     if (token) {
         //判断当前请求api是否在白名单内,在白名单内的api不需要添加token
         let apiName = ""

二进制
wasm/aplm8000sdk.wasm


+ 34 - 25
worker/wasmapi.js

@@ -77,6 +77,7 @@ const wasmapi = {
         audioDataPtr: 0,//音频数据指针
         currentLocationCoordPtr: 0,//定位坐标数据指针
         accDataPtr: 0,//加速度指针
+        softNameAndVersionPtr: 0,//软件名称和版本数据指针
     },
     data: {
         audioDataList: [],//音频数据队列
@@ -137,6 +138,7 @@ const wasmapi = {
     //加载微信wasm模块
     loadWxWasm() {
         let self = this
+        //let configParam = { d: this._emscripten_date_now, b: this._emscripten_memcpy_js, a: this._emscripten_resize_heap, c: this._fd_write }
         let configParam = {}
         configParam.emscripten_memcpy_js = this._emscripten_memcpy_js
         configParam.emscripten_resize_heap = this._emscripten_resize_heap
@@ -150,14 +152,17 @@ const wasmapi = {
         let importObject = {}
         importObject.env = configParam
         importObject.wasi_snapshot_preview1 = configParam
+        //importObject.a = configParam
 
         //返回值res:{instance{}, Module{}}:包含instance和Module对象,instance中也包含Module。
         //js使用instance或者Module中Exports对象中的函数(包括用户自定义的函数和系统函数)完成既定功能
         //instantiate的第一个参数为绝对路径
         WXWebAssembly.instantiate("wasm/aplm8000sdk.wasm", importObject).then((res) => {
-            self.wasmInstance = res.instance
-            self.wasmFuncs = this.wasmInstance.exports
-            if (self.wasmInstance.exports['memory']) {//初始化内存
+            self.wasmInstance = res.instance//WASM模块实例
+            self.wasmFuncs = self.wasmInstance.exports//WASM模块接口
+
+            //初始化内存
+            if (self.wasmInstance.exports['memory']) {
                 let buf = self.wasmInstance.exports['memory'].buffer
                 HEAP8 = new Int8Array(buf)
                 HEAPU8 = new Uint8Array(buf)
@@ -187,23 +192,27 @@ const wasmapi = {
             //获得wasm模块加速度数据指针
             self.wasmDataPtr.accDataPtr = self.wasmFuncs.exchange_js_get_acc_save_address()
 
-            //通知主控模块开始监听蓝牙基站
+            //获得wasm模块软件名称和版本数据指针
+            self.wasmDataPtr.softNameAndVersionPtr = self.wasmFuncs.exchange_js_get_soft_name_and_version_save_address()
+
+            //通知主控模块开始监听蓝牙
             worker.postMessage({
                 message: 'WORKER_MAIN_START_MONITOR_BLE_BTS',
                 data: ''
             })
 
-            // //通知主控模块开始录音
-            // worker.postMessage({
-            //     message: 'WORKER_MAIN_START_REC',
-            //     data: ''
-            // })
-
-            // //通知主控模块开始读取本地文件
-            // worker.postMessage({
-            //     message: 'WORKER_MAIN_NOTICE_DOWNLOAD_AUDIO_FILE',
-            //     data: ''
-            // })
+            //TODO打印软件名称与版本
+            let softNameAndVersionPtr = self.wasmDataPtr.softNameAndVersionPtr
+            let softName = []
+            let softVersion = []
+            for (let i = 0; i < 18; i++) {
+                if (i < 11) {
+                    softName.push(HEAPU8[softNameAndVersionPtr + i])
+                } else {
+                    softVersion.push(HEAPU8[softNameAndVersionPtr + i])
+                }
+            }
+            console.log("软件版本:" + softName.map(num => String.fromCharCode(num)).join('') + " " + softVersion.map(num => String.fromCharCode(num)).join(''))
         }).catch((err) => {
             console.log("加载wasm对象出错", err)
         })
@@ -215,9 +224,9 @@ const wasmapi = {
         }
 
         //蓝牙基站监听成功,保存数据
-        this.data.bleBtsMonitorSuccessFlag = true//蓝牙基站监听成功
+        this.data.bleBtsMonitorSuccessFlag = true//蓝牙基站监听成功标识符
         this.data.bleBtsDataList.splice(0, this.data.bleBtsDataList.length)
-        this.data.bleBtsDataList = dataList
+        this.data.bleBtsDataList = dataList//保存蓝牙基站数据,并覆盖以前的数据
 
         //通知主控模块注入安装基站数据(只注入一次)
         if (!this.data.installBtsInjectFlag) {
@@ -251,6 +260,7 @@ const wasmapi = {
             }
         } else {
             console.log("蓝牙指针尚未初始化")
+            return
         }
 
         //清除本地蓝牙基站数据
@@ -261,22 +271,21 @@ const wasmapi = {
         // if (this.wasmFuncs != null) {
         //     this.wasmFuncs.exchange_js_notice_wasm_show_route_bts();
         // }
+
+        return
     },
     //发送安装基站数据至wasm模块
     sendInstallBtsDataToWasm(dataList) {
         //将数据保存至wasm模块
-        if (this.wasmDataPtr.installBtsDataPtr > 0) {
+        if (this.wasmDataPtr.installBtsDataPtr > 0 && dataList.length > 0) {
             this.data.installBtsInjectFlag = true//注入标识符置1
 
             //向wasm模块注入数据
-            let ptr = this.wasmDataPtr.installBtsDataPtr / 4//蓝牙基站数据在wasm模块按4字节存储
+            let ptr = this.wasmDataPtr.installBtsDataPtr / 4//基站数据在wasm模块按4字节存储
             for (let i = 0; i < dataList.length; i++) {
                 HEAP32[ptr + i] = dataList[i]
             }
 
-            ////TODO 打印看看效果
-            //this.wasmFuncs.exchange_js_notice_wasm_show_install_bts()
-
             //向主线程发消息开始录音
             worker.postMessage({
                 message: 'WORKER_MAIN_START_REC',
@@ -318,7 +327,7 @@ const wasmapi = {
                 //把音频数据逐帧注入wasm模块
                 let ptr = this.wasmDataPtr.audioDataPtr / 2//音频数据在wasm模块中按2字节存储
                 for (let i = 0; i < frameCounter; i++) {
-                    //let beginTime = new Date().getTime()//开始计时
+                    let beginTime = new Date().getTime()//开始计时
 
                     //1、把数据注入wasm模块
                     let baseIndex = i * this.data.oneFrameLen
@@ -336,8 +345,8 @@ const wasmapi = {
                     //3、通知wasm模块处理音频数据
                     let result = this.wasmFuncs.exchange_js_notice_wasm_start_work()
 
-                    //let stopTime = new Date().getTime() - beginTime//结束计时
-                    //console.log("耗时:", stopTime)
+                    let stopTime = new Date().getTime() - beginTime//结束计时
+                    console.log("耗时:", stopTime)
 
                     //4、获取wasm模块处理音频数据的结果
                     if (result != 1) {