app.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. // app.js
  2. import { userMobileLogin } from './api/wxlogin.js'
  3. import sysconfig from '../sysconfig/sysconfig.js'
  4. App({
  5. data: {//数据
  6. worker: null,//线程句柄
  7. recorder: null,//录音设备句柄
  8. wavFilePath: '',//wav文件路径
  9. readFileTimes: 0,//读取本地文件次数
  10. imuStartTimestamp: 0,//IMU开始时间戳
  11. },
  12. onLaunch() {
  13. // 用户登录登录(发送 res.code 到后台换取 openId, sessionKey, unionId)
  14. wx.login({
  15. success: (res) => {
  16. var paramData = {};
  17. paramData.code = res.code; //登录凭证
  18. paramData.domain_name = sysconfig.default.domanName; //系统二级域名
  19. userMobileLogin(paramData).then((resp) => {
  20. //保存token
  21. const tokenKey = wx.getStorageSync(sysconfig.user.tokenKey)
  22. wx.setStorageSync(tokenKey, resp.data.data.token)
  23. //保存用户数据
  24. const userInfoKey = wx.getStorageSync(sysconfig.user.userInfoKey)
  25. wx.setStorageSync(userInfoKey, resp.data.data)
  26. }).catch((err) => {
  27. console.log(err)
  28. })
  29. }
  30. })
  31. },
  32. //创建线程(listener:线程监听服务程序)
  33. createWorker(listener) {
  34. if (this.data.worker == null) {
  35. this.data.worker = wx.createWorker("worker/worker.js")
  36. //设置线程监听服务程序
  37. if (typeof (listener) === 'function') {
  38. this.setWorkerListener(listener)
  39. //发消息给worker,加载wasm
  40. this.data.worker.postMessage({
  41. message: 'MAIN_WORKER_LOAD_WX_WASM',
  42. data: ''
  43. })
  44. }
  45. }
  46. },
  47. //设置线程监听服务程序
  48. setWorkerListener(listener) {
  49. if (this.data.worker != null) {
  50. this.data.worker.onMessage(listener)
  51. }
  52. },
  53. //创建录音设备,并监听录音完成事件
  54. createRecorder() {
  55. const self = this
  56. //获得录音机句柄
  57. this.data.recorder = wx.getRecorderManager()
  58. //注册录音回调函数(录音长度达到设定值后执行)
  59. this.data.recorder.onFrameRecorded((res) => {
  60. //从返回参数中解构变量isLastFrame和frameBuffer, 其中frameBuffer是二进制数据数组,不能直接读写
  61. const { isLastFrame, frameBuffer } = res
  62. //录音时长到了最大值,重新开始录音
  63. if (isLastFrame) {
  64. self.startRecord()
  65. }
  66. //将数据发送给worker
  67. self.data.worker.postMessage({
  68. message: 'MAIN_WORKER_AUDIO_DATA',
  69. data: frameBuffer
  70. })
  71. // //将数据发送给worker
  72. // self.data.worker.postMessage({
  73. // message: 'MAIN_WORKER_SAVE_AUDIO_DATA',
  74. // data: frameBuffer
  75. // })
  76. })
  77. //开始录音
  78. setTimeout(this.startRecord, 2000)
  79. },
  80. //开始录音
  81. startRecord() {
  82. if (this.data.recorder != null) {
  83. let options = {}
  84. //组织录音参数
  85. options.duration = 600000 //最长连续录音10分钟
  86. options.sampleRate = 48000 //采样频率
  87. options.encodeBitRate = 320000 //TODO,编码率,不知道干什么用的
  88. options.numberOfChannels = 1 //单通道采样
  89. options.format = "pcm"
  90. options.frameSize = "22" //单位kB(数据不会太准确,因此需要缓存数据以实施成帧操作)
  91. //启动录音
  92. this.data.recorder.start(options)
  93. }
  94. },
  95. //保存音频文件
  96. //buffer:录音数据,为二进制单字节数据数组(byte)
  97. saveAduioDataToBin(buffer) {
  98. console.log("收到保存消息")
  99. let fileSystemManager = wx.getFileSystemManager()
  100. try {
  101. fileSystemManager.appendFileSync(wx.env.USER_DATA_PATH + "/IPS8000.bin", buffer, 'binary')
  102. return { code: 1, data: 'ok' }
  103. } catch (e) {
  104. return { code: 0, data: e }
  105. }
  106. },
  107. //打开蓝牙适配器
  108. openBleAdapter() {
  109. let self = this
  110. wx.openBluetoothAdapter({
  111. mode: "central",
  112. success: function (res) {//打开成功,开始扫描周边设备
  113. wx.startBluetoothDevicesDiscovery({
  114. allowDuplicatesKey: true,
  115. interval: 2000,//2秒扫描一次
  116. powerLevel: "medium",
  117. success() {
  118. self.monitorBleBtsScanResult()
  119. }
  120. })
  121. },
  122. fail: function (err) {//打开失败
  123. console.log("open ble fail", err)
  124. setTimeout(() => {
  125. self.openBleAdapter()
  126. }, 3000)
  127. }
  128. })
  129. //this.monitorBleBtsScanResult();
  130. // // 监听扫描到新设备事件
  131. // wx.onBluetoothDeviceFound((res) => {
  132. // console.log("扫描到了蓝牙设备")
  133. // res.devices.forEach((device) => {
  134. // console.log('Device Found', device)
  135. // })
  136. // })
  137. },
  138. //开始扫描周边蓝牙设备
  139. startScanNearbyBleBts() {
  140. let self = this
  141. //扫描周边设备
  142. wx.startBluetoothDevicesDiscovery({
  143. allowDuplicatesKey: true,//允许重复上报已扫描到的设备
  144. interval: 3000,//3秒扫描一次
  145. powerLevel: "medium",
  146. success: function () {
  147. self.monitorBleBtsScanResult()//监听蓝牙基站扫描结果
  148. },
  149. fail: function () {
  150. //500毫秒之后重新扫描
  151. setTimeout(self.startScanNearbyBleBts, 500)
  152. }
  153. })
  154. },
  155. //监听蓝牙基站扫描结果
  156. monitorBleBtsScanResult() {
  157. let self = this
  158. wx.onBluetoothDeviceFound((res) => {
  159. let findFlag = 0//发现系统基站标识符
  160. let bleBtsDataList = []//蓝牙基站数据队列
  161. //遍历蓝牙设备队列
  162. res.devices.forEach((element) => {
  163. if (element.name && element.name.length == 23) {
  164. let bleName = element.name
  165. let subName = bleName.slice(-10)
  166. //该设备为本系统设备
  167. if (subName === "IPS8000BLE") {
  168. if (!findFlag) {
  169. findFlag = 1//发现系统基站
  170. }
  171. let macAddress = bleName.substring(0, 12);//BLE的mac地址
  172. let rssi = -10000;
  173. if (element.RSSI) {
  174. rssi = element.RSSI//接收电平强度
  175. }
  176. //保存扫描结果
  177. let item = {}
  178. item['mac'] = macAddress;
  179. item['rssi'] = rssi
  180. bleBtsDataList.push(item)
  181. }
  182. }
  183. })
  184. //成功监听到本系统蓝牙设备
  185. if (findFlag) {
  186. //组织本次监听到的蓝牙基站数据
  187. self.organizeBleBtsData(bleBtsDataList)
  188. }
  189. })
  190. },
  191. //按照wasm模块所需格式组织蓝牙基站数据
  192. organizeBleBtsData(bleBtsList) {
  193. let listLen = 0
  194. let bleBtsDataList = []//蓝牙基站数据队列
  195. let rssi = 0
  196. let strMac = ""
  197. let macLen = 0
  198. let oneHexChar = ""
  199. let oneHexCharValue = 0
  200. //没有蓝牙基站
  201. if (!bleBtsList || bleBtsList.length <= 0) {
  202. return
  203. }
  204. //队列长度
  205. listLen = bleBtsList.length
  206. if (listLen > 9) {
  207. listLen = 9//最多9个蓝牙基站
  208. }
  209. ////按照WASM模块所需数据格式组织蓝牙基站数据
  210. bleBtsDataList.push(1)//蓝牙基站有效标识符置1
  211. bleBtsDataList.push(listLen)//蓝牙基站个数
  212. //组织RSSI和MAC
  213. for (let i = 0; i < listLen; i++) {
  214. rssi = bleBtsList[i].rssi
  215. bleBtsDataList.push(rssi)//RSSI
  216. strMac = bleBtsList[i].mac//mac地址16进制字符串
  217. macLen = strMac.length
  218. if (macLen == 12) {
  219. for (let j = 0; j < macLen; j++) {
  220. oneHexChar = strMac[j]
  221. oneHexCharValue = this.hexCharToValue(oneHexChar)
  222. bleBtsDataList.push(oneHexCharValue)//MAC
  223. }
  224. } else {
  225. console.log("长度错误")
  226. }
  227. }
  228. //把数据发送给worker
  229. if (bleBtsDataList.length > 3) {
  230. if (this.data.worker != null) {
  231. this.data.worker.postMessage({
  232. message: 'MAIN_WORKER_BLE_BTS_DATA',
  233. data: bleBtsDataList
  234. })
  235. }
  236. }
  237. },
  238. hexCharToValue(char) {
  239. // 定义16进制字符到数值的映射
  240. const hexValues = {
  241. '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,
  242. '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15,
  243. 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15
  244. };
  245. // 查找字符对应的值
  246. return hexValues[char];
  247. },
  248. //停止扫描蓝牙设备
  249. stopScanNearbyBle() {
  250. let self = this
  251. wx.stopBluetoothDevicesDiscovery({
  252. success: function () {
  253. wx.offBluetoothDeviceFound(function () { })
  254. },
  255. fail: function () {
  256. console.log("没有扫描到基站")
  257. setTimeout(self.stopScanNearbyBle, 3000)
  258. }
  259. })
  260. },
  261. //启动加速度计
  262. startImu() {
  263. wx.stopAccelerometer()//停止加速度传感器
  264. //启动加速度传感器,20毫秒采集一次加速度
  265. wx.startAccelerometer({ interval: "game" })
  266. //监听加速度传感器
  267. wx.onAccelerometerChange(this.onAccelerometerChange)
  268. //生成IMU开始时间戳
  269. this.data.imuStartTimestamp = new Date().getTime()
  270. },
  271. //监测三轴加速度计的变化
  272. onAccelerometerChange(res) {
  273. let timestamp = new Date().getTime() - this.data.imuStartTimestamp; //生成时间戳
  274. let item = {}
  275. item.timestamp = timestamp
  276. item.x = res.x
  277. item.y = res.y
  278. item.z = res.z
  279. //把数据发送给线程
  280. if (this.data.worker != null) {
  281. this.data.worker.postMessage({
  282. message: 'MAIN_WORKER_ONE_ACC_DATA',//加速度数据
  283. data: item
  284. })
  285. }
  286. },
  287. })