feat:增加更新支持功能项设置(带参数)、读取支持功能项设置、远程开锁
This commit is contained in:
parent
9bc62bc6fb
commit
fa526edeb6
108
common.js
108
common.js
@ -1006,7 +1006,7 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
isCoerced: this.requestParams.isForce,
|
isCoerced: this.requestParams.isForce,
|
||||||
cardRight: this.requestParams.isAdmin,
|
cardRight: this.requestParams.isAdmin,
|
||||||
lockId: this.lockInfo.lockId,
|
lockId: this.lockInfo.lockId,
|
||||||
cardNumber: this.requestParams.cardNumber,
|
cardNumber: decrypted[6] * 256 + decrypted[7],
|
||||||
cardUserNo: this.requestParams.cardUserNo
|
cardUserNo: this.requestParams.cardUserNo
|
||||||
})
|
})
|
||||||
if (addResult.code === Result.Success.code) {
|
if (addResult.code === Result.Success.code) {
|
||||||
@ -1084,7 +1084,7 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
isCoerced: this.requestParams.isForce,
|
isCoerced: this.requestParams.isForce,
|
||||||
fingerRight: this.requestParams.isAdmin,
|
fingerRight: this.requestParams.isAdmin,
|
||||||
lockId: this.lockInfo.lockId,
|
lockId: this.lockInfo.lockId,
|
||||||
fingerprintNumber: this.requestParams.fingerprintNumber,
|
fingerprintNumber: decrypted[6] * 256 + decrypted[7],
|
||||||
fingerprintUserNo: this.requestParams.fingerprintUserNo
|
fingerprintUserNo: this.requestParams.fingerprintUserNo
|
||||||
})
|
})
|
||||||
if (addResult.code === Result.Success.code) {
|
if (addResult.code === Result.Success.code) {
|
||||||
@ -1159,7 +1159,7 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
isCoerced: this.requestParams.isForce,
|
isCoerced: this.requestParams.isForce,
|
||||||
fingerRight: this.requestParams.isAdmin,
|
fingerRight: this.requestParams.isAdmin,
|
||||||
lockId: this.lockInfo.lockId,
|
lockId: this.lockInfo.lockId,
|
||||||
faceNumber: this.requestParams.faceNumber,
|
faceNumber: decrypted[6] * 256 + decrypted[7],
|
||||||
faceUserNo: this.requestParams.faceUserNo
|
faceUserNo: this.requestParams.faceUserNo
|
||||||
})
|
})
|
||||||
if (addResult.code === Result.Success.code) {
|
if (addResult.code === Result.Success.code) {
|
||||||
@ -1228,7 +1228,7 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
isCoerced: this.requestParams.isForce,
|
isCoerced: this.requestParams.isForce,
|
||||||
palmVeinRight: this.requestParams.isAdmin,
|
palmVeinRight: this.requestParams.isAdmin,
|
||||||
lockId: this.lockInfo.lockId,
|
lockId: this.lockInfo.lockId,
|
||||||
palmVeinNumber: this.requestParams.palmVeinNumber,
|
palmVeinNumber: decrypted[6] * 256 + decrypted[7],
|
||||||
palmVeinUserNo: this.requestParams.palmVeinUserNo
|
palmVeinUserNo: this.requestParams.palmVeinUserNo
|
||||||
})
|
})
|
||||||
if (addResult.code === Result.Success.code) {
|
if (addResult.code === Result.Success.code) {
|
||||||
@ -1297,7 +1297,7 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
isCoerced: this.requestParams.isForce,
|
isCoerced: this.requestParams.isForce,
|
||||||
remoteRight: this.requestParams.isAdmin,
|
remoteRight: this.requestParams.isAdmin,
|
||||||
lockId: this.lockInfo.lockId,
|
lockId: this.lockInfo.lockId,
|
||||||
remoteNumber: this.requestParams.remoteNumber,
|
remoteNumber: decrypted[6] * 256 + decrypted[7],
|
||||||
remoteUserNo: this.requestParams.remoteUserNo
|
remoteUserNo: this.requestParams.remoteUserNo
|
||||||
})
|
})
|
||||||
if (addResult.code === Result.Success.code) {
|
if (addResult.code === Result.Success.code) {
|
||||||
@ -1318,7 +1318,6 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
// 收到锁版回复判断操作类型进行对应api操作
|
// 收到锁版回复判断操作类型进行对应api操作
|
||||||
if (decrypted[2] === Result.Success.code) {
|
if (decrypted[2] === Result.Success.code) {
|
||||||
const {data, featureEnable} = this.requestParams
|
const {data, featureEnable} = this.requestParams
|
||||||
console.log('this.requestParams', this.requestParams)
|
|
||||||
let updateResult = new Result();
|
let updateResult = new Result();
|
||||||
switch (this.requestParams.featureBit) {
|
switch (this.requestParams.featureBit) {
|
||||||
case supportFunctionsFeatureBit.passageMode:
|
case supportFunctionsFeatureBit.passageMode:
|
||||||
@ -1327,8 +1326,8 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
passageMode: data.passageMode,
|
passageMode: data.passageMode,
|
||||||
passageModeConfig: [
|
passageModeConfig: [
|
||||||
{
|
{
|
||||||
startTime: data.startTime,
|
startDate: data.startDate,
|
||||||
endTime: data.endTime,
|
endDate: data.endDate,
|
||||||
isAllDay: data.isAllDay,
|
isAllDay: data.isAllDay,
|
||||||
weekDays: data.weekDay,
|
weekDays: data.weekDay,
|
||||||
autoUnlock: data.autoUnlock,
|
autoUnlock: data.autoUnlock,
|
||||||
@ -1366,10 +1365,25 @@ export async function parsingCharacteristicValue(binaryData) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case subCmdIds.supportFunctions:
|
case subCmdIds.supportFunctions:
|
||||||
this.updateLockInfo({
|
// 收到锁版回复判断操作类型进行对应api操作
|
||||||
token: decrypted.slice(5, 9)
|
if (decrypted[2] === Result.Success.code) {
|
||||||
})
|
const {data, featureEnable} = this.requestParams
|
||||||
this.characteristicValueCallback(new Result(decrypted[2]))
|
let updateResult = new Result();
|
||||||
|
switch (this.requestParams.featureBit) {
|
||||||
|
case supportFunctionsFeatureBit.antiPrySwitch:
|
||||||
|
updateResult = await updateLockSettingRequest({
|
||||||
|
lockId: this.lockInfo.lockId,
|
||||||
|
antiPrySwitch: featureEnable
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.characteristicValueCallback(new Result(decrypted[2]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.characteristicValueCallback(new Result(updateResult.code))
|
||||||
|
} else {
|
||||||
|
this.characteristicValueCallback(new Result(decrypted[2]))
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -1496,73 +1510,3 @@ export async function disconnectDevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用于判断时间戳是否是秒级别的,如果是的话则补充到毫秒级别
|
|
||||||
* @param timestamp 时间戳
|
|
||||||
* @returns {number|*}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
export function _convertToMilliseconds(timestamp) {
|
|
||||||
if (!timestamp) return timestamp;
|
|
||||||
return timestamp.toString().length === 10 ? timestamp * 1000 : timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查并返回具体哪个参数为空
|
|
||||||
* @param {Object} params - 参数对象
|
|
||||||
* @param {Array<string>} requiredFields - 必填字段列表
|
|
||||||
* @returns {string | null} - 如果有字段为空,则返回错误消息;否则返回null
|
|
||||||
*/
|
|
||||||
export function checkRequiredFields(params, requiredFields) {
|
|
||||||
for (let field of requiredFields) {
|
|
||||||
if (params[field] === undefined || params[field] === null) {
|
|
||||||
return `${field} 不能为空`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 辅助函数:将分钟时间转换为两个字节的数组
|
|
||||||
* @param minutes
|
|
||||||
* @returns {(number|number)[]}
|
|
||||||
*/
|
|
||||||
export function convertTimeToBytes(minutes) {
|
|
||||||
return [
|
|
||||||
Math.floor(minutes / 256), // 高字节
|
|
||||||
minutes % 256 // 低字节
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 二进制字符串转换为十进制数字数组
|
|
||||||
* 例如 '0111110' 会被转换为 [1, 2, 3, 4, 5](表示周一到周五)
|
|
||||||
* @param weekdayBit
|
|
||||||
* @returns {*[]}
|
|
||||||
*/
|
|
||||||
export function convertWeekdayBitToArray(weekdayBit) {
|
|
||||||
const weekdays = [];
|
|
||||||
const bits = weekdayBit.split('');
|
|
||||||
bits.forEach((bit, index) => {
|
|
||||||
if (bit === '1') {
|
|
||||||
weekdays.push(index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return weekdays;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 十进制数字数组转为二进制字符串
|
|
||||||
* 例如 将 [1,2,3,4,5] 转换回 '0111110'
|
|
||||||
* @param weekdays
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function convertWeekdayArrayToBit(weekdays) {
|
|
||||||
const bits = new Array(7).fill('0');
|
|
||||||
weekdays.forEach(day => {
|
|
||||||
if (day >= 0 && day < 7) {
|
|
||||||
bits[day] = '1';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return bits.join('');
|
|
||||||
}
|
|
||||||
12
constant.js
12
constant.js
@ -17,7 +17,15 @@ export const cmdIds = {
|
|||||||
// 清理用户
|
// 清理用户
|
||||||
cleanUser: 0x300c,
|
cleanUser: 0x300c,
|
||||||
// 扩展命令
|
// 扩展命令
|
||||||
expandCmd: 0x3030
|
expandCmd: 0x3030,
|
||||||
|
// 获取Wi-Fi列表
|
||||||
|
getWifiList: 0x30f6,
|
||||||
|
// Wi-Fi列表
|
||||||
|
wifiList: 0x30f7,
|
||||||
|
// 配网
|
||||||
|
distributionNetwork: 0x30f4,
|
||||||
|
// 配网结果
|
||||||
|
distributionNetworkResult: 0x30f5
|
||||||
}
|
}
|
||||||
|
|
||||||
// 子命令ID
|
// 子命令ID
|
||||||
@ -68,6 +76,8 @@ export const subCmdIds = {
|
|||||||
supportFunctionsWithParams: 72,
|
supportFunctionsWithParams: 72,
|
||||||
// 设置支持功能
|
// 设置支持功能
|
||||||
supportFunctions: 70,
|
supportFunctions: 70,
|
||||||
|
// 获取wifi列表
|
||||||
|
// getWifiList: 70,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 支持项对于功能位
|
// 支持项对于功能位
|
||||||
|
|||||||
72
format.js
72
format.js
@ -100,3 +100,75 @@ export function removeTrailingZeros(data) {
|
|||||||
}
|
}
|
||||||
return data.slice(0, currentIndex)
|
return data.slice(0, currentIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将分钟时间转换为两个字节的数组
|
||||||
|
* @param minutes
|
||||||
|
* @returns {(number|number)[]}
|
||||||
|
*/
|
||||||
|
export function convertTimeToBytes(minutes) {
|
||||||
|
return [
|
||||||
|
Math.floor(minutes / 256), // 高字节
|
||||||
|
minutes % 256 // 低字节
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 二进制字符串转换为十进制数字数组
|
||||||
|
* 例如 '0111110' 会被转换为 [1, 2, 3, 4, 5](表示周一到周五)
|
||||||
|
* @param weekdayBit
|
||||||
|
* @returns {*[]}
|
||||||
|
*/
|
||||||
|
export function convertWeekdayBitToArray(weekdayBit) {
|
||||||
|
const weekdays = [];
|
||||||
|
const bits = weekdayBit.split('');
|
||||||
|
bits.forEach((bit, index) => {
|
||||||
|
if (bit === '1') {
|
||||||
|
weekdays.push(index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return weekdays;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 十进制数字数组转为二进制字符串
|
||||||
|
* 例如 将 [1,2,3,4,5] 转换回 '0111110'
|
||||||
|
* @param weekdays
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export function convertWeekdayArrayToBit(weekdays) {
|
||||||
|
const bits = new Array(7).fill('0');
|
||||||
|
weekdays.forEach(day => {
|
||||||
|
if (day >= 0 && day < 7) {
|
||||||
|
bits[day] = '1';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return bits.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于判断时间戳是否是秒级别的,如果是的话则补充到毫秒级别
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @returns {number|*}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function _convertToMilliseconds(timestamp) {
|
||||||
|
if (!timestamp) return timestamp;
|
||||||
|
return timestamp.toString().length === 10 ? timestamp * 1000 : timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查并返回具体哪个参数为空
|
||||||
|
* @param {Object} params - 参数对象
|
||||||
|
* @param {Array<string>} requiredFields - 必填字段列表
|
||||||
|
* @returns {string | null} - 如果有字段为空,则返回错误消息;否则返回null
|
||||||
|
*/
|
||||||
|
export function checkRequiredFields(params, requiredFields) {
|
||||||
|
for (let field of requiredFields) {
|
||||||
|
if (params[field] === undefined || params[field] === null) {
|
||||||
|
return `${field} 不能为空`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|||||||
@ -1,6 +1,16 @@
|
|||||||
import {searchAndConnectDevice, writeBLECharacteristicValue} from "../uni/basic.js";
|
import {searchAndConnectDevice, writeBLECharacteristicValue} from "../uni/basic.js";
|
||||||
import {cmdIds, Result, subCmdIds, supportFunctionsFeatureBit} from '../constant'
|
import {cmdIds, Result, subCmdIds, supportFunctionsFeatureBit} from '../constant'
|
||||||
import {convertWeekdaysToNumber, createPackageEnd, md5Encrypt, parseTimeToList, timestampToArray} from "../format.js";
|
import {
|
||||||
|
convertWeekdaysToNumber,
|
||||||
|
createPackageEnd,
|
||||||
|
md5Encrypt,
|
||||||
|
parseTimeToList,
|
||||||
|
timestampToArray,
|
||||||
|
convertTimeToBytes,
|
||||||
|
convertWeekdayArrayToBit,
|
||||||
|
_convertToMilliseconds,
|
||||||
|
checkRequiredFields,
|
||||||
|
} from "../format.js";
|
||||||
import {sm4} from "sm-crypto";
|
import {sm4} from "sm-crypto";
|
||||||
import {
|
import {
|
||||||
checkRepeatCardName,
|
checkRepeatCardName,
|
||||||
@ -15,8 +25,6 @@ import {
|
|||||||
updateIcCardRequest
|
updateIcCardRequest
|
||||||
} from "../api.js";
|
} from "../api.js";
|
||||||
|
|
||||||
import {_convertToMilliseconds, checkRequiredFields, convertTimeToBytes, convertWeekdayArrayToBit} from "../common.js";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册扩展产品(卡片、指纹、人脸、遥控、掌静脉等)
|
* 注册扩展产品(卡片、指纹、人脸、遥控、掌静脉等)
|
||||||
@ -65,10 +73,19 @@ import {_convertToMilliseconds, checkRequiredFields, convertTimeToBytes, convert
|
|||||||
*/
|
*/
|
||||||
export async function registerExtendedProducts(params) {
|
export async function registerExtendedProducts(params) {
|
||||||
|
|
||||||
const cardRequiredFields = ['type', 'keyId', 'uid', 'userCountLimit', 'operate', 'isAdmin', 'isForce', 'isRound', 'startDate', 'endDate'];
|
const cardRequiredFields = ['type', 'userCountLimit', 'operate', 'isAdmin', 'isForce', 'isRound', 'startDate', 'endDate'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 循环类型参数校验
|
||||||
|
if (params.isRound && params.isRound === 1) {
|
||||||
|
const roundRequiredFields = ['startTime', 'endTime', 'weekDay'];
|
||||||
|
const missingField = checkRequiredFields(params, roundRequiredFields);
|
||||||
|
if (missingField) {
|
||||||
|
return new Result(Result.codes.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是卡片的话需要增加的参数
|
// 如果是卡片的话需要增加的参数
|
||||||
@ -78,7 +95,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
const cardRequiredFields = ['cardName', 'cardType', 'cardNumber'];
|
const cardRequiredFields = ['cardName', 'cardType', 'cardNumber'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `卡片信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `卡片信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
// 检查卡昵称是否重复
|
// 检查卡昵称是否重复
|
||||||
const checkRepeatCardNameResult = await checkRepeatCardName({
|
const checkRepeatCardNameResult = await checkRepeatCardName({
|
||||||
@ -101,7 +118,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
}
|
}
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `卡片信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `卡片信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -112,7 +129,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
const cardRequiredFields = ['fingerprintName', 'fingerprintNumber', 'fingerprintType'];
|
const cardRequiredFields = ['fingerprintName', 'fingerprintNumber', 'fingerprintType'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `指纹信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `指纹信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
// 检查卡昵称是否重复
|
// 检查卡昵称是否重复
|
||||||
const checkRepeatFingerprintNameResult = await checkRepeatFingerprintName({
|
const checkRepeatFingerprintNameResult = await checkRepeatFingerprintName({
|
||||||
@ -136,7 +153,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
}
|
}
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `指纹信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `指纹信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,7 +164,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
const cardRequiredFields = ['faceName', 'faceNumber', 'faceType'];
|
const cardRequiredFields = ['faceName', 'faceNumber', 'faceType'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `人脸信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `人脸信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
// 检查卡昵称是否重复
|
// 检查卡昵称是否重复
|
||||||
const checkRepeatFaceNameResult = await checkRepeatFaceName({
|
const checkRepeatFaceNameResult = await checkRepeatFaceName({
|
||||||
@ -170,7 +187,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
}
|
}
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `人脸信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `人脸信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,7 +198,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
const cardRequiredFields = ['palmVeinName', 'palmVeinNumber', 'palmVeinType'];
|
const cardRequiredFields = ['palmVeinName', 'palmVeinNumber', 'palmVeinType'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `掌静脉信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `掌静脉信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
// 检查卡昵称是否重复
|
// 检查卡昵称是否重复
|
||||||
const checkRepeatFaceNameResult = await checkRepeatPalmVeinName({
|
const checkRepeatFaceNameResult = await checkRepeatPalmVeinName({
|
||||||
@ -204,7 +221,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
}
|
}
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `掌静脉信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `掌静脉信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -215,7 +232,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
const cardRequiredFields = ['remoteName', 'remoteNumber', 'remoteType'];
|
const cardRequiredFields = ['remoteName', 'remoteNumber', 'remoteType'];
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `遥控信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `遥控信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
// 检查卡昵称是否重复
|
// 检查卡昵称是否重复
|
||||||
const checkRepeatFaceNameResult = await checkRepeatRemoteName({
|
const checkRepeatFaceNameResult = await checkRepeatRemoteName({
|
||||||
@ -238,7 +255,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
}
|
}
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `遥控信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `遥控信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -250,8 +267,6 @@ export async function registerExtendedProducts(params) {
|
|||||||
|
|
||||||
let {
|
let {
|
||||||
type,
|
type,
|
||||||
keyId,
|
|
||||||
uid,
|
|
||||||
operate,
|
operate,
|
||||||
isAdmin,
|
isAdmin,
|
||||||
userCountLimit,
|
userCountLimit,
|
||||||
@ -265,6 +280,10 @@ export async function registerExtendedProducts(params) {
|
|||||||
} = params
|
} = params
|
||||||
|
|
||||||
|
|
||||||
|
const uid = this.accountInfo.uid.toString()
|
||||||
|
const keyId = this.lockInfo.keyId.toString()
|
||||||
|
|
||||||
|
|
||||||
// 设置执行账号
|
// 设置执行账号
|
||||||
const result = await this.login(uid)
|
const result = await this.login(uid)
|
||||||
if (result.code !== Result.Success.code) {
|
if (result.code !== Result.Success.code) {
|
||||||
@ -387,6 +406,7 @@ export async function registerExtendedProducts(params) {
|
|||||||
|
|
||||||
contentArray.set(md5Array, 94)
|
contentArray.set(md5Array, 94)
|
||||||
|
|
||||||
|
console.log('加密前:', Array.from(contentArray))
|
||||||
const cebArray = sm4.encrypt(contentArray, this.lockInfo.bluetooth.privateKey, {
|
const cebArray = sm4.encrypt(contentArray, this.lockInfo.bluetooth.privateKey, {
|
||||||
mode: 'ecb',
|
mode: 'ecb',
|
||||||
output: 'array'
|
output: 'array'
|
||||||
@ -517,8 +537,8 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
const featureBitFields = {
|
const featureBitFields = {
|
||||||
[supportFunctionsFeatureBit.passageMode]: [
|
[supportFunctionsFeatureBit.passageMode]: [
|
||||||
'passageMode',
|
'passageMode',
|
||||||
'startTime',
|
'startDate',
|
||||||
'endTime',
|
'endDate',
|
||||||
'isAllDay',
|
'isAllDay',
|
||||||
'weekDay',
|
'weekDay',
|
||||||
'autoUnlock'
|
'autoUnlock'
|
||||||
@ -534,7 +554,7 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
const dataFields = featureBitFields[params.featureBit];
|
const dataFields = featureBitFields[params.featureBit];
|
||||||
for (const field of dataFields) {
|
for (const field of dataFields) {
|
||||||
if (params.data === undefined || params.data[field] === undefined) {
|
if (params.data === undefined || params.data[field] === undefined) {
|
||||||
return new Result(Result.NotMoreData, null, `data参数信息不完整: ${field}`);
|
return new Result(Result.codes.NotMoreData, null, `data参数信息不完整: ${field}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -544,7 +564,7 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
|
|
||||||
const missingField = checkRequiredFields(params, cardRequiredFields);
|
const missingField = checkRequiredFields(params, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 深拷贝一份参数赋值
|
// 深拷贝一份参数赋值
|
||||||
@ -555,14 +575,14 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
try {
|
try {
|
||||||
switch (params.featureBit) {
|
switch (params.featureBit) {
|
||||||
case supportFunctionsFeatureBit.passageMode:
|
case supportFunctionsFeatureBit.passageMode:
|
||||||
const {passageMode, startTime, endTime, isAllDay, weekDay, autoUnlock} = params.data
|
const {passageMode, startDate, endDate, isAllDay, weekDay, autoUnlock} = params.data
|
||||||
const startTimeBytes = convertTimeToBytes(startTime);
|
const startDateBytes = convertTimeToBytes(startDate);
|
||||||
const endTimeBytes = convertTimeToBytes(endTime);
|
const endDateBytes = convertTimeToBytes(endDate);
|
||||||
const weekDayBit = parseInt(String(convertWeekdayArrayToBit(weekDay)), 2);
|
const weekDayBit = parseInt(String(convertWeekdayArrayToBit(weekDay)), 2);
|
||||||
params.data = [
|
params.data = [
|
||||||
passageMode,
|
passageMode,
|
||||||
...startTimeBytes,
|
...startDateBytes,
|
||||||
...endTimeBytes,
|
...endDateBytes,
|
||||||
isAllDay,
|
isAllDay,
|
||||||
weekDayBit,
|
weekDayBit,
|
||||||
autoUnlock
|
autoUnlock
|
||||||
@ -574,7 +594,7 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
}
|
}
|
||||||
console.log('转换后的参数:', params.data)
|
console.log('转换后的参数:', params.data)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return new Result(Result.NotMoreData, null, `参数转换时异常,请检查参数格式: ${e}`);
|
return new Result(Result.codes.NotMoreData, null, `参数转换时异常,请检查参数格式: ${e}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -679,7 +699,7 @@ export async function updateSupportFunctionsWithParams(params) {
|
|||||||
* @param {Number} params.lockId 锁id (必填)
|
* @param {Number} params.lockId 锁id (必填)
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
export async function readSupportFunctionsSetting(params){
|
export async function readSupportFunctionsSetting(params) {
|
||||||
return await getLockSettingRequest(params)
|
return await getLockSettingRequest(params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
import {sm4} from 'sm-crypto'
|
import {sm4} from 'sm-crypto'
|
||||||
import {cmdIds, Result} from '../constant'
|
import {cmdIds, Result} from '../constant'
|
||||||
import {searchAndConnectDevice, writeBLECharacteristicValue} from '../uni/basic'
|
import {searchAndConnectDevice, writeBLECharacteristicValue} from '../uni/basic'
|
||||||
import {createPackageEnd, md5Encrypt, timestampToArray} from '../format'
|
import {createPackageEnd, md5Encrypt, timestampToArray,checkRequiredFields} from '../format'
|
||||||
import {getLockDetailRequest, getLockSettingDataRequest, remoteUnLockRequest} from '../api'
|
import {getLockDetailRequest, getLockSettingDataRequest, remoteUnLockRequest} from '../api'
|
||||||
import {getStorage, setStorage} from '../export'
|
import {getStorage, setStorage} from '../export'
|
||||||
import log from '../log'
|
import log from '../log'
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 选择锁
|
* 选择锁
|
||||||
* @param params
|
* @param params
|
||||||
@ -381,3 +382,54 @@ export async function remoteUnLock(params) {
|
|||||||
lockId: params.lockId,
|
lockId: params.lockId,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索wifi列表
|
||||||
|
* @param params
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
export async function searchWifiList(params) {
|
||||||
|
// 需要校验的参数
|
||||||
|
const baseRequiredFields = [
|
||||||
|
'uid',
|
||||||
|
];
|
||||||
|
const missingField = checkRequiredFields(params, baseRequiredFields);
|
||||||
|
if (missingField) {
|
||||||
|
return new Result(Result.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确认设备连接正常
|
||||||
|
if (!params.connected) {
|
||||||
|
const searchResult = await searchAndConnectDevice(this.lockInfo.bluetooth.bluetoothDeviceName)
|
||||||
|
if (searchResult.code !== Result.Success.code) {
|
||||||
|
return searchResult
|
||||||
|
}
|
||||||
|
this.updateLockInfo(searchResult.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
const {uid} = params
|
||||||
|
const length = 2 + 20
|
||||||
|
const headArray = this.createPackageHeader(3, length)
|
||||||
|
|
||||||
|
const contentArray = new Uint8Array(length)
|
||||||
|
contentArray[0] = cmdIds.getWifiList / 256
|
||||||
|
contentArray[1] = cmdIds.getWifiList % 256
|
||||||
|
for (let i = 0; i < uid.length; i++) {
|
||||||
|
contentArray[i + 2] = uid.charCodeAt(i)
|
||||||
|
}
|
||||||
|
console.log('加密前:', Array.from(contentArray))
|
||||||
|
|
||||||
|
const cebArray = sm4.encrypt(contentArray, this.lockInfo.bluetooth.privateKey, {
|
||||||
|
mode: 'ecb',
|
||||||
|
output: 'array'
|
||||||
|
})
|
||||||
|
|
||||||
|
const packageArray = createPackageEnd(headArray, cebArray)
|
||||||
|
|
||||||
|
await writeBLECharacteristicValue(this.lockInfo.deviceId,
|
||||||
|
this.lockInfo.serviceId,
|
||||||
|
this.lockInfo.writeCharacteristicId,
|
||||||
|
packageArray)
|
||||||
|
|
||||||
|
return this.getWriteResult(this.searchWifiList, params)
|
||||||
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
import {sm4} from 'sm-crypto'
|
import {sm4} from 'sm-crypto'
|
||||||
import {cmdIds, Result, subCmdIds} from '../constant'
|
import {cmdIds, Result, subCmdIds} from '../constant'
|
||||||
import {searchAndConnectDevice, writeBLECharacteristicValue} from '../uni/basic'
|
import {searchAndConnectDevice, writeBLECharacteristicValue} from '../uni/basic'
|
||||||
import {createPackageEnd, md5Encrypt, timestampToArray} from '../format'
|
import {createPackageEnd, md5Encrypt, timestampToArray,checkRequiredFields} from '../format'
|
||||||
import {checkPasswordRequest, getOfflinePasswordRequest} from '../api'
|
import {checkPasswordRequest, getOfflinePasswordRequest} from '../api'
|
||||||
import {getConfig} from "../common.js";
|
import {getConfig} from "../common.js";
|
||||||
import StarCloud from "../star-cloud.js";
|
import StarCloud from "../star-cloud.js";
|
||||||
import {checkRequiredFields} from "../common.js";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,7 +84,7 @@ export async function customPassword(params) {
|
|||||||
|
|
||||||
const missingField = checkRequiredFields(params.password, cardRequiredFields);
|
const missingField = checkRequiredFields(params.password, cardRequiredFields);
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
return new Result(Result.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
return new Result(Result.codes.NotMoreData, null, `参数信息不完整: ${missingField}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user