@iot9x.com/ipc-utils
Version:
九星云、九星小程序、九星配置工具所共用的库方法
143 lines (142 loc) • 5.69 kB
JavaScript
;
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;