/**
* @description 链接地址是否为视频
* @param path
* @return {boolean}
*/
const isVideo = (path) => {
return /\.(mp4|avi|wmv|mpg|mpeg|mov|rm|ram|swf|flv)/.test(path);
}
/**
* @description 图片预览
* @param url data-url="{url}"
*/
const previewImage = ({currentTarget: {dataset: { url }}}) => {
if (!url) return;
if (url.indexOf('http') === -1 || url.indexOf('https') === -1) {
url = 'https://oss.flossom.com' + url;
}
wx.previewImage({
urls: [url]
})
};
const formatTime = (date) => {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const hour = date.getHours();
const minute = date.getMinutes();
const second = date.getSeconds();
return `${[year, month, day].map(formatNumber).join("/")} ${[
hour,
minute,
second,
]
.map(formatNumber)
.join(":")}`;
};
const formatNumber = (n) => {
n = n.toString();
return n[1] ? n : `0${n}`;
};
const setdata = (that, key, value) => {
that.setData({
[key]: value,
});
};
const filertext = (text) => {
return text.replace(/{/g, "").replace(/}/, "").replace(/"/g, "");
};
/**
* 处理富文本里的图片宽度自适应
* 1.去掉img标签里的style、width、height属性
* 2.img标签添加style属性:max-width:100%;height:auto
* 3.修改所有style里的width属性为max-width:100%
* 4.去掉
标签
* @param html
* @returns {void|string|*}
*/
const formatRichText = (html) => {
let newContent = html.replace(/
]*>/gi, (match) => {
match = match.replace(/style="[^"]+"/gi, '')
return match;
});
newContent = newContent.replace(/style="[^"]+"/gi, (match) => {
match = match.replace(/width:[^;]+;/gi, 'max-width:100%!important;')
return match;
});
newContent = newContent.replace(/\
{
const year = new Date().getFullYear();
const month = new Date().getMonth() + 1;
const day = new Date().getDate();
return (
year +
"-" +
String(month).padStart("2", 0) +
"-" +
String(day).padStart("2", 0)
);
};
const getdates = (date) => {
date = date.replace(/-/g, '/'); // 部分iphone new Date不兼容[2023-01-01]格式,需要转换
const year = new Date(date).getFullYear();
const month = new Date(date).getMonth() + 1;
const day = new Date(date).getDate();
const hour = new Date(date).getHours();
const minute = new Date(date).getMinutes();
const second = new Date(date).getSeconds();
// return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}`
return `${[year, month, day].map(formatNumber).join("-")}`;
};
/**
* 获取当前年份的第一天和最后一天
* @returns {string} 例如 2019-01-01~2019-12-31
*/
const getYearFirstLastDay = () => {
let firstDay = new Date();
firstDay.setDate(1);
firstDay.setMonth(0);
let lastDay = new Date();
lastDay.setFullYear(lastDay.getFullYear() + 2);
lastDay.setDate(0);
lastDay.setMonth(-1);
firstDay = firstDay.Format("yyyy-MM-dd");
lastDay = lastDay.Format("yyyy-MM-dd");
return lastDay;
};
//日期格式化方法Format()方法
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2018-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2018-7-2 8:9:4.18
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
S: this.getMilliseconds(), //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(
RegExp.$1,
(this.getFullYear() + "").substr(4 - RegExp.$1.length)
);
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
);
return fmt;
};
/**
*
* ArrayBuffer转16进制字符串
*/
const ab2hex = (buffer) => {
var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function (bit) {
return ("00" + bit.toString(16)).slice(-2);
});
return hexArr.join("");
};
/**
*
*
*/
const hex2int = (hex) => {
var len = hex.length,
a = new Array(len),
code;
for (var i = 0; i < len; i++) {
code = hex.charCodeAt(i);
if (48 <= code && code < 58) {
code -= 48;
} else {
code = (code & 0xdf) - 65 + 10;
}
a[i] = code;
}
return a.reduce(function (acc, c) {
acc = 16 * acc + c;
return acc;
}, 0);
};
const keywordTofilter = (str) => {
let arr = [];
for (let i = 0, len = str.length; i < len; i += 2) {
arr.push(str.slice(i, i + 2));
}
for (let i = 0; i < arr.length; i++) {
if (i == 0 || i == arr.length - 1) {
continue;
}
if (arr[i] == "db") {
arr[i] = "dccb";
}
if (arr[i] == "dc") {
arr[i] = "dccc";
}
if (arr[i] == "de") {
arr[i] = "dcce";
}
}
return arr.join("");
};
const filterData = (str) => {
let data = str
.replace(/dccc/g, "dc")
.replace(/dccb/g, "db")
.replace(/dcce/g, "de");
return data;
};
const filterBleData = (str) => {
let arr = [];
let arr2 = [];
let arr3 = [];
for (let i = 0, len = str.length; i < len; i += 2) {
arr.push(str.slice(i, i + 2));
}
let index = 0;
arr.map((item, i) => {
if (item == "dc") {
if (i + 1 !== arr.length - 1) {
arr2[index].push("d" + arr[i + 1].substring(1, 2));
}
return false;
}
if (item == "de") {
arr2[index] = arr2[index].join("");
index += 1;
} else {
if (!Array.isArray(arr2[index])) {
arr2[index] = [];
}
if (i !== 0) {
if (arr[i - 1] !== "dc") {
arr2[index].push(item);
}
}
}
});
arr2.map((item) => {
// console.log(ccrc8('db'+item.substring(0,item.length-2)) , item.substring(item.length-2,item.length))
if (
ccrc8("db" + item.substring(0, item.length - 2)) ==
item.substring(item.length - 2, item.length)
) {
arr3.push("db" + item + "de");
}
});
return arr3;
};
const ccrc8 = (str) => {
let arr = [];
for (let i = 0, len = str.length; i < len; i += 2) {
arr.push("0x" + str.slice(i, i + 2));
}
const crc8_854_table = [
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
247, 182, 232, 10, 84, 215, 137, 107, 53,
];
let crc = new Uint8Array(1);
crc = 0;
for (let i = 0; i < arr.length; i++) {
crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)];
}
return (crc & 0xff).toString(16).padStart("2", 0);
};
const s_to_hs = (s) => {
//计算分钟
//算法:将秒数除以60,然后下舍入,既得到分钟数
var h;
h = Math.floor(s / 60);
//计算秒
//算法:取得秒%60的余数,既得到秒数
s = s % 60;
//将变量转换为字符串
h += "";
s += "";
//如果只有一位数,前面增加一个0
h = h.length == 1 ? "0" + h : h;
s = s.length == 1 ? "0" + s : s;
return h + ":" + s;
};
const s_to_h = (s) => {
//计算分钟
//算法:将秒数除以60,然后下舍入,既得到分钟数
var h;
h = Math.floor(s / 60);
//计算秒
//算法:取得秒%60的余数,既得到秒数
s = s % 60;
//将变量转换为字符串
h += "";
s += "";
//如果只有一位数,前面增加一个0
h = h.length == 1 ? "0" + h : h;
s = s.length == 1 ? "0" + s : s;
return h;
};
const s_to_s = (s) => {
//计算分钟
//算法:将秒数除以60,然后下舍入,既得到分钟数
var h;
h = Math.floor(s / 60);
//计算秒
//算法:取得秒%60的余数,既得到秒数
s = s % 60;
//将变量转换为字符串
h += "";
s += "";
//如果只有一位数,前面增加一个0
h = h.length == 1 ? "0" + h : h;
s = s.length == 1 ? "0" + s : s;
return s;
};
// 分秒转换成秒
const minSecToS = (minSecStr) => {
if (!minSecStr) return 0;
let strArr = minSecStr.split(":");
console.info(strArr, 'strArr')
return strArr.length ? parseInt(strArr[0]) * 60 + parseInt(strArr[1]) : 0;
}
// 将字符串转换成ArrayBufer
const string2buffer = (str) => {
let val = "";
if (!str) return;
let length = str.length;
let index = 0;
let array = [];
while (index < length) {
array.push(str.substring(index, index + 2));
index = index + 2;
}
val = array.join(",");
// 将16进制转化为ArrayBuffer
return new Uint8Array(
val.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16);
})
).buffer;
};
const checkEnd = (str) => {
let itotal = 0,
len = str.length,
num = 0;
while (num < len) {
let s = str.substring(num, num + 2);
itotal += parseInt(s, 16);
num = num + 2;
}
let mode = itotal % 256;
let shex = mode.toString(16);
let iLen = shex.length;
if (iLen < 2) {
shex = "0" + shex;
}
return shex.toUpperCase();
};
const getofflineData = () => {
//获取近7天的离线记录
let arr = [];
for (let i = 0; i <= 6; i++) {
let str1 = "dbf0a00201";
let num16 = i.toString(16).padStart("2", 0);
let str2 = ccrc8(`${str1}${num16}`);
arr.push(`${str1}${num16}${str2}de`);
}
return arr;
};
const getUpgradeData = (info) => {
//解析获取升级包更新数据
console.log(info);
let arr = [];
for (let i = 0, len = info.data.length; i < len; i += 480) {
arr.push({
i: info.data.slice(i, i + 480),
});
}
arr.map((item, index) => {
let num = Number(index + 1)
.toString(16)
.padStart("4", 0);
let baohaodiwei = num.substring(2, 4);
let baohaogaowei = num.substring(0, 2);
let data = `dbf0ab01F7${info.length_low.padStart('2',0)}${info.length_high.padStart('2',0)}${info.bao_low.padStart('2',0)}${
info.bao_high.padStart('2',0)
}${baohaodiwei.padStart('2',0)}${baohaogaowei.padStart('2',0)}${
index == arr.length - 1
? (arr[index].i.length / 2).toString(16).padStart("2", 0)
: "F0"
}${item.i}`;
item.i = `${data}${ccrc8(data)}de`;
});
return arr;
};
const checkEnd2 = (str) => {
const crc8_854_table = [
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
247, 182, 232, 10, 84, 215, 137, 107, 53,
];
let crc = new Uint8Array(1);
crc = 0;
for (let i = 0; i < str.length; i++) {
crc = crc8_854_table[crc ^ (str[i] & 0xff & 0xff)];
}
return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0);
};
const checkEnd3 = (str) => {
let arr = [];
for (let i = 0, len = str.length; i < len; i += 2) {
arr.push("0x" + str.slice(i, i + 2));
}
const crc8_854_table = [
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
247, 182, 232, 10, 84, 215, 137, 107, 53,
];
let crc = new Uint8Array(1);
crc = 0;
for (let i = 0; i < arr.length; i++) {
crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)];
}
return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0);
};
const chulidata = (str) => {
let data = str
.replace(/dccc/g, "dc")
.replace(/dccb/g, "db")
.replace(/dcce/g, "de");
return data;
};
const chulidata2 = (str) => {
let data = str
.replace(/DCCC/g, "dc")
.replace(/DCCB/g, "db")
.replace(/DCCE/g, "de");
return data;
};
const getimpedanceList = () => {
let arr = [];
for(let i = 1;i<=10;i++){
arr.push({
num: 0,
time: `00:${String(i).padStart('2',0)}`
})
}
return arr;
};
/**
* 处理上报数据,转换成对象
*/
const getreportData = (str) =>{
let data = {};
data.status = hex2int(str.substring(10,12));//工作状态
data.quantity = hex2int(str.substring(20,22));//电量
data.impedance1 = hex2int(str.substring(24,26));//阻抗低位数据
data.impedance2 = hex2int(str.substring(26,28));//阻抗低位数据
data.jiaoer1 = hex2int(str.substring(28,30));//每秒能量N*10 焦耳(N: 0~25.5
data.mode = hex2int(str.substring(12,14));//模式
data.position = hex2int(str.substring(14,16));//档位
//TOREAD 当模式为水份模式
if(data.mode == 6){
data.waterLevel = hex2int(str.substring(16,18))
data.waterPercent = hex2int(str.substring(18,20))
//模式为水份测试时 档位1~3对应 0x01:测试成功 0x02: 测试中 0x03: 测试错误
const testResultMap = ['TEST_UNKNOW_STATUS','TEST_SUCCESS','TEST_PROCESSING','TEST_FAIL'];
data.testResult = testResultMap[data.position]||'TEST_UNKNOW_STATUS'
}
return data;
}
/**
* height 高位
* low 低位
* 阻抗算法
* 阻抗低位数据 + 阻抗高位数据 * 256
* 如果以上公式 >=701 固定 701
* <=200 1档
* <=280 2挡
* <=360 3档
* <=440 4挡
* <=520 5挡
* <=600 6挡
* <=700 7挡
* >=701 8挡
*/
const DYNAMIC_BONES_OFFSETS = (height,low) =>{
let total = Number(low)+Number(height)*256;
if(total<=200){
return 1
}
if(total<=280){
return 2
}
if(total<=360){
return 3
}
if(total<=440){
return 4
}
if(total<=520){
return 5
}
if(total<=600){
return 6
}
if(total<=700){
return 7
}
if(total>=701){
return 8
}
}
const getTimeCode = () =>{
let year = new Date().getFullYear();
let month = String(new Date().getMonth() + 1).padStart("2", 0);
let day = String(new Date().getDate()).padStart("2", 0);
let hour = String(new Date().getHours()).padStart("2", 0);
let points = String(new Date().getMinutes()).padStart("2", 0);
let seconds = String(new Date().getSeconds()).padStart("2", 0);
let value = `dbf0a0010b${Number(String(year).substring(0, 2)).toString(16)}${Number(String(year).substring(2, 4)).toString(16)}${Number(month).toString(16).padStart("2", 0)}${Number(day).toString(16).padStart("2", 0)}${Number(hour).toString(16).padStart("2", 0)}${Number(points).toString(16).padStart("2", 0)}${Number(seconds).toString(16).padStart("2", 0)}00000000`;
value = `${value}${ccrc8(value)}de`;
return value;
}
/**
* @param currentVersionNo
* @param latestVersionNo
* @returns needToUpdate
*/
const isNeedToUpdate = (currentVersionNo,latestVersionNo)=>{
if (!currentVersionNo || !latestVersionNo) return false;
let needToUpdate = false;
//硬件版本号相同
let sameHardwareNo = latestVersionNo.substring(0, 2) == currentVersionNo.substring(0, 2);
//软件版本号当前版本比最新版的旧
let latestValue = parseInt(latestVersionNo.substring(2, 6), 16);
let currentValue = parseInt(currentVersionNo.substring(2, 6), 16);
let solftwareNoNeedToUpdate = latestValue > currentValue;
needToUpdate = sameHardwareNo && solftwareNoNeedToUpdate
return needToUpdate
}
/**
* @param compareVersion
* @returns result 1:SDKVersion > version 0:SDKVersion == version -1:SDKVersion < version
*/
const compareVersion = (version)=>{
const systemInfo = wx.getSystemInfoSync();
let SDKVersion = systemInfo.SDKVersion.split('.');
version = version.split('.');
const len = Math.max(SDKVersion.length, version.length)
while (SDKVersion.length < len) {
SDKVersion.push('0')
}
while (version.length < len) {
version.push('0')
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(SDKVersion[i])
const num2 = parseInt(version[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
/**
* @param checkSameKey
* @returns boolean
*/
const checkSameKey = (array1, array2, key)=>{
for (var i = 0; i < array1.length; i++) {
for (var j = 0; j < array2.length; j++) {
if (array1[i][key] === array2[j][key]) {
return true;
}
}
}
return false;
}
module.exports = {
isVideo,
previewImage,
formatTime,
setdata,
filertext,
formatRichText,
date,
getdates,
getYearFirstLastDay,
ab2hex,
hex2int,
filterData,
ccrc8, //crc8校验位
string2buffer, //将字符串转换成ArrayBufer
s_to_hs, //秒转换成分秒
checkEnd, //相加和
filterBleData,
getofflineData,
getUpgradeData,
keywordTofilter,
checkEnd2,
checkEnd3,
chulidata,
chulidata2,
getimpedanceList,
DYNAMIC_BONES_OFFSETS, //阻抗获取值
getreportData, //解析上报数据
s_to_h,
s_to_s,
minSecToS,
getTimeCode, //同步时间指令
isNeedToUpdate,
compareVersion,
checkSameKey
};