import { userMobileLogin } from './api/wxlogin.js' import sysconfig from './sysconfig/sysconfig.js' // app.js App({ data: {//数据 worker: null,//线程句柄 recorder: null,//录音设备句柄 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", { useExperimentalWorker: true//使用实验worker,提升ios下js运行效率 }) // 监听worker被系统回收事件 this.data.worker.onProcessKilled(() => { this.createNewWorker()// 重新创建一个worker }) //设置线程监听服务程序 if (typeof (listener) === 'function') { this.setWorkerListener(listener) //发消息给worker,加载wasm this.data.worker.postMessage({ message: 'MAIN_WORKER_LOAD_WX_WASM', data: '' }) } } }, //设置线程监听服务程序 setWorkerListener(listener) { if (this.data.worker != null) { this.data.worker.onMessage(listener) } }, //创建录音设备,并监听录音完成事件 createRecorder() { const self = this //获得录音机句柄 this.data.recorder = wx.getRecorderManager() //注册录音回调函数(录音长度达到设定值后执行) this.data.recorder.onFrameRecorded((res) => { //从返回参数res中解构isLastFrame和frameBuffer变量 //其中frameBuffer是二进制数据数组,不能直接读写 const { isLastFrame, frameBuffer } = res //录音时长达到最大值,则重新开始录音 //微信小程序录音时长最长为10分钟 if (isLastFrame) { self.startRecord() } //将录音数据发送给worker self.data.worker.postMessage({ message: 'MAIN_WORKER_AUDIO_DATA', data: frameBuffer }) }) //注册录音被打断回调函数 this.data.recorder.onInterruptionBegin(() => { console.log("录音被打断") }) //注册监听录音中断结束事件 this.data.recorder.onInterruptionEnd(() => { this.resumeRecord()//恢复录音 }) }, //开始录音 startRecord() { if (this.data.recorder != null) { let options = {} //组织录音参数 options.duration = 600000 //最长连续录音10分钟 options.sampleRate = 48000 //采样频率 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) { wx.startBluetoothDevicesDiscovery({ allowDuplicatesKey: true,//允许重复上报同一设备,每次上报RSSI值会有不同 interval: 2000,//2秒扫描一次 powerLevel: "medium", success() { self.monitorBleBtsScanResult() } }) }, //打开失败 fail: function (err) { console.log("open ble fail", err) setTimeout(() => { self.openBleAdapter() }, 3000) } }) }, //监听蓝牙基站扫描结果 monitorBleBtsScanResult() { let self = this wx.onBluetoothDeviceFound((res) => { let findFlag = 0//发现系统基站标识符 let bleBtsDataList = []//蓝牙基站数据队列 //遍历蓝牙设备队列 res.devices.forEach((element) => { if (element.name && element.name.length == 23) { let bleName = element.name//蓝牙名称 let subName = bleName.slice(-10)//蓝牙项目标识符 //该设备为本系统设备 if (subName === "IPS8000BLE") { if (!findFlag) { findFlag = 1//发现系统基站 } let macAddress = bleName.substring(0, 12);//BLE的mac地址 let rssi = -10000; if (element.RSSI) { rssi = element.RSSI//接收电平强度 } //保存扫描结果 let item = {} item['mac'] = macAddress; item['rssi'] = rssi bleBtsDataList.push(item) } } }) //成功监听到本系统蓝牙设备 if (findFlag) { //组织本次监听到的蓝牙基站数据 self.organizeBleBtsData(bleBtsDataList) } }) }, //按照wasm模块所需格式组织蓝牙基站数据 organizeBleBtsData(bleBtsList) { let listLen = 0 let bleBtsDataList = []//蓝牙基站数据队列 let rssi = 0 let strMac = "" let macLen = 0 let oneHexChar = "" let oneHexCharValue = 0 //没有蓝牙基站 if (!bleBtsList || bleBtsList.length <= 0) { return } //队列长度 listLen = bleBtsList.length if (listLen > 9) { listLen = 9//最多9个蓝牙基站 } ////按照WASM模块所需数据格式组织蓝牙基站数据 bleBtsDataList.push(1)//蓝牙基站有效标识符置1 bleBtsDataList.push(listLen)//蓝牙基站个数 //组织RSSI和MAC for (let i = 0; i < listLen; i++) { rssi = bleBtsList[i].rssi bleBtsDataList.push(rssi)//RSSI strMac = bleBtsList[i].mac//mac地址16进制字符串 macLen = strMac.length if (macLen == 12) { for (let j = 0; j < macLen; j++) { oneHexChar = strMac[j] oneHexCharValue = this.hexCharToValue(oneHexChar) bleBtsDataList.push(oneHexCharValue)//MAC } } else { console.log("长度错误") } } //把数据发送给worker if (bleBtsDataList.length > 3) { if (this.data.worker != null) { this.data.worker.postMessage({ message: 'MAIN_WORKER_BLE_BTS_DATA', data: bleBtsDataList }) } } }, hexCharToValue(char) { // 定义16进制字符到数值的映射 const hexValues = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15 }; // 查找字符对应的值 return hexValues[char]; }, //停止扫描蓝牙设备 stopScanNearbyBle() { let self = this wx.stopBluetoothDevicesDiscovery({ success: function () { wx.offBluetoothDeviceFound(function () { }) }, fail: function () { console.log("没有扫描到基站") setTimeout(self.stopScanNearbyBle, 3000) } }) }, //启动加速度计 startImu() { wx.stopAccelerometer()//停止加速度传感器 //启动加速度传感器,20毫秒采集一次加速度 wx.startAccelerometer({ interval: "game" }) //监听加速度传感器 wx.onAccelerometerChange(this.onAccelerometerChange) //生成IMU开始时间戳 this.data.imuStartTimestamp = new Date().getTime() }, //监测三轴加速度计的变化 onAccelerometerChange(res) { let timestamp = new Date().getTime() - this.data.imuStartTimestamp; //生成时间戳 let item = {} item.timestamp = timestamp item.x = res.x item.y = res.y item.z = res.z //把数据发送给线程 if (this.data.worker != null) { this.data.worker.postMessage({ message: 'MAIN_WORKER_ONE_ACC_DATA',//加速度数据 data: item }) } }, //////////////////////////////////////////////////////////////////////////// ///////////////////////////以下未测试接口,已舍弃///////////////////////////// //////////////////////////////////////////////////////////////////////////// //保存音频文件 //buffer:录音数据,为二进制单字节数据数组(byte) saveAduioDataToBin(buffer) { console.log("收到保存消息") let fileSystemManager = wx.getFileSystemManager() try { fileSystemManager.appendFileSync(wx.env.USER_DATA_PATH + "/IPS8000.bin", buffer, 'binary') return { code: 1, data: 'ok' } } catch (e) { 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) } }) }, })