× Found 1 circular dependency! 1) components/blufi/xBlufi-wx-impl.js > components/blufi/xBlufi.js
520 lines
13 KiB
JavaScript
520 lines
13 KiB
JavaScript
export const SERVICE_TYPE = '_notice_service._tcp.'
|
|
export const FACE_DERECT = 'face_detect'
|
|
export const FACE_RECOGNIZE = 'face_recognize'
|
|
export const FACE_ENROll = 'face_enroll'
|
|
export const STOP_STREAM = 'stop_stream'
|
|
export const GET_ID = 'get_id'
|
|
export const FACE_DELETE = 'face_delete'
|
|
export const DELETE_ALL = 'delete_all'
|
|
export const ON_STATUS = 1
|
|
export const OFF_STATUS = 0
|
|
export const HTTP_STR = 'http://null:80/control'
|
|
export const HTTP_STATUS = 'http://null:80/status'
|
|
export const HTTP_STREAM = 'http://null:81/stream'
|
|
export const FRAME_CTRL_POSITION_ENCRYPTED = 0
|
|
export const FRAME_CTRL_POSITION_CHECKSUM = 1
|
|
export const FRAME_CTRL_POSITION_DATA_DIRECTION = 2
|
|
export const FRAME_CTRL_POSITION_REQUIRE_ACK = 3
|
|
export const FRAME_CTRL_POSITION_FRAG = 4
|
|
export const DIRECTION_OUTPUT = 0
|
|
export const DIRECTION_INPUT = 1
|
|
export const AES_BASE_IV = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
export const NEG_SET_SEC_TOTAL_LEN = 0x00
|
|
export const NEG_SET_SEC_ALL_DATA = 0x01
|
|
export const PACKAGE_VALUE = 0x01
|
|
export const SUBTYPE_NEG = 0x00
|
|
export const SUBTYPE_WIFI_MODEl = 0x02
|
|
export const SUBTYPE_END = 0x03
|
|
export const PACKAGE_CONTROL_VALUE = 0x00
|
|
export const SUBTYPE_WIFI_NEG = 0x09
|
|
export const SUBTYPE_SET_SSID = 0x2
|
|
export const SUBTYPE_SET_PWD = 0x3
|
|
export const SUBTYPE_WIFI_LIST_NEG = 11
|
|
export const SUBTYPE_NEGOTIATION_NEG = 0
|
|
export const SUBTYPE_CUSTOM_DATA = 0x13
|
|
export const DH_P =
|
|
'cf5cf5c38419a724957ff5dd323b9c45c3cdd261eb740f69aa94b8bb1a5c96409153bd76b24222d03274e4725a5406092e9e82e9135c643cae98132b0d95f7d65347c68afc1e677da90e51bbab5f5cf429c291b4ba39c6b2dc5e8c7231e46aa7728e87664532cdf547be20c9a3fa8342be6e34371a27c06f7dc0edddd2f86373'
|
|
export const DH_G = '02'
|
|
export const descSucListEN = [
|
|
'Bluetooth connecting...',
|
|
'Bluetooth connection successful',
|
|
'Device information is successfully obtained',
|
|
'Attribute information is successfully obtained',
|
|
'Send configuration information...',
|
|
'Configuration information sent successfully',
|
|
'Connection successfully',
|
|
]
|
|
|
|
export const descFailListEN = [
|
|
'Bluetooth connection failed',
|
|
'Device information acquisition failed',
|
|
'Attribute information acquisition failed',
|
|
'Configuration information sent failed',
|
|
'Distribution network failed',
|
|
]
|
|
|
|
export const descSucList = [
|
|
'蓝牙连接...',
|
|
'蓝牙连接成功',
|
|
'设备信息已成功获取',
|
|
'属性信息已成功获取',
|
|
'发送配置信息...',
|
|
'成功发送配置信息',
|
|
'成功连接',
|
|
]
|
|
|
|
export const descFailList = [
|
|
'蓝牙连接失败',
|
|
'设备信息获取失败',
|
|
'属性信息获取失败',
|
|
'配置信息发送失败',
|
|
'网络配置失败',
|
|
'蓝牙异常断开',
|
|
]
|
|
|
|
export const successList = {
|
|
0: 'NULL',
|
|
1: 'STA',
|
|
2: 'SoftAP',
|
|
3: 'SoftAP & STA',
|
|
}
|
|
|
|
export const failList = {
|
|
0: 'sequence error',
|
|
1: 'checksum error',
|
|
2: 'decrypt error',
|
|
3: 'encrypt error',
|
|
4: 'init security error',
|
|
5: 'dh malloc error',
|
|
6: 'dh param error',
|
|
7: 'read param error',
|
|
8: 'make public error',
|
|
}
|
|
export const CRC_TB = [
|
|
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,
|
|
0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
|
|
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
|
|
0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
|
|
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
|
|
0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
|
|
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
|
|
0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
|
|
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
|
|
0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
|
|
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,
|
|
0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
|
|
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,
|
|
0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
|
|
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
|
|
0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
|
|
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,
|
|
0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
|
|
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
|
|
0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
|
|
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
|
|
0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
|
|
] //转16进制
|
|
// ArrayBuffer转16进制字符串
|
|
export const ab2hex = buffer => {
|
|
const hexArr = Array.from(new Uint8Array(buffer), bit => bit.toString(16).padStart(2, '0'))
|
|
return hexArr
|
|
}
|
|
|
|
// 16进制字符串转普通字符串
|
|
export const hexCharCodeToStr = hexCharCodeStr => {
|
|
const trimedStr = hexCharCodeStr.trim()
|
|
const rawStr = trimedStr.toLowerCase().startsWith('0x') ? trimedStr.slice(2) : trimedStr
|
|
const len = rawStr.length
|
|
|
|
if (len % 2 !== 0) {
|
|
console.error('Illegal Format ASCII Code!')
|
|
return ''
|
|
}
|
|
|
|
const resultStr = []
|
|
for (let i = 0; i < len; i += 2) {
|
|
const curCharCode = parseInt(rawStr.substr(i, 2), 16)
|
|
resultStr.push(String.fromCharCode(curCharCode))
|
|
}
|
|
|
|
return resultStr.join('')
|
|
}
|
|
|
|
// 过滤设备列表
|
|
export const filterDevice = (devices, filterName) => {
|
|
const re = new RegExp(`^(${filterName})`)
|
|
return devices.filter(device => re.test(device.name))
|
|
}
|
|
|
|
// 获取类型
|
|
export const getType = (pkgType, subType) => {
|
|
return (subType << 2) | pkgType
|
|
}
|
|
|
|
// Uint8Array转数组
|
|
export const uint8ArrayToArray = uint8Array => {
|
|
return Array.from(uint8Array)
|
|
}
|
|
|
|
// 16进制转二进制数组
|
|
export const hexToBinArray = str => {
|
|
const dec = parseInt(str, 16)
|
|
let bin = dec.toString(2)
|
|
const len = bin.length
|
|
|
|
if (len < 8) {
|
|
bin = bin.padStart(8, '0')
|
|
}
|
|
|
|
return bin.split('')
|
|
}
|
|
|
|
// 16进制字符串转数组
|
|
export const hexByArray = str => {
|
|
let formattedStr = str
|
|
if (str.length % 2 !== 0) {
|
|
formattedStr = '0' + str
|
|
}
|
|
|
|
const arr = []
|
|
for (let i = 0; i < formattedStr.length; i += 2) {
|
|
arr.push(formattedStr.substring(i, i + 2))
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
// 16进制字符串转整型数组
|
|
export const hexByInt = str => {
|
|
let formattedStr = str
|
|
if (str.length % 2 !== 0) {
|
|
formattedStr = '0' + str
|
|
}
|
|
|
|
const arr = []
|
|
for (let i = 0; i < formattedStr.length; i += 2) {
|
|
arr.push(parseInt(formattedStr.substring(i, i + 2), 16))
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
// 排序函数
|
|
export const sortBy = (attr, rev = 1) => {
|
|
return (a, b) => {
|
|
const aVal = a[attr]
|
|
const bVal = b[attr]
|
|
|
|
if (aVal < bVal) return rev * -1
|
|
if (aVal > bVal) return rev * 1
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// 判断是否为空
|
|
export const _isEmpty = str => {
|
|
return str === '' || str === null || str === undefined || str === 'null' || str === 'undefined'
|
|
}
|
|
|
|
// 设置失败背景色
|
|
export const setFailBg = () => {
|
|
uni.setNavigationBarColor({
|
|
frontColor: '#ffffff',
|
|
backgroundColor: '#737d89',
|
|
})
|
|
}
|
|
|
|
// 设置成功背景色
|
|
export const setSucBg = () => {
|
|
uni.setNavigationBarColor({
|
|
frontColor: '#ffffff',
|
|
backgroundColor: '#4d9efb',
|
|
})
|
|
}
|
|
|
|
// 组装数据格式
|
|
export const writeData = (type, subType, frameCtl, seq, len, data = []) => {
|
|
const value = []
|
|
const combinedType = getType(type, subType)
|
|
value.push(combinedType, frameCtl, seq, len)
|
|
|
|
if (data.length > 0) {
|
|
value.push(...data)
|
|
}
|
|
|
|
return value
|
|
}
|
|
|
|
// 分包处理
|
|
export const isSubcontractor = (data, checksum, sequence, encrypt) => {
|
|
const total = data.length
|
|
let lenData = []
|
|
let laveData = []
|
|
let flag = false
|
|
|
|
if (total > 16) {
|
|
if (checksum) {
|
|
lenData = data.slice(0, 12)
|
|
laveData = data.slice(12)
|
|
} else {
|
|
lenData = data.slice(0, 14)
|
|
laveData = data.slice(14)
|
|
}
|
|
|
|
const len1 = (total >> 8) & 0xff
|
|
const len2 = total & 0xff
|
|
lenData.unshift(len1, len2)
|
|
flag = true
|
|
} else {
|
|
lenData = data
|
|
}
|
|
|
|
const len = lenData.length
|
|
|
|
if (checksum) {
|
|
lenData = assemblyChecksum(lenData, len, sequence)
|
|
}
|
|
|
|
return {
|
|
len,
|
|
lenData,
|
|
laveData,
|
|
flag,
|
|
}
|
|
}
|
|
|
|
// 组装校验和
|
|
export const assemblyChecksum = (list, len, sequence) => {
|
|
const checkData = [sequence, len, ...list]
|
|
const crc = caluCRC(0, checkData)
|
|
const checksumByte1 = crc & 0xff
|
|
const checksumByte2 = (crc >> 8) & 0xff
|
|
|
|
return [...list, checksumByte1, checksumByte2]
|
|
}
|
|
|
|
// 加密数据
|
|
export const encrypt = (aesjs, md5Key, sequence, data, checksum) => {
|
|
const iv = generateAESIV(sequence)
|
|
let list = []
|
|
let sumArr = []
|
|
|
|
if (checksum) {
|
|
const len = data.length - 2
|
|
list = data.slice(0, len)
|
|
sumArr = data.slice(len)
|
|
} else {
|
|
list = data
|
|
}
|
|
|
|
const encryptData = uint8ArrayToArray(blueAesEncrypt(aesjs, md5Key, iv, new Uint8Array(list)))
|
|
|
|
return [...encryptData, ...sumArr]
|
|
}
|
|
|
|
// DH加密
|
|
export const blueDH = (p, g, crypto) => {
|
|
const client = crypto.createDiffieHellman(p, 'hex', g, 'hex')
|
|
client.generateKeys()
|
|
return client
|
|
}
|
|
|
|
// MD5加密
|
|
export const blueMd5 = (md5, key) => {
|
|
return md5.array(key)
|
|
}
|
|
|
|
// AES加密
|
|
export const blueAesEncrypt = (aesjs, mdKey, iv, bytes) => {
|
|
const aesOfb = new aesjs.ModeOfOperation.ofb(mdKey, iv)
|
|
return aesOfb.encrypt(bytes)
|
|
}
|
|
|
|
// AES解密
|
|
export const blueAesDecrypt = (aesjs, mdKey, iv, bytes) => {
|
|
const aesOfb = new aesjs.ModeOfOperation.ofb(mdKey, iv)
|
|
return aesOfb.decrypt(bytes)
|
|
}
|
|
|
|
// 获取Frame Control值
|
|
export const getFrameCTRLValue = (encrypted, checksum, direction, requireAck, frag) => {
|
|
let frame = 0
|
|
|
|
if (encrypted) frame |= 1 << FRAME极狐_CTRL_POSITION_ENCRYPTED
|
|
if (checksum) frame |= 1 << FRAME_CTRL_POSITION_CHECKSUM
|
|
if (direction === DIRECTION_INPUT) frame |= 1 << FRAME_CTRL_POSITION_DATA_DIRECTION
|
|
if (requireAck) frame |= 1 << FRAME_CTRL_POSITION_REQUIRE_ACK
|
|
if (frag) frame |= 1 << FRAME_CTRL_POSITION_FRAG
|
|
|
|
return frame
|
|
}
|
|
|
|
// 生成AES IV
|
|
export const generateAESIV = sequence => {
|
|
return AES_BASE_IV.map((val, i) => (i === 0 ? sequence : val))
|
|
}
|
|
|
|
// 计算CRC
|
|
export const caluCRC = (crc, pByte) => {
|
|
crc = ~crc & 0xffff
|
|
|
|
for (const byte of pByte) {
|
|
crc = CRC_TB[((crc & 0xffff) >> 8) ^ (byte & 0xff)] ^ ((crc & 0xffff) << 8)
|
|
}
|
|
|
|
return ~crc & 0xffff
|
|
}
|
|
|
|
// 发送请求
|
|
export const send = (method, url, data, suc, error) => {
|
|
console.log(url)
|
|
uni.request({
|
|
url,
|
|
data,
|
|
header: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
method,
|
|
success: res => {
|
|
suc?.(res.data)
|
|
},
|
|
fail: () => {
|
|
error?.()
|
|
},
|
|
})
|
|
}
|
|
|
|
// 显示加载中
|
|
export const showLoading = msg => {
|
|
uni.hideLoading()
|
|
uni.showLoading({
|
|
title: msg,
|
|
mask: true,
|
|
})
|
|
}
|
|
|
|
// 显示提示
|
|
export const showToast = msg => {
|
|
uni.showToast({
|
|
title: msg,
|
|
icon: 'none',
|
|
duration: 2000,
|
|
})
|
|
}
|
|
|
|
// OTA擦除
|
|
export const write_ota_erase = (cmd, len, addr, block_num) => {
|
|
return [cmd, 4, 256, 1, 54, 0]
|
|
}
|
|
|
|
// OTA编程
|
|
export const write_ota_program = (cmd, len, addr, buf) => {
|
|
const value = []
|
|
const offest = addr
|
|
let sum = 0
|
|
|
|
if (cmd === 0x80) {
|
|
for (let i = 0; i < len; i++) {
|
|
sum += buf.getUint8(i + offest)
|
|
}
|
|
}
|
|
|
|
let calculatedAddr = addr + 4 * 1024
|
|
calculatedAddr = calculatedAddr / 16
|
|
|
|
value.push(cmd, len, calculatedAddr & 0xff, calculatedAddr >> 8)
|
|
|
|
if (cmd === 0x80) {
|
|
value.push(sum & 0xff, (sum & 0xff00) >> 8, 0, 0)
|
|
}
|
|
|
|
for (let i = 0; i < len; i++) {
|
|
value.push(buf.getUint8(i + offest))
|
|
}
|
|
|
|
return value
|
|
}
|
|
|
|
// OTA校验和
|
|
export const write_ota_sum = (cmd, len, data) => {
|
|
return [
|
|
cmd,
|
|
0,
|
|
0,
|
|
0,
|
|
len & 0xff,
|
|
(len >> 8) & 0xff,
|
|
(len >> 16) & 0xff,
|
|
(len >> 24) & 0xff,
|
|
data & 0xff,
|
|
(data >> 8) & 0xff,
|
|
(data >> 16) & 0xff,
|
|
(data >> 24) & 0xff,
|
|
]
|
|
}
|
|
|
|
export default {
|
|
_isEmpty,
|
|
send,
|
|
SERVICE_TYPE,
|
|
FACE_DERECT,
|
|
FACE_RECOGNIZE,
|
|
FACE_ENROll,
|
|
STOP_STREAM,
|
|
GET_ID,
|
|
ON_STATUS,
|
|
OFF_STATUS,
|
|
HTTP_STR,
|
|
HTTP_STATUS,
|
|
HTTP_STREAM,
|
|
FACE_DELETE,
|
|
DELETE_ALL,
|
|
ab2hex,
|
|
hexCharCodeToStr,
|
|
filterDevice,
|
|
getType,
|
|
hexToBinArray,
|
|
hexByArray,
|
|
hexByInt,
|
|
sortBy,
|
|
setFailBg,
|
|
setSucBg,
|
|
writeData,
|
|
isSubcontractor,
|
|
getFrameCTRLValue,
|
|
blueDH,
|
|
blueMd5,
|
|
blueAesEncrypt,
|
|
blueAesDecrypt,
|
|
uint8ArrayToArray,
|
|
generateAESIV,
|
|
caluCRC,
|
|
encrypt,
|
|
DH_P,
|
|
DH_G,
|
|
DIRECTION_OUTPUT,
|
|
DIRECTION_INPUT,
|
|
NEG_SET_SEC_TOTAL_LEN,
|
|
NEG_SET_SEC_ALL_DATA,
|
|
PACKAGE_VALUE,
|
|
SUBTYPE_NEG,
|
|
PACKAGE_CONTROL_VALUE,
|
|
SUBTYPE_WIFI_NEG,
|
|
SUBTYPE_WIFI_LIST_NEG,
|
|
SUBTYPE_NEGOTIATION_NEG,
|
|
SUBTYPE_WIFI_MODEl,
|
|
SUBTYPE_SET_SSID,
|
|
SUBTYPE_SET_PWD,
|
|
SUBTYPE_END,
|
|
SUBTYPE_CUSTOM_DATA,
|
|
descSucList,
|
|
descFailList,
|
|
successList,
|
|
failList,
|
|
showToast,
|
|
showLoading,
|
|
write_ota_sum,
|
|
write_ota_program,
|
|
write_ota_erase,
|
|
}
|