diff --git a/manifest.json b/manifest.json index 4f4f363..6e160bb 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "name" : "wx-starlock", "appid" : "__UNI__933D519", "description" : "", - "versionName" : "1.1.1", - "versionCode" : "28", + "versionName" : "1.1.2", + "versionCode" : "29", "transformPx" : false, /* 小程序特有相关 */ "mp-weixin" : { diff --git a/pages/createKey/createKey.vue b/pages/createKey/createKey.vue index 5bcfba2..e82d3b7 100644 --- a/pages/createKey/createKey.vue +++ b/pages/createKey/createKey.vue @@ -13,7 +13,7 @@ + @changeInput="changePermanentNameInput"> 接收者可使用此小程序开关锁 小程序暂不支持邮箱登录,若接收者账号为邮箱可先使用星星锁APP登录,绑定手机号后可使用小程序登录 发送 @@ -149,6 +149,8 @@ export default { } const { code, message } = await createKeyRequest(params) if (code === 0) { + uni.reportEvent("create_key", { + }) this.updateKeySearch({ ...this.keySearch, pageNo: 1 @@ -177,7 +179,7 @@ export default { changePermanentAccountInput (e) { this.permanentAccount = e }, - changePermanentNmaeInput (e) { + changePermanentNameInput (e) { this.permanentName = e }, changeTemporaryNameInput (e) { diff --git a/pages/createPassword/createPassword.vue b/pages/createPassword/createPassword.vue index 2843629..883115c 100644 --- a/pages/createPassword/createPassword.vue +++ b/pages/createPassword/createPassword.vue @@ -145,6 +145,9 @@ export default { } const { code, data, message } = await createPsaawordRequest(params) if(code === 0) { + uni.reportEvent("create_password", { + + }) this.updatePasswordSearch({ ...this.passwordSearch, pageNo: 1 diff --git a/pages/lockDetail/lockDetail.vue b/pages/lockDetail/lockDetail.vue index 506699e..c5f4dfb 100644 --- a/pages/lockDetail/lockDetail.vue +++ b/pages/lockDetail/lockDetail.vue @@ -137,6 +137,7 @@ export default { } }, async openDoorOperate(type) { + const timestamp = new Date().getTime() if(this.currentLockInfo.faceAuthentication === 1 && ((this.currentLockInfo.nextFaceValidateTime <= new Date().getTime() + this.time * 1000) && this.currentLockInfo.nextFaceValidateTime !== 0)) { @@ -187,6 +188,17 @@ export default { onlineToken: this.onlineToken }) this.closeBluetoothConnection() + if(type === 'open') { + uni.reportEvent("open_door", { + result: code, + duration: new Date().getTime() - timestamp + }) + } else if(type === 'close') { + uni.reportEvent("close_door", { + result: code, + duration: new Date().getTime() - timestamp + }) + } if(code === 0) { this.show = true this.type = type diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 79e479d..0c5e4ae 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -10,6 +10,8 @@ import { getUserNoListRequest, updateLockUserNoRequest } from '@/api/key' import { updateElectricQuantityRequest } from '@/api/room' import { reportOpenDoorRequest } from '@/api/lockRecords' import { updateTimezoneOffsetRequest } from '@/api/user' +import log from '@/utils/log' +import { useUserStore } from '@/stores/user' // 定时器 let timer @@ -228,6 +230,7 @@ export const useBluetoothStore = defineStore('ble', { }, // 解析特征值 parsingCharacteristicValue(binaryData) { + const $user = useUserStore() const that = this // 0x20 明文 0x22 SM4(事先约定密钥) 0x23 SM4(设备指定密钥) if(binaryData[7] === 0x20) { @@ -363,10 +366,34 @@ export const useBluetoothStore = defineStore('ble', { token: decrypted.slice(2,6) }) console.log('开门', decrypted[6], that.currentLockInfo.token) + log.info({ + code: decrypted[6], + message: `锁端返回状态码`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) characteristicValueCallback({ code: decrypted[6] }) if(decrypted[6] === 0) { + log.info({ + code: decrypted[6], + message: `开门成功`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) updateElectricQuantityRequest({ lockId: that.currentLockInfo.lockId, electricQuantity: decrypted[7], @@ -773,8 +800,10 @@ export const useBluetoothStore = defineStore('ble', { }) } }) + resolve({ code: -22 }) + } else { + resolve({ code: -4 }) } - resolve({ code: -1 }) }, 10500) timer1 = setInterval(() => { uni.getBluetoothDevices({ @@ -855,7 +884,7 @@ export const useBluetoothStore = defineStore('ble', { } }) resolve({ - code: -1 + code: -23 }) } else { resolve({ @@ -1308,18 +1337,57 @@ export const useBluetoothStore = defineStore('ble', { }, // 获取写入结果 getWriteResult(request, params) { + const $user = useUserStore() const that = this return new Promise(resolve => { const getWriteResultTimer = setTimeout(() => { + log.info({ + code: -1, + message: `操作失败,蓝牙操作超时`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) resolve({ code: -1 }) }, 20000) characteristicValueCallback = async (data) => { // code 6 token过期,重新获取 if(data.code === 6) { + log.info({ + code: 0, + message: `开门中,更换过期token,开始重试`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + clearTimeout(getWriteResultTimer) resolve(await request(params)) } else if(data.code === 4) { + log.info({ + code: 4, + message: `锁端数据返回,无操作权限,添加用户后重新执行`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) const checkResult = await that.checkLockUser(true) if(checkResult) { + clearTimeout(getWriteResultTimer) resolve(await request(params)) } else { clearTimeout(getWriteResultTimer) @@ -1334,84 +1402,343 @@ export const useBluetoothStore = defineStore('ble', { }, // 开门 async openDoor(data) { - // 确认蓝牙状态正常 - if(this.bluetoothStatus !== 0) { - console.log('写入未执行', this.bluetoothStatus) - this.getBluetoothStatus() - return { - code: -1 - } - } - - // 确认设备连接正常 - if(!this.currentLockInfo.connected) { - const srerchResult = await this.searchAndConnectDevice() - if(srerchResult.code !== 0) { - return srerchResult - } - this.updateCurrentLockInfo({ - ...this.currentLockInfo, - deviceId: srerchResult.data.deviceId + const $user = useUserStore() + try { + log.info({ + code: 0, + message: `开始开门`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } }) - console.log('设备ID:', this.currentLockInfo.deviceId) - const result = await this.connectBluetoothDevice() - console.log('连接结果', result) - if(!result) { + // 确认蓝牙状态正常 + if(this.bluetoothStatus !== 0) { + console.log('写入未执行', this.bluetoothStatus) + this.getBluetoothStatus() + if(this.bluetoothStatus === -1) { + log.info({ + code: -25, + message: `开门失败,未知蓝牙状态, ${this.bluetoothStatus}`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(this.bluetoothStatus === 1) { + log.info({ + code: -20, + message: `开门失败,蓝牙未开启, ${this.bluetoothStatus}`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(this.bluetoothStatus === 2) { + log.info({ + code: -21, + message: `开门失败,小程序蓝牙权限被禁用, ${this.bluetoothStatus}`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(this.bluetoothStatus === 3) { + log.info({ + code: -26, + message: `开门失败,蓝牙未开启且小程序蓝牙功能被禁用, ${this.bluetoothStatus}`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } return { code: -1 } } - } - // 检查是否已添加为用户 - const checkResult = await this.checkLockUser() - if (!checkResult) { + log.info({ + code: 0, + message: `开门中,蓝牙权限正常, ${this.bluetoothStatus}`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + + // 确认设备连接正常 + if(!this.currentLockInfo.connected) { + const srerchResult = await this.searchAndConnectDevice() + if(srerchResult.code === 0) { + log.info({ + code: srerchResult.code, + message: `开门中,已搜索到设备`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -1) { + log.info({ + code: srerchResult.code, + message: `开门失败,搜索失败`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -2) { + log.info({ + code: srerchResult.code, + message: `开门失败,锁已被重置`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -3) { + log.info({ + code: srerchResult.code, + message: `开门失败,设备已找到但uuid异常`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -4) { + log.info({ + code: srerchResult.code, + message: `开门失败,未搜索到操作设备`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -22) { + log.info({ + code: srerchResult.code, + message: `开门失败,微信附近设备权限未开启`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else if(srerchResult.code === -23) { + log.info({ + code: srerchResult.code, + message: `开门失败,微信定位权限未开启`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } + if(srerchResult.code !== 0) { + return { code: -1 } + } + this.updateCurrentLockInfo({ + ...this.currentLockInfo, + deviceId: srerchResult.data.deviceId + }) + console.log('设备ID:', this.currentLockInfo.deviceId) + const result = await this.connectBluetoothDevice() + if(result) { + log.info({ + code: 0, + message: `开门中,设备连接成功`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } else { + log.info({ + code: -1, + message: `开门失败,设备连接失败`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + } + console.log('连接结果', result) + if(!result) { + return { + code: -1 + } + } + } + + log.info({ + code: 0, + message: `开门中,设备已连接`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + + // 检查是否已添加为用户 + const checkResult = await this.checkLockUser() + if (!checkResult) { + log.info({ + code: -1, + message: `开门失败,用户添加失败`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + return { + code: -1 + } + } + + log.info({ + code: 0, + message: `开门中,用户已添加`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + + const { name, uid, openMode, openTime, onlineToken } = data + const length = 2 + 40 + 20 + 1 + 4 + 4 + 1 + 16 + 16 + const headArray = this.createPackageHeader(3, length) + + const conentArray = new Uint8Array(length) + conentArray[0] = cmdIds.openDoor / 256 + conentArray[1] = cmdIds.openDoor % 256 + + for(let i = 0; i < name.length; i++) { + conentArray[i + 2] = name.charCodeAt(i) + } + + for (let i = 0; i < uid.length; i++) { + conentArray[i + 42] = uid.charCodeAt(i) + } + + conentArray[62] = openMode + + conentArray.set(this.timestampToArray(openTime), 63) + + console.log('开门时token', this.currentLockInfo.token) + + conentArray.set(this.currentLockInfo.token || this.timestampToArray(openTime), 67) + + conentArray[71] = 16 + + + const md5Array = this.md5Encrypte(name + uid, this.currentLockInfo.token || this.timestampToArray(openTime), this.currentLockInfo.signKey) + + conentArray.set(md5Array, 72) + + for (let i = 0; i < onlineToken.length; i++) { + conentArray[i + 88] = onlineToken.charCodeAt(i) + } + + const cebArray = sm4.encrypt(conentArray, this.currentLockInfo.commKey, { mode: 'ecb', output: 'array' }) + + const packageArray = this.createPackageEnd(headArray, cebArray) + log.info({ + code: 0, + message: `开门中,开始写入`, + data: { + lockName: this.currentLockInfo.name, + lockId: this.currentLockInfo.lockId, + uid: $user.userInfo.uid, + nickname: $user.userInfo.nickname, + mobile: $user.userInfo.mobile, + email: $user.userInfo.email + } + }) + this.writeBLECharacteristicValue(packageArray) + + return this.getWriteResult(this.openDoor, data) + } catch (e) { + log.error({ + code: -1, + error: e, + message: `开门失败,未知错误` + }) return { code: -1 } } - - const { name, uid, openMode, openTime, onlineToken } = data - const length = 2 + 40 + 20 + 1 + 4 + 4 + 1 + 16 + 16 - const headArray = this.createPackageHeader(3, length) - - const conentArray = new Uint8Array(length) - conentArray[0] = cmdIds.openDoor / 256 - conentArray[1] = cmdIds.openDoor % 256 - - for(let i = 0; i < name.length; i++) { - conentArray[i + 2] = name.charCodeAt(i) - } - - for (let i = 0; i < uid.length; i++) { - conentArray[i + 42] = uid.charCodeAt(i) - } - - conentArray[62] = openMode - - conentArray.set(this.timestampToArray(openTime), 63) - - console.log('开门时token', this.currentLockInfo.token) - - conentArray.set(this.currentLockInfo.token || this.timestampToArray(openTime), 67) - - conentArray[71] = 16 - - - const md5Array = this.md5Encrypte(name + uid, this.currentLockInfo.token || this.timestampToArray(openTime), this.currentLockInfo.signKey) - - conentArray.set(md5Array, 72) - - for (let i = 0; i < onlineToken.length; i++) { - conentArray[i + 88] = onlineToken.charCodeAt(i) - } - - const cebArray = sm4.encrypt(conentArray, this.currentLockInfo.commKey, { mode: 'ecb', output: 'array' }) - - const packageArray = this.createPackageEnd(headArray, cebArray) - this.writeBLECharacteristicValue(packageArray) - - return this.getWriteResult(this.openDoor, data) }, // 清理用户 async cleanLockUser(data) { diff --git a/utils/log.js b/utils/log.js new file mode 100644 index 0000000..d76d42b --- /dev/null +++ b/utils/log.js @@ -0,0 +1,30 @@ +var log = wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : null + +export default { + debug() { + if (!log) return + log.debug.apply(log, arguments) + }, + info() { + if (!log) return + log.info.apply(log, arguments) + }, + warn() { + if (!log) return + log.warn.apply(log, arguments) + }, + error() { + if (!log) return + log.error.apply(log, arguments) + }, + setFilterMsg(msg) { // 从基础库2.7.3开始支持 + if (!log || !log.setFilterMsg) return + if (typeof msg !== 'string') return + log.setFilterMsg(msg) + }, + addFilterMsg(msg) { // 从基础库2.8.1开始支持 + if (!log || !log.addFilterMsg) return + if (typeof msg !== 'string') return + log.addFilterMsg(msg) + } +}