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)
+ }
+}