UNPKG

@iot9x.com/ipc-utils

Version:

九星云、九星小程序、九星配置工具所共用的库方法

143 lines (142 loc) 5.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Util = void 0; const constant_1 = require("./constant"); class Util { /** * 获取长度的十六进制字符串表示形式 * @description 固定返回四个字符的字符串 * @param payloadHex 内容的十六进制字符串格式 * @returns 长度的十六进制字符串格式(字母大写),示例:'0005'、'000F' */ static getLengthHex(payloadHex) { const length = !payloadHex || !payloadHex.length ? 5 : payloadHex.match(/\w/g).join('').length / 2 + 5; return length.toString(16).toUpperCase().padStart(4, '0'); } /** * 获取累加校验和的十六进制字符串格式 * @param lengthHex 长度的十六进制字符串 * @param cmdHex 命令的十六进制字符串 * @param payloadHex 数据域的十六进制字符串 * @returns 累加校验和的十六进制格式 */ static getSumCheckHex(lengthHex, cmdHex, payloadHex) { const sum = (lengthHex + cmdHex + (payloadHex || '')) .match(/\w/g) .join('') .match(/\w{2}/g) .reduce((sum, byteHex) => sum + parseInt(byteHex, 16), 0); return (sum % 256).toString(16).toUpperCase().padStart(2, '0'); } /** * 获取蓝牙BLE可以直接下发的命令 * @param lengthHex 长度的十六进制字符串 * @param cmdHex 命令的十六进制字符串 * @param sumCheckHex 校验的十六进制字符串 * @param payloadHex 数据域的十六进制字符串 * @returns 蓝牙BLE可以直接下发的命令 */ static getBLE_CMD(lengthHex, cmdHex, sumCheckHex, payloadHex) { return Util.hexToUint8Array(constant_1.BLE_PREFIX + lengthHex + cmdHex + (payloadHex || '') + sumCheckHex + constant_1.BLE_SUFFIX); } /** * 将十六进制字符串格式转换成Uint8Array格式 * @param hexStr 十六进制字符串 * @returns Uint8Array格式内容 */ static hexToUint8Array(hexStr) { return new Uint8Array(hexStr .match(/\w/g) .join('') .match(/\w{2}/g) .map((byteHex) => parseInt(byteHex, 16))); } /** * 将Uint8Array数据转换成十六进制字符串 * @param data Uint8Array数据 * @param separator 十六进制分隔符 * @returns 转换后的十六进制字符串 */ static uint8ArrayToHexStr(data, separator = '') { const buf = []; for (const byte of data) { buf.push(byte.toString(16).toUpperCase().padStart(2, '0')); } return buf.join(separator); } /** * ASCII字符串转十六进制字符串 * @param asciiStr ASCII原始字符 * @param separator 分隔符 * @returns 十六进制字符串 */ static asciiToHexStr(asciiStr, separator = '') { if (!asciiStr || !asciiStr.length) return ''; return asciiStr .split('') .map((char) => char.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0')) .join(separator); } /** * 十六进制字符串转ASCII字符串 * @param hexStr 原始十六进制字符串 * @returns ASCII字符串 */ static hexStrToASCII(hexStr) { if (!hexStr || !hexStr.length) return ''; return hexStr .match(/\w{2}/g) .map((charHex) => String.fromCharCode(parseInt(charHex, 16))) .join(''); } /** * 蓝牙数据帧格式校验 * @param data 蓝牙数据帧 * @param cmdHex 命令类型 */ static formatCheck(data, cmdHex) { if (data.length < 7) throw new Error('蓝牙帧过短'); if (data[0].toString(16).toUpperCase().padStart(2, '0') !== constant_1.BLE_PREFIX) throw new Error('蓝牙帧头错误'); if (data[data.length - 1].toString(16).toUpperCase().padStart(2, '0') !== constant_1.BLE_SUFFIX) throw new Error('蓝牙帧尾错误'); // * 长度校验 const lengthHex = data[1].toString(16).toUpperCase().padStart(2, '0') + data[2].toString(16).toUpperCase().padStart(2, '0'); const length = parseInt(lengthHex, 16); if (length + 2 !== data.length) throw new Error('蓝牙帧长度不正确'); // * 命令校验 const cmd = data[3].toString(16).toUpperCase().padStart(2, '0') + data[4].toString(16).toUpperCase().padStart(2, '0'); if (cmd !== cmdHex) throw new Error('命令不匹配'); // * 累加和校验 const payloadHex = data.length > 7 ? Util.uint8ArrayToHexStr(data).slice(10, -4) : undefined; const sumCheckHex = data[data.length - 2].toString(16).toUpperCase().padStart(2, '0'); if (sumCheckHex !== Util.getSumCheckHex(lengthHex, cmdHex, payloadHex)) throw new Error('累加和校验错误'); } /** * 获取数据域内容 * @param data 蓝牙数据帧 * @returns 数据域内容 */ static getPayload(data) { return data.length > 7 ? data.slice(5, -2) : null; } /** * 获取十六进制的数据域内容 * @param data 蓝牙数据帧 * @param separator 十六进制分隔符 * @returns 数据域内容——十六进制字符串 */ static getPayloadHex(data, separator = '') { const payloadHex = data.length > 7 ? Util.uint8ArrayToHexStr(data).slice(10, -4) : null; if (payloadHex && separator !== '') return payloadHex.match(/\w{2}/g).join(separator); return payloadHex; } } exports.Util = Util;