@jiabaida/tools 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core/BleApiManager.js +1 -1
- package/dist/cjs/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdDD.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/readAndSetParam.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis.js +1 -0
- package/dist/cjs/core/BleDataProcess.js +1 -0
- package/dist/cjs/core/OtaUpgrade.js +1 -0
- package/dist/cjs/core/TelinkApi.js +1 -0
- package/dist/cjs/core/Transfer.js +1 -0
- package/dist/cjs/core/commonfun.js +1 -1
- package/dist/cjs/core/dataJson/baseParamsJson.js +1 -0
- package/dist/cjs/core/keyAndPwdManager.js +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/esm/core/BleApiManager.js +1 -1
- package/dist/esm/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdDD.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/readAndSetParam.js +1 -0
- package/dist/esm/core/BleCmdAnalysis.js +1 -0
- package/dist/esm/core/BleDataProcess.js +1 -0
- package/dist/esm/core/OtaUpgrade.js +1 -0
- package/dist/esm/core/TelinkApi.js +1 -0
- package/dist/esm/core/Transfer.js +1 -0
- package/dist/esm/core/commonfun.js +1 -1
- package/dist/esm/core/dataJson/baseParamsJson.js +1 -0
- package/dist/esm/core/keyAndPwdManager.js +1 -0
- package/dist/esm/index.js +1 -1
- package/package.json +13 -3
- package/src/core/BleApiManager.js +487 -0
- package/src/core/BleCmdAnalysis/BaseParamProtocol.js +651 -0
- package/src/core/BleCmdAnalysis/BleCmdAnalysis.js +220 -0
- package/src/core/BleCmdAnalysis/BleCmdDD.js +1214 -0
- package/src/core/BleCmdAnalysis/BleCmdDDA4.js +762 -0
- package/src/core/BleCmdAnalysis/BleCmdFFAA.js +407 -0
- package/src/core/BleCmdAnalysis/BleCmdHVES.js +1222 -0
- package/src/core/BleCmdAnalysis/ESHostProtocol.js +829 -0
- package/src/core/BleCmdAnalysis/index.js +7 -0
- package/src/core/BleCmdAnalysis/readAndSetParam.js +288 -0
- package/src/core/BleDataProcess.js +355 -0
- package/src/core/OtaUpgrade.js +338 -0
- package/src/core/TelinkApi.js +73 -0
- package/src/core/Transfer.js +516 -0
- package/src/core/array.js +10 -0
- package/src/core/commonfun.js +84 -0
- package/src/core/dataJson/baseParamsJson.js +754 -0
- package/src/core/dataJson/index.js +1 -0
- package/src/core/keyAndPwdManager.js +346 -0
- package/src/core/mqttServer.js +296 -0
- package/src/core/rsaEncrypt.js +45 -0
- package/src/index.js +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getSysParamCmd}from"./readAndSetParam.js";import{decimalToHex,hexToDecimal}from"../BleDataProcess.js";import{systemJson,funcAndTempFuncJson,capVolInfoJson,equalizerFunJson,tempInfoJson,currentInfoJson,voltageInfoJson,capInfoJson,batteryInfoJson,funcJson,tempFuncJson}from"../dataJson/baseParamsJson.js";import{getProtectCountCmd,enterFactory,readExistFactory}from"./BleCmdDD.js";function format(value,n=1,offset=0,scope=0){if(!value)return null;value=value.map(el=>{const hexValue=decimalToHex(el);return console.log("el: ------------",hexValue),hexValue});const v=parseInt(value.join(""),16)*n+offset;if(null==scope)return v;const formatted=v.toFixed(scope);return Number(formatted)}function formatTemp(arr){if(!arr)return null;let string="0x"+toHexString(arr),value=parseInt(string,16);return value=(value-2731)/10,Number(value)}function formatBinary(arr){if(!arr)return null;return arr.map(num=>num.toString(2).padStart(8,"0")).join("").split("").map(Number).reverse()}const sendCmdSeq=async(datasInfo,chipType,deviceId,params)=>{let index=0;for(chipType||await enterFactory(deviceId);index<params.length;){const item=params[index];try{const basedata=await getSysParamCmd(chipType,deviceId,item,!1);datasInfo[item.key]=basedata,index++}catch(error){console.error(`获取参数 ${item.key} 失败:`,error),index++}}chipType||await readExistFactory(deviceId)};let crsDivisor=.1;const getBaseParams=async(chipType,deviceData,index,paramObj)=>{console.log("chipType: ",chipType);const deviceId=deviceData?.deviceId,protocolVersion=deviceData?.protocolVersion||"00";console.warn("protocolVersion: ",protocolVersion);const v=hexToDecimal(protocolVersion);(2==v||v>=20&&v<80)&&(crsDivisor=.01),console.log("v: ",v);try{let dataInfo={};switch(index){case 1:let datasInfo1={};return await sendCmdSeq(datasInfo1,chipType,deviceId,batteryInfoJson),dataInfo=getBaseInfo(datasInfo1),dataInfo;case 2:let datasInfo2={};if(chipType){const capData=await getSysParamCmd(chipType,deviceId,{...capInfoJson[0],paramLength:4});console.warn("capData: ",capData),datasInfo2.normCap=capData?.slice(0,2),datasInfo2.cycleCap=capData?.slice(2,4);const capData2=await getSysParamCmd(chipType,deviceId,capInfoJson[2]);datasInfo2.fullCap=capData2?.slice(0,2)}else await sendCmdSeq(datasInfo2,chipType,deviceId,capInfoJson);return dataInfo=getCapInfo(datasInfo2),dataInfo;case 3:let datasInfo3={};if(chipType){let vindex=voltageInfoJson.findIndex(el=>16==el.paramNo);console.log("vindex: ------------",vindex);let vindex1=voltageInfoJson.findIndex(el=>48==el.paramNo),vindex2=voltageInfoJson.findIndex(el=>38==el.paramNo);const voltageData=await getSysParamCmd(chipType,deviceId,{...voltageInfoJson[vindex],paramLength:16}),voltageData1=await getSysParamCmd(chipType,deviceId,{...voltageInfoJson[vindex1],paramLength:8}),voltageData2=await getSysParamCmd(chipType,deviceId,{...voltageInfoJson[vindex2],paramLength:4});console.log("voltageData: ",voltageData),datasInfo3.allOvervoltageProtect=voltageData?.slice(0,2),datasInfo3.allOverpressureRecovery=voltageData?.slice(2,4),datasInfo3.allLowvoltageProtect=voltageData?.slice(4,6),datasInfo3.allLowvoltageRecover=voltageData?.slice(6,8),datasInfo3.singleOvervoltageProtect=voltageData?.slice(8,10),datasInfo3.singleOverpressureRecovery=voltageData?.slice(10,12),datasInfo3.singleLowvoltageProtect=voltageData?.slice(12,14),datasInfo3.singleLowvoltageRecover=voltageData?.slice(14,16),datasInfo3.allLowvoltageDelay=voltageData1?.slice(0,2),datasInfo3.allOverpressureDelay=voltageData1?.slice(2,4),datasInfo3.singleLowvoltageDelayed=voltageData1?.slice(4,6),datasInfo3.singleOverpressureDelay=voltageData1?.slice(6,8),datasInfo3.hardwareOV=voltageData2?.slice(0,2),datasInfo3.hardwareUV=voltageData2?.slice(2,4)}else await sendCmdSeq(datasInfo3,chipType,deviceId,voltageInfoJson);return dataInfo=getVoltageInfo(datasInfo3,chipType),dataInfo;case 4:let datasInfo4={};if(chipType){let cindex=currentInfoJson.findIndex(el=>24==el.paramNo),cindex1=currentInfoJson.findIndex(el=>52==el.paramNo),cindex2=currentInfoJson.findIndex(el=>40==el.paramNo);const currentData=await getSysParamCmd(chipType,deviceId,{...currentInfoJson[cindex],paramLength:4}),currentData1=await getSysParamCmd(chipType,deviceId,{...currentInfoJson[cindex1],paramLength:8}),currentData2=await getSysParamCmd(chipType,deviceId,{...currentInfoJson[cindex2],paramLength:8});console.log("currentData: ",currentData),datasInfo4.occhg=currentData?.slice(0,2),datasInfo4.dischargeOvercurrentProtect=currentData?.slice(2,4),datasInfo4.chargeOvercurrentDelay=currentData1?.slice(0,2),datasInfo4.chargeOvercurrentRecoverDelay=currentData1?.slice(2,4),datasInfo4.dischargeOvercurrentDelay=currentData1?.slice(4,6),datasInfo4.dischargeOvercurrentRecoverDelay=currentData1?.slice(6,8),datasInfo4.level2OvercurrentProtect=currentData2?.slice(0,2),datasInfo4.level2OvercurrentProtectV=currentData2?.slice(2,4),datasInfo4.shortcircuiProtectRecoverDelay=currentData2?.slice(6,8)}else await sendCmdSeq(datasInfo4,chipType,deviceId,currentInfoJson);return dataInfo=getCurrentInfo(datasInfo4,chipType),dataInfo;case 5:let datasInfo5={};if(chipType){let tindex=tempInfoJson.findIndex(el=>8==el.paramNo),tindex1=tempInfoJson.findIndex(el=>44==el.paramNo);const tempData=await getSysParamCmd(chipType,deviceId,{...tempInfoJson[tindex],paramLength:16}),tempData1=await getSysParamCmd(chipType,deviceId,{...tempInfoJson[tindex1],paramLength:8});console.log("tempData: ",tempData),datasInfo5.chargeHightempProtect=tempData?.slice(0,2),datasInfo5.chargeHightempRecover=tempData?.slice(2,4),datasInfo5.chargeLowtempProtect=tempData?.slice(4,6),datasInfo5.chargeLowtempRecover=tempData?.slice(6,8),datasInfo5.dischargingHightempProtect=tempData?.slice(8,10),datasInfo5.dischargingHightempRecover=tempData?.slice(10,12),datasInfo5.dischargingLowtempProtect=tempData?.slice(12,14),datasInfo5.dischargingLowtempRecover=tempData?.slice(14,16),datasInfo5.chargeLowtempDelay=tempData1?.slice(0,2),datasInfo5.chargeHightempDelay=tempData1?.slice(2,4),datasInfo5.dischargingLowtempDelay=tempData1?.slice(4,6),datasInfo5.dischargingHightempDelay=tempData1?.slice(6,8)}else await sendCmdSeq(datasInfo5,chipType,deviceId,tempInfoJson);return dataInfo=getTempInfo(datasInfo5,chipType),dataInfo;case 6:let datasInfo6={};if(chipType){const equalizerFunData=await getSysParamCmd(chipType,deviceId,{...equalizerFunJson[0],paramLength:4});console.log("equalizerFunData: ",equalizerFunData),datasInfo6.equalizingVoltage=equalizerFunData?.slice(0,2),datasInfo6.accuracyEqualization=equalizerFunData?.slice(2,4)}else await sendCmdSeq(datasInfo6,chipType,deviceId,equalizerFunJson);return dataInfo=getEqualizerFunInfo(datasInfo6),dataInfo;case 7:let datasInfo7={};if(chipType){let capVolIndex=capVolInfoJson.findIndex(el=>34==el.paramNo),capVolIndex1=capVolInfoJson.findIndex(el=>106==el.paramNo);const capVolInfoData=await getSysParamCmd(chipType,deviceId,{...capVolInfoJson[0],paramLength:4}),capVolInfoData1=await getSysParamCmd(chipType,deviceId,{...capVolInfoJson[capVolIndex],paramLength:8}),capVolInfoData2=await getSysParamCmd(chipType,deviceId,{...capVolInfoJson[capVolIndex1],paramLength:12});console.log("capVolInfoData: ",capVolInfoData),datasInfo7.fullVolt=capVolInfoData?.slice(0,2),datasInfo7.emptyVolt=capVolInfoData?.slice(2,4),datasInfo7.voltage80p=capVolInfoData1?.slice(0,2),datasInfo7.voltage60p=capVolInfoData1?.slice(2,4),datasInfo7.voltage40p=capVolInfoData1?.slice(4,6),datasInfo7.voltage20p=capVolInfoData1?.slice(6,8),datasInfo7.voltage90p=capVolInfoData2?.slice(0,2),datasInfo7.voltage70p=capVolInfoData2?.slice(2,4),datasInfo7.voltage50p=capVolInfoData2?.slice(4,6),datasInfo7.voltage30p=capVolInfoData2?.slice(6,8),datasInfo7.voltage10p=capVolInfoData2?.slice(8,10),datasInfo7.voltage100p=capVolInfoData2?.slice(10,12)}else await sendCmdSeq(datasInfo7,chipType,deviceId,capVolInfoJson);return dataInfo=getcapVolInfoInfo(datasInfo7,chipType),dataInfo;case 9:let datasInfo9={};if(chipType){const funcAndTempFuncData=await getSysParamCmd(chipType,deviceId,{...funcAndTempFuncJson[0],paramLength:4});console.log("funcAndTempFuncData: ",funcAndTempFuncData),datasInfo9.func=funcAndTempFuncData?.slice(0,2),datasInfo9.tempFunc=funcAndTempFuncData?.slice(2,4)}else await sendCmdSeq(datasInfo9,chipType,deviceId,funcAndTempFuncJson);return dataInfo=getFuncAndTempFuncInfo(datasInfo9),dataInfo;case 10:let datasInfo10={};return await sendCmdSeq(datasInfo10,chipType,deviceId,systemJson),dataInfo=getSystemInfo(datasInfo10),dataInfo;case 11:const counts=await getProtectCountCmd(deviceId);return console.log("counts: ",counts),counts;default:if(!paramObj)return null;let defaultDataInfo={};const onedata=await getSysParamCmd(chipType,deviceId,paramObj);return defaultDataInfo[paramObj.key]=onedata?.slice(0,2),defaultDataInfo}}catch(error){throw console.error("error: 读系统参数报错 getBaseParams",error),error}},getResistance=async(chipType,deviceId)=>{try{const rsnsValue=await getSysParamCmd(chipType,deviceId,systemJson[2]);return format(rsnsValue,crsDivisor,0,2)}catch(error){throw console.error("error: 读检流阻值报错 getResistance",error),error}},getBaseInfo=async datas=>{try{console.log("datas: ",datas);const barCode=getCharCodeConnect(datas?.barCode),manufacturer=getCharCodeConnect(datas?.manufacturer),model=getCharCodeConnect(datas?.model),bmsModel=getCharCodeConnect(datas?.bmsModel,!0),producedDate=function(content){if(!content)return null;let arr=content.splice(0,2),string="0x";return arr.forEach(el=>{string+=decimalToHex(el)}),console.log(string,"string日期"),`${2e3+(string>>9)}-${string>>5&15}-${31&string}`}(datas?.producedDate);return{barCode:barCode,manufacturer:manufacturer,model:model,bmsModel:bmsModel,producedDate:producedDate,bmsAddr:function(content){if(!content)return null;return console.log(content,"content======"),toHexString(content.splice(0,12))}(datas?.bmsAddr)}}catch(error){console.error("error: ",error)}},getCharCodeConnect=(content,clearZero=!1)=>{if(console.log("content: ---------------",content),!content)return null;const length=content[0];let arr=content.splice(1,length);if(clearZero)for(;0===arr[arr.length-1];)arr.pop();return console.log("arr: -------------------",arr),String.fromCharCode(...arr)};function toHexString(arr){let string="";return arr.forEach(el=>{string+=decimalToHex(el)}),string}const getCapInfo=async datas=>{console.log("datas: ",datas);return{normCap:format(datas.normCap,.01,0,2),cycleCap:format(datas.cycleCap,.01,0,2),fullCap:format(datas.fullCap,.01,0,2)}},getVoltageInfo=async(datas,chipType)=>{console.log("datas: ",datas);const allOvervoltageProtect=format(datas.allOvervoltageProtect,.01,0,3),allOverpressureRecovery=format(datas.allOverpressureRecovery,.01,0,3),allLowvoltageProtect=format(datas.allLowvoltageProtect,.01,0,3),allLowvoltageRecover=format(datas.allLowvoltageRecover,.01,0,3),singleOvervoltageProtect=format(datas.singleOvervoltageProtect,.001,0,3),singleOverpressureRecovery=format(datas.singleOverpressureRecovery,.001,0,3),singleLowvoltageProtect=format(datas.singleLowvoltageProtect,.001,0,3),singleLowvoltageRecover=format(datas.singleLowvoltageRecover,.001,0,3),hardwareOV=format(datas.hardwareOV,.001,0,3),hardwareUV=format(datas.hardwareUV,.001,0,3);let singleOverpressureDelay=null,singleLowvoltageDelayed=null,allLowvoltageDelay=null,allOverpressureDelay=null;return chipType?(singleOverpressureDelay=format(datas.singleOverpressureDelay,1),singleLowvoltageDelayed=format(datas.singleLowvoltageDelayed,1),allLowvoltageDelay=format(datas.allLowvoltageDelay,1),allOverpressureDelay=format(datas.allOverpressureDelay,1)):(singleLowvoltageDelayed=datas.singleLowvoltageDelayed[0],singleOverpressureDelay=datas.singleLowvoltageDelayed[1],allLowvoltageDelay=datas.allLowvoltageDelay[0],allOverpressureDelay=datas.allLowvoltageDelay[1]),{allOvervoltageProtect:allOvervoltageProtect,allOverpressureRecovery:allOverpressureRecovery,allLowvoltageProtect:allLowvoltageProtect,allLowvoltageRecover:allLowvoltageRecover,singleOvervoltageProtect:singleOvervoltageProtect,singleOverpressureRecovery:singleOverpressureRecovery,singleLowvoltageProtect:singleLowvoltageProtect,singleLowvoltageRecover:singleLowvoltageRecover,singleOverpressureDelay:singleOverpressureDelay,singleLowvoltageDelayed:singleLowvoltageDelayed,hardwareOV:hardwareOV,hardwareUV:hardwareUV,allLowvoltageDelay:allLowvoltageDelay,allOverpressureDelay:allOverpressureDelay}},getCurrentInfo=async(datas,chipType)=>{console.log("datas: ",datas);const occhg=format(datas.occhg,.01,0,3),dischargeOvercurrentProtect=(datas.dischargeOvercurrentProtect||0==datas.dischargeOvercurrentProtect)&&.01*(format(datas.dischargeOvercurrentProtect,1,0,3)-65536);let chargeOvercurrentDelay=null,chargeOvercurrentRecoverDelay=null,dischargeOvercurrentDelay=null,dischargeOvercurrentRecoverDelay=null,shortcircuiProtectRecoverDelay=null,leve2OvercurrentDelay=0,level2OvercurrentProtect=0,shortcircuiProtect=0,shortcircuiProtectDelay=0,level2OvercurrentProtectV=null,overAndUnderDelay=0;return chipType?(chargeOvercurrentDelay=format(datas.chargeOvercurrentDelay,1),chargeOvercurrentRecoverDelay=format(datas.chargeOvercurrentRecoverDelay,1),dischargeOvercurrentDelay=format(datas.dischargeOvercurrentDelay,1),dischargeOvercurrentRecoverDelay=format(datas.dischargeOvercurrentRecoverDelay,1),shortcircuiProtectRecoverDelay=format(datas.shortcircuiProtectRecoverDelay,1),level2OvercurrentProtect=getNewProtectAndDelay(datas.level2OvercurrentProtect).value1,leve2OvercurrentDelay=getNewProtectAndDelay(datas.level2OvercurrentProtect).value2,shortcircuiProtect=getNewProtectAndDelay(datas.level2OvercurrentProtectV).value1,shortcircuiProtectDelay=getNewProtectAndDelay(datas.level2OvercurrentProtectV).value2):(chargeOvercurrentDelay=datas.chargeOvercurrentDelay[0],chargeOvercurrentRecoverDelay=datas.chargeOvercurrentDelay[1],dischargeOvercurrentDelay=datas.dischargeOvercurrentDelay[0],dischargeOvercurrentRecoverDelay=datas.dischargeOvercurrentDelay[1],overAndUnderDelay=datas.shortcircuiProtectRecoverDelay[0],shortcircuiProtectRecoverDelay=datas.shortcircuiProtectRecoverDelay[1],level2OvercurrentProtectV=getOldProtectAndDelay(datas.level2OvercurrentProtect).double,shortcircuiProtect=getOldProtectAndDelay(datas.level2OvercurrentProtect).value1,shortcircuiProtectDelay=getOldProtectAndDelay(datas.level2OvercurrentProtect).value2,level2OvercurrentProtect=getOldProtectAndDelay(datas.level2OvercurrentProtect).value3,leve2OvercurrentDelay=getOldProtectAndDelay(datas.level2OvercurrentProtect).value4),{occhg:occhg,dischargeOvercurrentProtect:dischargeOvercurrentProtect,chargeOvercurrentDelay:chargeOvercurrentDelay,chargeOvercurrentRecoverDelay:chargeOvercurrentRecoverDelay,dischargeOvercurrentDelay:dischargeOvercurrentDelay,dischargeOvercurrentRecoverDelay:dischargeOvercurrentRecoverDelay,leve2OvercurrentDelay:leve2OvercurrentDelay,level2OvercurrentProtectV:level2OvercurrentProtectV,shortcircuiProtectRecoverDelay:shortcircuiProtectRecoverDelay,shortcircuiProtect:shortcircuiProtect,shortcircuiProtectDelay:shortcircuiProtectDelay,level2OvercurrentProtect:level2OvercurrentProtect,overAndUnderDelay:overAndUnderDelay}};function getNewProtectAndDelay(arr){if(2!==arr?.length)return{value1:0,value2:0};let resultArray=arr.map(num=>num.toString(2).padStart(8,"0")).join("").split("").map(Number),arr1=resultArray.slice(8,12),arr2=resultArray.slice(12);return{value1:parseInt(arr1.join(""),2),value2:parseInt(arr2.join(""),2)}}function getOldProtectAndDelay(arr){if(2!==arr?.length)return{double:!1,value1:0,value2:0,value3:0,value4:0};const binaryString=arr.map(num=>num.toString(2).padStart(8,"0")).join("");console.log("【解析硬件过流及短路】",binaryString);const resultArray=binaryString.split("").map(Number),arr1=[0,...resultArray.slice(5,8)],arr2=resultArray.slice(1,5),arr3=resultArray.slice(12),arr4=resultArray.slice(8,12),value1=parseInt(arr1.join(""),2),value2=parseInt(arr2.join(""),2),value3=parseInt(arr3.join(""),2),value4=parseInt(arr4.join(""),2);return{double:1===resultArray[0],value1:value1,value2:value2,value3:value3,value4:value4}}const getTempInfo=(datas,chipType)=>{console.log("datas: ",datas);const chargeHightempProtect=formatTemp(datas.chargeHightempProtect),chargeHightempRecover=formatTemp(datas.chargeHightempRecover),chargeLowtempProtect=formatTemp(datas.chargeLowtempProtect),chargeLowtempRecover=formatTemp(datas.chargeLowtempRecover),dischargingHightempProtect=formatTemp(datas.dischargingHightempProtect),dischargingHightempRecover=formatTemp(datas.dischargingHightempRecover),dischargingLowtempProtect=formatTemp(datas.dischargingLowtempProtect),dischargingLowtempRecover=formatTemp(datas.dischargingLowtempRecover);let chargeHightempDelay=null,chargeLowtempDelay=null,dischargingHightempDelay=null,dischargingLowtempDelay=null;return chipType?(chargeHightempDelay=format(datas.chargeHightempDelay,1),chargeLowtempDelay=format(datas.chargeLowtempDelay,1),dischargingHightempDelay=format(datas.dischargingHightempDelay,1),dischargingLowtempDelay=format(datas.dischargingLowtempDelay,1)):(chargeHightempDelay=datas.chargeLowtempDelay[1],chargeLowtempDelay=datas.chargeLowtempDelay[0],dischargingHightempDelay=datas.dischargingLowtempDelay[1],dischargingLowtempDelay=datas.dischargingLowtempDelay[0]),{chargeHightempProtect:chargeHightempProtect,chargeHightempRecover:chargeHightempRecover,chargeLowtempProtect:chargeLowtempProtect,chargeLowtempRecover:chargeLowtempRecover,dischargingHightempProtect:dischargingHightempProtect,dischargingHightempRecover:dischargingHightempRecover,dischargingLowtempProtect:dischargingLowtempProtect,dischargingLowtempRecover:dischargingLowtempRecover,chargeHightempDelay:chargeHightempDelay,chargeLowtempDelay:chargeLowtempDelay,dischargingHightempDelay:dischargingHightempDelay,dischargingLowtempDelay:dischargingLowtempDelay}},getEqualizerFunInfo=datas=>({equalizingVoltage:format(datas.equalizingVoltage,.001,0,3),accuracyEqualization:format(datas.accuracyEqualization,1,0,2)}),getcapVolInfoInfo=datas=>({fullVolt:format(datas.fullVolt,.001,0,3),emptyVolt:format(datas.emptyVolt,.001,0,3),voltage10p:format(datas.voltage10p,.001,0,3),voltage20p:format(datas.voltage20p,.001,0,3),voltage30p:format(datas.voltage30p,.001,0,3),voltage40p:format(datas.voltage40p,.001,0,3),voltage50p:format(datas.voltage50p,.001,0,3),voltage60p:format(datas.voltage60p,.001,0,3),voltage70p:format(datas.voltage70p,.001,0,3),voltage80p:format(datas.voltage80p,.001,0,3),voltage90p:format(datas.voltage90p,.001,0,3),voltage100p:format(datas.voltage100p,.001,0,3)}),getFuncAndTempFuncInfo=datas=>{const binaryFuncArr=formatBinary(datas.func),binaryTempArr=formatBinary(datas.tempFunc),func={};funcJson.forEach((item,index)=>{item.key&&(func[item.key]=binaryFuncArr[index])});const tempFunc={};return tempFuncJson.forEach((item,index)=>{item.key&&(tempFunc[item.key]=binaryTempArr[index])}),{func:func,tempFunc:tempFunc}},getSystemInfo=datas=>({serialNumber:format(datas.serialNumber,1),cycleCount:format(datas.cycleCount,1),strCount:format(datas.strCount,1),rsnsValue:format(datas.rsnsValue,crsDivisor,0,2)});export{getBaseInfo,getBaseParams,getResistance};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{hexArr2ab,ab2decimalArr,hexArr2string,sleep}from"../BleDataProcess.js";import{eventBus,getOS}from"../commonfun.js";async function _writeAsync(deviceId,value){return console.log("deviceId, value: ",deviceId,value),!(!deviceId||!value)&&new Promise(resolve=>{const{isAndroid:isAndroid,isIOS:isIOS}=getOS();console.log("isAndroid, isIOS: ",isAndroid,isIOS);const writeType=isAndroid?"writeNoResponse":"write";uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:"0000FF00-0000-1000-8000-00805F9B34FB",characteristicId:"0000FF02-0000-1000-8000-00805F9B34FB",writeType:writeType,value:value,success:res=>{console.error("res: 写入成功",res),resolve(!0)},fail:e=>{console.error("写入失败",e),resolve(!1)}}),isIOS&&setTimeout(()=>resolve(!0),50)})}const getData=async(deviceId,{command:command,commandVerifyHandler:commandVerifyHandler=hexArr=>({verified:!1,pkgLen:null}),pkgVerifyHandler:pkgVerifyHandler=pkg=>({verified:!1}),maxRetries:maxRetries=2,retryInterval:retryInterval=300},tag="")=>{if(!deviceId)throw new Error("deviceId is required");if(!command||command.length<=0)throw new Error("command is required");return new Promise((resolve,reject)=>{let isCompleted=!1,timeoutId=null,responsed=!1,len=null,pkg=[];const cmdContent=hexArr2ab(command),cleanup=()=>{isCompleted||(isCompleted=!0,clearTimeout(timeoutId),eventBus.off("setBleChangedCharacteristicValue",dataHandler))},dataHandler=payload=>{if(!payload||payload.deviceId!==deviceId||!payload.value)return;const hexArr=ab2decimalArr(payload.value);if(console.log("hexArr: ",hexArr),console.warn(tag,"接收到数据:",hexArr2string(hexArr)),0!==hexArr.length){if(null===len){const{verified:verified,pkgLen:pkgLen}=commandVerifyHandler(hexArr);console.log("指令验证结果:",{verified:verified,pkgLen:pkgLen}),verified&&(len=pkgLen)}if(len){if(pkg=[...pkg,...hexArr],console.log("当前数据包:",pkg,`长度: ${pkg.length}/${len}`),pkg.length>=len){pkg=pkg.slice(0,len);const{verified:verified}=pkgVerifyHandler(pkg);console.log("数据包验证结果:",{verified:verified}),verified?(responsed=!0,cleanup(),resolve([...pkg])):(len=null,pkg=[])}}else pkg=[]}},writeToDevice=async(attempt=1)=>{try{console.warn(tag,`第${attempt}次写入指令:`,command.join("").replace(/0x/g,"").toUpperCase());const writeSucceed=await async function(deviceId,value){return console.log("value: ",value),console.log("deviceId: ",deviceId),!(!deviceId||!value)&&new Promise(async resolve=>{const n=Math.ceil(value.byteLength/20);let res;for(let i=0;i<n;i++){const _value=value.slice(20*i,20*(i+1));if(console.log("分包写入_value: ",_value),await sleep(150),res=await _writeAsync(deviceId,_value),console.log(`分包写入结果 ${i+1}/${n} : ${res}`),!res)return resolve(!1)}resolve(res)})}(deviceId,cmdContent);if(console.warn(tag,`第${attempt}次写入结果:`,writeSucceed?"成功":"失败"),!writeSucceed)return void(attempt<maxRetries?setTimeout(()=>writeToDevice(attempt+1),retryInterval):(cleanup(),resolve(null)));await sleep(retryInterval),!responsed&&attempt<maxRetries?(console.log(tag,`未收到响应,准备第${attempt+1}次重试`),writeToDevice(attempt+1)):responsed||(console.warn(tag,`达到最大重试次数(${maxRetries}),未收到响应`),cleanup(),resolve(null))}catch(error){console.error(tag,"写入过程发生错误:",error),cleanup(),reject(error)}};timeoutId=setTimeout(()=>{console.warn(tag,"操作超时"),cleanup(),resolve(null)},(maxRetries+2)*retryInterval),eventBus.on("setBleChangedCharacteristicValue",dataHandler),writeToDevice().catch(error=>{cleanup(),reject(error)})})},setMTUAsync=(deviceId,mtu=512,delay=2500)=>new Promise((resolve,reject)=>{try{if(getOS().isIOS)return resolve(!0);setTimeout(async()=>{await uni.setBLEMTU({deviceId:deviceId,mtu:mtu}),resolve(!0)},delay)}catch(error){console.error(error),reject(error)}});export{getData,setMTUAsync};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getData}from"./BleCmdAnalysis.js";import{hexArr2string,hex2string,decimalToHex,generateCrc16modbusCheck,hexArr2Assic,generateCrcCheckSum,hexToDecimal,stringToTwoHexArray}from"../BleDataProcess.js";import{getFFAA80Async,resolveFFAA80}from"./BleCmdFFAA.js";const enterFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A00025678FF3077"),existFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A01022828ffad77"),readExistFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A01020000FFFD77"),set_PlanCMD_DD=async(deviceId,command)=>{"string"==typeof command&&(command=command.match(/(.{2})/g).map(o=>`0x${o}`));let result=null;try{const data=await getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"PlanCMD_DD");if(data){const dataStr=hexArr2string(data),content=data.slice(4,data.length-3);result={data:data,dataStr:dataStr,status:hex2string(data[2]),len:data[3],content:content}}else result={status:0,content:[]}}catch(error){console.error(error)}return result},set_PlanCMD_3B3C=async(deviceId,command)=>{"string"==typeof command&&(command=command.match(/(.{2})/g).map(o=>`0x${o}`));let result=null;try{const data=await getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:59==hexArr[0]&&60==hexArr[1],pkgLen:hexArr[11]+15}),pkgVerifyHandler:pkg=>({verified:!0})},"PlanCMD_3B3C");if(data){const dataStr=hexArr2string(data),content=data.slice(12,data.length-3);result={dataStr:dataStr,status:128==data[10]?1:0,addr:hexArr2string(data.slice(2,10)),content:content}}}catch(error){console.error(error)}return result},get3B3CAsync=async deviceId=>{const addressCode=["0x00","0x00","0x00","0x00","0x00","0x00","0x00","0x00"],commandCode=["0x01"],data=[],dataLength=[`0x${decimalToHex(data.length,2)}`],check=generateCrc16modbusCheck([...addressCode,...commandCode,...dataLength,...data],!1),command=["0x3b","0x3c",...addressCode,...commandCode,...dataLength,...data,...check,"0x0d"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:59==hexArr[0]&&60==hexArr[1],pkgLen:hexArr[11]+15}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrc16modbusCheck(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"3B3C")},resolve3B3C=data=>{if(!data)return null;let result={dataStr:hexArr2string(data),status:hex2string(data[10]),addr:hexArr2string(data.slice(2,10))};const content=data.slice(12,data.length-3);for(;content.length>0;){const[v1,v2,...v]=content.splice(0,content[1]+2);if(1==v1&&(result.productFlag=hex2string(v1),result.productLen=v2,v)){const[productType,frontType,protocolV,level]=v.map(o=>hex2string(o));Object.assign(result,{productType:productType,frontType:frontType,protocolV:protocolV,level:level})}2==v1&&(result.hardwareFlag=hex2string(v1),result.hardwareLen=v2,result.hardwareV=hexArr2Assic(v)),3==v1&&(result.sofewareFlag=hex2string(v1),result.sofewareLen=v2,result.sofewareV=hexArr2Assic(v)),4==v1&&(result.pcbFlag=hex2string(v1),result.pcbLen=v2,result.pcbContent=hexArr2Assic(v))}return result},getDDA503Async=async deviceId=>{const hex=await getData(deviceId,{command:["0xdd","0xa5","0x03","0x00","0xff","0xfd","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&3==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_03");return hex?resolveDDA503(hex):null},resolveDDA503=data=>{if(!data)return null;const cmdResp03=hexArr2string(data),content=data.slice(4,data.length-3),binArr=data[24].toString(2).padStart(8,"0").split("").reverse(),balances=data.slice(16,20).flatMap(byte=>byte.toString(2).padStart(8,"0").split("").reverse());console.warn("BC: ---------------",balances);const fet=data[24],chargeSwitch=!!Number(binArr[0]),dischargeSwitch=!!Number(binArr[1]),BMSVersion=decimalToHex(data[22]),humidityIndex=2*data[26]+27,humidity=data[humidityIndex],n=Number(binArr[7])||136==humidity?10:100,totalVoltage=Number((((data[4]<<8)+(255&data[5]))/100).toFixed(2));let current=(data[6]<<8)+(255&data[7]);current=current>32768?(current-65536)/n:current/n;const electricity=Number(current.toFixed(2)),power=Number((totalVoltage*electricity).toFixed(2)),soc=data[23]??0,seriesNum=data[25]??0,volumeHex=decimalToHex(data[8])+decimalToHex(data[9]),surplusCapacity=Number((hexToDecimal(volumeHex)/n).toFixed(2)),normCapHex=decimalToHex(data[10])+decimalToHex(data[11]),normCap=Number((hexToDecimal(normCapHex)/n).toFixed(2)),cycleHex=decimalToHex(data[12])+decimalToHex(data[13]),cycleIndex=hexToDecimal(cycleHex),fccHex=decimalToHex(data[humidityIndex+3])+decimalToHex(data[humidityIndex+4]),fullChargeCapacity=Number((hexToDecimal(fccHex)/n).toFixed(2)),SOH=cycleIndex<=100?100:Math.min(100,fullChargeCapacity/normCap*100),heatingState=!!Number(binArr[4])||!!Number(binArr[3]);let heatingCurrent=null;const hasHeatingCurrent=data[3]+7>=humidityIndex+9+4+1,hasEquilCurrent=data[3]+7>=humidityIndex+7+4+1;if(heatingState&&hasHeatingCurrent){const i=humidityIndex+9;heatingCurrent=heatingCurrent=((data[i]<<8|data[i+1])/100).toFixed(2)}let equilibriumCurrent=null;if(hasEquilCurrent){const i=humidityIndex+7;let equilCurrent=(data[i]<<8)+(255&data[i+1]);equilCurrent=equilCurrent>32768?(equilCurrent-65536)/1e3:equilCurrent/1e3,equilibriumCurrent=Number(equilCurrent.toFixed(2))}const isFactoryMode=!!Number(binArr[6]),equilibriumStatus=!(0===data[16]&&0===data[17]),protectStatus=!(0===data[20]&&0===data[21]),protectStateHex=decimalToHex(data[20])+decimalToHex(data[21]),protVal=hexToDecimal(protectStateHex);let alarmIndex=2*data[26]+28,alarmStateHex=decimalToHex(data[alarmIndex])+decimalToHex(data[alarmIndex+1]),alarmsState=hexToDecimal(alarmStateHex);const ntcNums=255&data[26],temperaturesList=Array.from({length:ntcNums},(_,i)=>((256*(255&data[26+2*i+1])+(255&data[26+2*i+2])-2731)/10).toFixed(1)),fahTempList=[];temperaturesList.forEach(el=>{const value=1.8*Number(el)+32;fahTempList.push(value.toFixed(1))});const temperatures=temperaturesList.map((item,index)=>({name:index+1,value:item}));return{cmdResp03:cmdResp03,status:hex2string(data[2]),len:data[3],softwareV:hex2string(content[18]),balances:balances,BMSVersion:BMSVersion,soc:soc,normCap:normCap,surplusCapacity:surplusCapacity,totalVoltage:totalVoltage,electricity:electricity,power:power,cycleIndex:cycleIndex,equilibriumStatus:equilibriumStatus,chargeSwitch:chargeSwitch,dischargeSwitch:dischargeSwitch,temperatures:temperatures,humidity:humidity,protectStatus:protectStatus,fullChargeCapacity:fullChargeCapacity,SOH:SOH,heatingState:heatingState,heatingCurrent:heatingCurrent,equilibriumCurrent:equilibriumCurrent,isFactoryMode:isFactoryMode,protVal:protVal,alarmsState:alarmsState,ntcNums:ntcNums,temperaturesList:temperaturesList,fahTempList:fahTempList,fet:fet,seriesNum:seriesNum}},getDDA504Async=async(deviceId,dataScope)=>{const hex=await getData(deviceId,{command:["0xdd","0xa5","0x04","0x00","0xff","0xfc","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&4==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_04");return hex?resolveDDA504(hex,dataScope):null},resolveDDA504=(data,dataScope)=>{if(console.log("data: ",data),!data)return null;const cmdResp04=hexArr2string(data),voltageList=[];for(let index=4;index<parseInt(data[3])+4;index+=2){let voltageHex=decimalToHex(data[index])+decimalToHex(data[index+1]),voltage=hexToDecimal(voltageHex);voltageList.push(Number(voltage))}let highestVoltage=null,lowestVoltage=null,averageVoltage=null,dropoutVoltage=null;if(voltageList.length>0){highestVoltage=Math.max(...voltageList),lowestVoltage=Math.min(...voltageList);averageVoltage=voltageList.reduce((acc,cur)=>acc+cur,0)/voltageList.length;const dropout=highestVoltage-lowestVoltage,precision=dataScope?3:2;highestVoltage=Number((highestVoltage/1e3).toFixed(precision)),lowestVoltage=Number((lowestVoltage/1e3).toFixed(precision)),averageVoltage=Number((averageVoltage/1e3).toFixed(precision)),dropoutVoltage=Number((dropout/1e3).toFixed(precision))}voltageList.forEach((v,i)=>{let newV=v/1e3;voltageList[i]=Number(newV.toFixed(dataScope?3:2))});const voltageSeries=voltageList.map((item,index)=>({name:index+1,value:item}));return{cmdResp04:cmdResp04,voltageList:voltageList,voltageSeries:voltageSeries,highestVoltage:highestVoltage,lowestVoltage:lowestVoltage,averageVoltage:averageVoltage,dropoutVoltage:dropoutVoltage}},getChipTypeAsync=async deviceId=>{const hex=await getData(deviceId,{command:["0xdd","0xa5","0x00","0x00","0x00","0x00","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&0==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_00");return hex?resolveDDA500(hex):null},resolveDDA500=data=>{if(!data)return null;return{dataStr:hexArr2string(data),status:hex2string(data[2]),len:data[3],type:data[5]}},getDD5AE1Async=async(deviceId,value)=>{const _command=["0xE1","0x02","0x00",value],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&225==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E1")},getDD5AFBAsync=async(deviceId,type,value)=>{const _command=["0xFB","0x02",type,value],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return console.log("command: ",command),getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&251==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_FB")},resolveBaseDD=data=>{if(!data)return null;const dataStr=hexArr2string(data),content=data.slice(4,data.length-3);return{dataStr:dataStr,status:hex2string(data[2]),len:data[3],content:content}},getDD5A0AAsync=async(deviceId,value)=>{const _command=["0x0A","0x02",...stringToTwoHexArray(value)],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return console.log("command: ",command),getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&10==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},`DD5A_0A_${value}`)},getDD5AFAAsync=async(deviceId,value)=>{const hexStr=decimalToHex(100*value,4),_command=["0xFA","0x05","0x00","0x70","0x01",...[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_FA")},getDDA505Async=async deviceId=>getData(deviceId,{command:["0xdd","0xa5","0x05","0x00","0xff","0xfb","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&5==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_05"),resolveDDA505=data=>{if(!data)return null;return{dataStr:hexArr2string(data),status:hex2string(data[2]),len:data[3],hardwareV:hexArr2Assic(data.slice(4,data.length-3))}},getDDA5FAAsync=async(deviceId,paramNo,length)=>{const _values=[...paramNo,length],_command=["0xFA",decimalToHex(_values.length),..._values],checks=generateCrcCheckSum(_command),command=["0xDD","0xA5",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"READ_DDA5_FA")},setDDA5FAAsync=async(deviceId,paramNo,valueLength,content)=>{const _values=[...paramNo,valueLength,...content],_command=["0xFA",decimalToHex(_values.length),..._values],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"SET_DDA5_FA")},resolveDDA5FA=data=>{if(!data)return null;return{dataStr:hexArr2string(data),status:hex2string(data[2]),len:data[3],type:data[5],value:data.slice(7,-3)}},getDDA5OldAsync=async(deviceId,path)=>{const values=[path,"0x00"],checks=generateCrcCheckSum(values),command=["0xDD","0xa5",...values,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==path,pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_读旧协议读参")},setDDA5OldAsync=async(deviceId,path,value,type="")=>{const values=[path,"0x02",...value],checks=generateCrcCheckSum(values),command=["0xDD","0x5A",...values,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==path,pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DDA5_写旧协议读参"+type)},getDD5AE0Async=async(deviceId,value)=>{const hex=100*value,hexStr=decimalToHex(hex,4),_values=[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`],_command=["0xE0","0x02",..._values],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return console.warn("=======CCCCCCC=SET===",{value:value,hex:hex,hexStr:hexStr,_values:_values,_command:_command,checks:checks,command:command}),getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&224==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E0")},getDD5A0EAsync=async deviceId=>getData(deviceId,{command:["0xDD","0x5A","0x0E","0x02","0x81","0x18","0xFF","0x57","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&14==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_0E_复位"),getDD5AE4Async=async deviceId=>getData(deviceId,{command:["0xdd","0x5a","0xe4","0x02","0x18","0x81","0xfe","0x81","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&228==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E4"),getDD5AAllAsync=async(deviceId,path,lengthHex,values,type)=>{const _command=[path,lengthHex,...values],checks=generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==path,pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},`DD5A_${path}_${type}`)},sendBMSAsync=async(deviceId,values)=>{const command=values.match(/[0-9a-fA-F]{2}/g)?.map(item=>`0x${item}`)||[];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==command[2],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},`DD5A_${command[2]}`)},resolveBMSCmd=data=>{if(!data)return null;return{dataStr:hexArr2string(data),status:hex2string(data[2]),len:data[3]}},getProtectCountCmd=async deviceId=>{const data=await getData(deviceId,{command:["0xdd","0xa5","0xaa","0x00","0xff","0x56","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&170==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DDA5_AA保护次数"),arr=[];for(let i=4;i<data.length-4;i+=2){const offset=i;console.log("offset",offset);let value=((255&data[offset])<<8)+(255&data[offset+1]);arr.push(value)}return arr},getDD5A17Async=async deviceId=>getData(deviceId,{command:["0xDD","0x5A","0x17","0x02","0x00","0x01","0xFF","0xE6","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&23==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_17-清除电池循环次数"),getDDA507Async=async deviceId=>getData(deviceId,{command:["0xDD","0xA5","0x07","0x00","0xFF","0xF9","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&7==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_07历史运行履历总数"),getDDA508Async=async(deviceId,i=0)=>{const _command=["0x08",`0x${i.toString(16).padStart(2,0)}`],checks=generateCrcCheckSum(_command),command=["0xDD","0xA5",..._command,...checks,"0x77"];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&8==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_08读取履历详情")},resolveProtections=binary=>{const arr=binary.split("").reverse(),map=["device.0041","device.0042","device.0043","device.0044","device.0045","device.0046","device.0047","device.0048","device.0049","device.0050","device.0051","device.0052","device.0053","device.0054","device.0055","device.00551"];let _arr=[],_indexs=[];for(let i=0;i<arr.length;i++)1==arr[i]&&(_arr.push(map[i]),_indexs.push(i));return{_arr:_arr,_indexs:_indexs}},resolveDDA508=data=>{if(!data)return null;if(!data)return null;const hexArr=data.map(o=>o.toString(16).padStart(2,"0").toUpperCase()),f=s=>parseInt(s,16),fet=data[40].toString(2).padStart(8,"0").split("").reverse(),protection=f(hexArr[23]+hexArr[22]).toString(2).padStart(16,"0"),n=Number(fet[7])?10:100;let current=(hexArr[16]<<8)+(255&hexArr[17]);current=current>32768?(current-65536)/n:current/n;const electricity=Number(current.toFixed(2)),sysTime=65536*data[30]+256*data[31]+data[32];console.log("hexArr[30], hexArr[31], hexArr[32]",hexArr[30],hexArr[31],hexArr[32]),console.warn("sysTime: ",sysTime);const reportTime=65536*data[11]+256*data[12]+data[13];console.log("data[11], data[12], data[13]",data[11],data[12],data[13]),console.warn("reportTime: ",reportTime);const time=60*Math.abs(sysTime-reportTime)*1e3;console.warn("time: ",time);const timestamp=(new Date).getTime()-time;return console.warn("new Date().getTime(): ",(new Date).getTime()),{dataStr:hexArr.join(""),status:hex2string(data[2]),len:data[3],total:f(hexArr[4]+hexArr[5]),page:f(hexArr[6]+hexArr[7]),type:data[8],sysTime:sysTime,timestamp:timestamp,sumV:(f(hexArr[15]+hexArr[14])/100).toFixed(2),sumE:electricity,restC:(f(hexArr[19]+hexArr[18])/n).toFixed(2),designC:(f(hexArr[21]+hexArr[20])/n).toFixed(2),protections:resolveProtections(protection)._arr,protectionIndex:resolveProtections(protection)._indexs,tH:((f(hexArr[27]+hexArr[26])-2731)/10).toFixed(2),tL:((f(hexArr[29]+hexArr[28])-2731)/10).toFixed(2),vH:(f(hexArr[35]+hexArr[34])/1e3).toFixed(3),vL:(f(hexArr[37]+hexArr[36])/1e3).toFixed(3),nH:f(hexArr[38]),nL:f(hexArr[39]),fet:fet.join("")}},get3B3CInfo=({deviceId:deviceId,macAddr:macAddr,moduleType:moduleType,productType:productType})=>new Promise(async(resolve,reject)=>{let reportData={macAddr:macAddr,moduleTypeKey:moduleType,productKey:productType},_3b3c=null,_dda5_03=null,_dda5_05=null,_ffaa_80=null;try{if(!deviceId)throw new Error("deviceId required");const _ffaa_80_hex=await getFFAA80Async(deviceId,"AT^VERSION?");_ffaa_80=resolveFFAA80(_ffaa_80_hex),console.warn("Report-3B3C _ffaa_80 ",{_ffaa_80_hex:_ffaa_80_hex,_ffaa_80:_ffaa_80}),_ffaa_80&&(reportData.moduleVersion=_ffaa_80?.moduleVersion);const _3b3c_hex=await get3B3CAsync(deviceId);if(_3b3c=resolve3B3C(_3b3c_hex),console.warn("Report-3B3C _3b3c ",{_3b3c_hex:_3b3c_hex,_3b3c:_3b3c}),_3b3c)reportData.cmdContent=_3b3c?.dataStr;else{const _dda5_03_hex=await getDDA503Async(deviceId);_dda5_03=resolveDDA503(_dda5_03_hex),console.warn("Report-3B3C _dda5_03 ",{_dda5_03_hex:_dda5_03_hex,_dda5_03:_dda5_03}),_dda5_03&&(reportData.bmsVersion=_dda5_03?.softwareV);const _dda5_05_hex=await getDDA505Async(deviceId);_dda5_05=resolveDDA505(_dda5_05_hex),console.warn("Report-3B3C _dda5_05 ",{_dda5_05_hex:_dda5_05_hex,_dda5_05:_dda5_05}),_dda5_05&&(reportData.bmsSn=_dda5_05?.hardwareV)}resolve({reportData:reportData,_3b3c:_3b3c,_dda5_03:_dda5_03,_dda5_05:_dda5_05,_ffaa_80:_ffaa_80})}catch(error){reject(error)}});export{enterFactory,existFactory,get3B3CAsync,get3B3CInfo,getChipTypeAsync,getDD5A0AAsync,getDD5A0EAsync,getDD5A17Async,getDD5AAllAsync,getDD5AE0Async,getDD5AE1Async,getDD5AE4Async,getDD5AFAAsync,getDD5AFBAsync,getDDA503Async,getDDA504Async,getDDA505Async,getDDA507Async,getDDA508Async,getDDA5FAAsync,getDDA5OldAsync,getProtectCountCmd,readExistFactory,resolve3B3C,resolveBMSCmd,resolveBaseDD,resolveDDA500,resolveDDA503,resolveDDA504,resolveDDA505,resolveDDA508,resolveDDA5FA,resolveProtections,sendBMSAsync,setDDA5FAAsync,setDDA5OldAsync,set_PlanCMD_3B3C,set_PlanCMD_DD};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getData}from"./BleCmdAnalysis.js";import{hex2string,generateCheckSum,decimalToHex,hexToDecimal,hexArr2string,string2hexArr,hexArr2Assic}from"../BleDataProcess.js";const getFFAA17Async=async deviceId=>getData(deviceId,{command:["0xFF","0xAA","0x17","0x00","0x17"],commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&23==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_17(获取随机数)"),getFFAAKeyAsync=async(deviceId,code,content,type)=>{const commandCode=[code],data=[...content],dataLength=[`0x${decimalToHex(data.length,2)}`],check=generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return console.log("command: ---------------",command),getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&hexArr[2]==hexToDecimal(code),pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},`FFAA_${code}(${type})`)},resolveFFAAKey=data=>{if(!data)return null;const dataStr=hexArr2string(data),response=data[data.length-2];return{data:data,dataStr:dataStr,response:response,status:response}},resetFactoryData=async deviceId=>getFFAAKeyAsync(deviceId,"0x20",["0x01"],"恢复出厂设置"),resetSecondaryKey=async deviceId=>getFFAAKeyAsync(deviceId,"0x1F",["0x01"],"恢复二级密码"),clearPrimaryKey=async deviceId=>getFFAAKeyAsync(deviceId,"0x23",["0x01"],"清除一级密码"),getBluetoothName=async deviceId=>{const hex=await getFFAAKeyAsync(deviceId,"0x06",[],"蓝牙名称");let name="";if(hex&&6==hex[2]){let arr=hex.slice(4,-1);if(0==arr.length)return"";name=String.fromCharCode(...arr)}return name},setBluetoothName=async(deviceId,value)=>{const content=string2hexArr(value).map(o=>`0x${o}`),hex=await getFFAAKeyAsync(deviceId,"0x07",content,"蓝牙名称");if(hex&&7==hex[2])return!0;throw new Error("设置蓝牙名称失败")},getBroadcastDataCmd=async deviceId=>getFFAAKeyAsync(deviceId,"0x19",["0x01"],"广播数据"),getFFAA80Async=async(deviceId,ATStr)=>{const commandCode=["0x80"],data=string2hexArr(ATStr).map(o=>`0x${o}`),dataLength=[`0x${decimalToHex(data.length,2)}`],check=generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check],hex=await getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&128==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_80(AT)");return hex?resolveFFAA80(hex):null},resolveFFAA80=data=>{if(!data)return null;const dataStr=hexArr2string(data),status=data[data.length-2],response=hexArr2Assic(data.slice(4,-1)),moduleVersion=response.replace(/\r|\n|\s+|\OK/g,"").split(":")[1]??"";return{dataStr:dataStr,status:status,response:response,moduleVersion:moduleVersion}},set_PlanCMD_FFAA=async(deviceId,command)=>{"string"==typeof command&&(command=command.match(/(.{2})/g).map(o=>`0x${o}`));let result=null;try{const data=await getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&hexArr[2]==command[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"通用CMD_FFAA");data&&(result=resolveFFAAKey(data))}catch(error){console.error(error)}return result},set_PlanCMD_FFAA80=async(deviceId,ATStr)=>{let data=null;try{if("AT^WIFISTA="==ATStr.slice(0,11).toUpperCase()){const[v0,v1]=ATStr.split("="),[rssi,pwd]=v1.split(",");data=await setWiFi(deviceId,rssi,pwd),console.warn("WiFi_STA",data)}else{const hex=await getFFAA80Async(deviceId,ATStr);data=resolveFFAA80(hex)}}catch(error){}return data},setWiFiSta=async(deviceId,rssi,pwd)=>{const str=`AT^WIFISTA=${rssi},${pwd}`;try{const hex=await getFFAA80Async(deviceId,str);return resolveFFAA80(hex)}catch(error){}return!1},getWiFiIP=async deviceId=>new Promise(async(r,j)=>{try{const str="AT^WIFISTA_IP?",hex=await getFFAA80Async(deviceId,str),data=resolveFFAA80(hex);data&&data?.response?.includes("OK")&&data?.response?.includes(str)&&!data?.response?.includes("ip:0.0.0.0")?r(data):j(data)}catch(error){j(error)}}),setWiFi=async(deviceId,rssi,pwd)=>{let data=null;try{data=await setWiFiSta(deviceId,rssi,pwd)}catch(error){}return data},getFFAA25Async=async deviceId=>{const commandCode=["0x25"],data=[],dataLength=[`0x${decimalToHex(data.length,2)}`],check=generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&37==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_25(LCD屏查询配对mac)")},resolveFFAA25=data=>{if(!data)return null;const dataStr=hexArr2string(data),response=dataStr.slice(8,-2),arr=response.match(/(.{2})/g),state=arr.pop();return{dataStr:dataStr,response:response,macAddr:arr.join(":"),state:state,isConnected:0!=state}},getFFAA26Async=async(deviceId,macAddrArr)=>{const commandCode=["0x26"],data=[...macAddrArr],dataLength=[`0x${decimalToHex(data.length,2)}`],check=generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&38==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_26(LCD屏设置配对mac)")},resolveFFAA26=data=>{if(!data)return null;const dataStr=hexArr2string(data),response=dataStr.slice(6,-2);return{dataStr:dataStr,response:response,result:0==response}},getFFAA03Async=async deviceId=>getData(deviceId,{command:["0xFF","0xAA","0x03","0x00","0x03"],commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&3==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>hex2string(o)),len=pkg.length,[c1]=generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_03(模块复位)");export{clearPrimaryKey,getBluetoothName,getBroadcastDataCmd,getFFAA03Async,getFFAA17Async,getFFAA25Async,getFFAA26Async,getFFAA80Async,getFFAAKeyAsync,getWiFiIP,resetFactoryData,resetSecondaryKey,resolveFFAA25,resolveFFAA26,resolveFFAA80,resolveFFAAKey,setBluetoothName,setWiFi,setWiFiSta,set_PlanCMD_FFAA,set_PlanCMD_FFAA80};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getData}from"./BleCmdAnalysis.js";import{generateCrc16modbusCheck,hexArr2string,hex2string,hex2Binary,hex2Ascii,extractBits,hexStrAscii}from"../BleDataProcess.js";const format=(value,n,offset,scope)=>{const v=parseInt(value.join(""),16)*n+offset;return null==scope?v:v.toFixed(scope)},format2floor=(value,n,offset,scope)=>{const v=parseInt(value.join(""),16)*n+offset;return Math.floor(v)},formatBools=(value,n,offset,scope,len)=>{const hexs=value.join(""),binary=hex2Binary(hexs).split("");binary.reverse();const arr=new Array(Math.max(len,binary.length));for(let i=0;i<arr.length;i++)arr[i]="1"==binary[i];return arr},format2HexString=value=>value.map(o=>hex2string(o)).join(""),format2Version=value=>value.map(o=>o.toString()).join("."),formatExtractBits=(value,n,offset,scope,bitsSpriter)=>{const v=format(value,n,offset,scope);return bitsSpriter.map(([s,e])=>extractBits(v,s,e)).join("-")},formatAssicString=value=>{const v=format2HexString(value);return hexStrAscii(v)},push=(arr,[label,key,formatter,value,n,offset,scope,len=0,bitsSpriter=[]])=>{if(!formatter)return arr.push([label,key,value,void 0,n,offset,scope,void 0]),value;const _value=formatter.call(void 0,value,n,offset,scope,len,bitsSpriter);return arr.push([label,key,_value,value.join(""),n,offset,scope,formatter.name]),_value},getCMDESInfoAsync=async(deviceId,command)=>{"string"==typeof command&&(command=command.match(/(.{2})/g).map(o=>`0x${o}`));const data=await getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:hexArr[0]==command[0]&&hexArr[1]==command[1],pkgLen:hexArr[7]+10}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrc16modbusCheck(pkg.slice(0,len-2),!0),[_c1,_c2]=[pkg[len-2],pkg[len-1]];return{verified:c1==_c1&&c2==_c2}}},"CMDES_储能协议通用指令");let result=null;if(data){const dataStr=hexArr2string(data),header=dataStr.slice(0,16);result={data:data,dataStr:dataStr,header:header}}return result},getHVESInfoAsync=async(deviceId,codes)=>{const[addr,code]=codes,checks=generateCrc16modbusCheck(codes,!0),command=[...codes,...checks];return getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:hexArr[0]==addr&&hexArr[1]==code,pkgLen:hexArr[7]+10}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=generateCrc16modbusCheck(pkg.slice(0,len-2),!0),[_c1,_c2]=[pkg[len-2],pkg[len-1]];return{verified:c1==_c1&&c2==_c2}}},`HVES_${addr}_${code}`)},resolveHVESSumInfo=async data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["总电压V","sumV",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总电流A","sumE",format,c.slice(i,i+=2),.1,-3e3,1]),push(_data,["SOC%","soc",format2floor,c.slice(i,i+=2),1,0,0]),push(_data,["SOH%","soh",format2floor,c.slice(i,i+=2),1,0,0]),push(_data,["总容量Ah","sumC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["标称容量Ah","designC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["剩余容量Ah","restC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["告警信息","warningInfo",formatBools,c.slice(i,i+=8),1,0,void 0,19]);const cellNo=push(_data,["并机个数","cellNo",format,c.slice(i,i+=2),1,0,0]);push(_data,["并机状态","cellState",formatBools,c.slice(i,i+=2),1,0,void 0,cellNo]),push(_data,["循环次数","cycleNo",format,c.slice(i,i+=2),1,0,0]),push(_data,["最高单体序号","maxVolNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[12,15],[7,11],[0,6]]]),push(_data,["最高单体电压mV","maxVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["最低单体序号","minVolNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[12,15],[7,11],[0,6]]]),push(_data,["最低单体电压mV","minVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["最高温度序号","maxTemNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[12,15],[7,11],[0,6]]]),push(_data,["最高温度℃","maxTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["最低温度序号","minTemNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[12,15],[7,11],[0,6]]]),push(_data,["最低温度℃","minTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["系统状态","sysState",format2HexString,c.slice(i,i+=2),0,0,0]),push(_data,["预留1","n1",format2HexString,c.slice(i,i+=2),0,0,0]),push(_data,["预留2","n2",format2HexString,c.slice(i,i+=2),0,0,0]),push(_data,["预留3","n3",format2HexString,c.slice(i,i+=2),0,0,0]),push(_data,["预留4","n4",format2HexString,c.slice(i,i+=2),0,0,0]);let packs=[];[...Array(cellNo)].forEach((__,i)=>{let arr=[];const j=i+1;push(arr,[`PACK${j} 电压V`,`pack${j}V`,format,c.slice(i,i+=2),.1,0,1]),push(arr,[`PACK${j} 电流A`,`pack${j}E`,format,c.slice(i,i+=2),.1,-3e3,1]),push(arr,[`PACK${j} SOC`,`pack${j}SOC`,format2floor,c.slice(i,i+=2),1,0,0]),push(arr,[`PACK${j} 状态`,`pack${j}State`,format,c.slice(i,i+=2),1,0,0]),packs.push(arr)}),push(_data,["PACKS","packs",void 0,packs,void 0,void 0,void 0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESBaseInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["总电压V","sumV",format,c.slice(i,i+=2),.1,0,1]),push(_data,["母线回踩电压V","muxianV",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总电流A","sumE",format,c.slice(i,i+=4),.1,-3e3,1]),push(_data,["SOC%","soc",format2floor,c.slice(i,i+=2),.01,0,0]),push(_data,["剩余容量Ah","restC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["满充容量Ah","fullC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["标称容量Ah","designC",format,c.slice(i,i+=2),.1,0,1]),push(_data,["环境温度℃","envTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充放电状态(0待机1充电2放电)","state",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOH%","soh",format2floor,c.slice(i,i+=2),1,0,0]);const warningInfo=push(_data,["告警信息原始值","warningInfoHex",format2HexString,c.slice(i,i+=8),1,0,void 0,void 0]).match(/(.{2})/g).map(o=>hex2Binary(o,8)).join("").match(/(.{2})/g).map(o=>parseInt(o,2)).reverse();push(_data,["告警信息","warningInfo",void 0,warningInfo,void 0,void 0,void 0]),push(_data,["故障信息","faultInfo",formatBools,c.slice(i,i+=4),1,0,void 0,9]),push(_data,["MOS状态","mosState",formatBools,c.slice(i,i+=2),1,0,void 0,10]),push(_data,["信号状态","signalState",formatBools,c.slice(i,i+=2),1,0,void 0,5]),push(_data,["循环次数","cycleNo",format,c.slice(i,i+=2),1,0,0]),push(_data,["最高单体序号","maxVolNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[8,15],[0,7]]]),push(_data,["最高单体mV","maxVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["最低单体序号","minVolNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[8,15],[0,7]]]),push(_data,["最低单体mV","minVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["平均电压mV","avgVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["最高温度序号","maxTemNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[8,15],[0,7]]]),push(_data,["最高温度℃","maxTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["最低温度序号","minTemNo",formatExtractBits,c.slice(i,i+=2),1,0,0,[[8,15],[0,7]]]),push(_data,["最低温度℃","minTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["平均温度℃","avgTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电需求电压V","chargeVol",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电需求电流A","chargeE",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电需求电压V","disChargeVol",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电需求电流A","dischargeE",format,c.slice(i,i+=2),.1,0,1]),push(_data,["软件版本","softwareV",format2Version,c.slice(i,i+=2),1,0,0]),push(_data,["SN码","sn",hex2Ascii,c.slice(i,i+=30),1,0,0]),push(_data,["回踩电压2V","muxian2V",format,c.slice(i,i+=2),.1,0,1]);const sysLevel=push(_data,["系统等级","sysLevel",format2HexString,c.slice(i,i+=2),1,0,0]),bmuNo=extractBits(parseInt(sysLevel,16),0,5);push(_data,["BMU数","bmuNo",void 0,bmuNo,void 0,void 0,void 0]),push(_data,["负绝缘电阻KΩ","nIR",format,c.slice(i,i+=2),.1,0,0]),push(_data,["正绝缘电阻KΩ","pIR",format,c.slice(i,i+=2),.1,0,0]),push(_data,["最高单体编号","maxCellNo",format,c.slice(i,i+=2),1,0,0]),push(_data,["最低单体编号","minCellNo",format,c.slice(i,i+=2),1,0,0]),push(_data,["最高温度编号","maxTemNo_",format,c.slice(i,i+=2),1,0,0]),push(_data,["最低温度编号","minTemNo_",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱温度1","pTem1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱温度2","pTem2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱温度3","pTem3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱温度4","pTem4",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["RS485协议","rs485",format,c.slice(i,i+=1),1,0,0]),push(_data,["CAN协议","can",format,c.slice(i,i+=1),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESParamsInfo=data=>{if(!data)return null;const[v0,v1,v2,v3,v4,v5,v6]=data;return"0x18"==v2&&"0x00"==v3&&"0x18"==v4?resolveHVESMonoVolInfo(data):"0x18"==v2&&"0x30"==v3&&"0x18"==v4?resolveHVESSumVolInfo(data):"0x18"==v2&&"0x60"==v3&&"0x18"==v4?resolveHVESOvrInfo(data):"0x18"==v2&&"0x78"==v3&&"0x18"==v4?resolveHVESOeInfo(data):"0x18"==v2&&"0xa8"==v3&&"0x18"==v4?resolveHVESCtInfo(data):"0x18"==v2&&"0xd8"==v3&&"0x19"==v4?resolveHVESDisCtInfo(data):"0x19"==v2&&"0x08"==v3&&"0x19"==v4?resolveHVESEtInfo(data):"0x19"==v2&&"0x38"==v3&&"0x19"==v4?resolveHVESOtrInfo(data):"0x19"==v2&&"0x50"==v3&&"0x19"==v4?resolveHVESOtRisingInfo(data):"0x19"==v2&&"0x68"==v3&&"0x19"==v4?resolveHVESElectrodeHTInfo(data):"0x19"==v2&&"0x80"==v3&&"0x19"==v4?resolveHVESInsulationLRInfo(data):"0x19"==v2&&"0x98"==v3&&"0x19"==v4?resolveHVESLSocInfo(data):"0x20"==v2&&"0x00"==v3&&"0x20"==v4?resolveHVESCalibrationInfo(data):"0x22"==v2&&"0x00"==v3&&"0x22"==v4?resolveHVESCalibrationConfigInfo(data):"0x1c"==v2&&"0x00"==v3&&"0x1c"==v4?resolveHVESPackInfo(data):null},resolveHVESMonoVolInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["单体过压-1级告警值mV","M_OV_alarmV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-1级告警延时mS","M_OV_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-1级恢复值mV","M_OV_recoverV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-1级恢复延时S","M_OV_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-2级告警值mV","M_OV_alarmV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-2级告警延时mS","M_OV_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-2级恢复值mV","M_OV_recoverV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-2级恢复延时S","M_OV_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-3级保护值mV","M_OV_protectionV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-3级保护延时mS","M_OV_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-3级恢复值mV","M_OV_recoverV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体过压-3级恢复延时S","M_OV_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-1级告警值mV","M_UV_alarmV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-1级告警延时mS","M_UV_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-1级恢复值mV","M_UV_recoverV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-1级恢复延时S","M_UV_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-2级告警值mV","M_UV_alarmV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-2级告警延时mS","M_UV_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-2级恢复值mV","M_UV_recoverV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-2级恢复延时S","M_UV_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-3级保护值mV","M_UV_protectionV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-3级保护延时mS","M_UV_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-3级恢复值mV","M_UV_recoverV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体欠压-3级恢复延时S","M_UV_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESSumVolInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["总压过压-1级告警值V","S_OV_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-1级告警延时mS","S_OV_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压过压-1级恢复V","S_OV_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-1级恢复延时S","S_OV_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压过压-2级告警值V","S_OV_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-2级告警延时mS","S_OV_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压过压-2级恢复V","S_OV_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-2级恢复延时S","S_OV_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压过压-3级保护值V","S_OV_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-3级保护延时mS","S_OV_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压过压-3级恢复V","S_OV_recoverV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压过压-3级恢复延时S","S_OV_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-1级告警值V","S_UV_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-1级告警延时mS","S_UV_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-1级恢复V","S_UV_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-1级恢复延时S","S_UV_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-2级告警值V","S_UV_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-2级告警延时mS","S_UV_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-2级恢复V","S_UV_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-2级恢复延时S","S_UV_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-3级保护值V","S_UV_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-3级保护延时mS","S_UV_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压欠压-3级恢复V","S_UV_recoverV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["总压欠压-3级恢复延时S","S_UV_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESOvrInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["压差过大-1级告警值mV","OVR_alarmV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-1级告警延时mS","OVR_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-1级恢复mV","OVR_recoverV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-1级恢复延时S","OVR_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-2级告警值mV","OVR_alarmV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-2级告警延时mS","OVR_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-2级恢复mV","OVR_recoverV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-2级恢复延时S","OVR_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-3级保护值mV","OVR_protectionV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-3级保护延时mS","OVR_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-3级恢复mV","OVR_recoverV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["压差过大-3级恢复延时S","OVR_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESOeInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["充电过流-1级告警值A","C_OE_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电过流-1级告警延时mS","C_OE_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电过流-1级恢复值A","C_OE_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电过流-1级恢复延时S","C_OE_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电过流-2级告警值A","C_OE_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电过流-2级告警延时mS","C_OE_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电过流-2级恢复值A","C_OE_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电过流-2级恢复延时S","C_OE_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电过流-3级保护值A","C_OE_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["充电过流-3级保护延时mS","C_OE_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电过流-3级恢复值A","C_OE_recoverV_l3",format,c.slice(i,i+=2),1,0,1]),push(_data,["充电过流-3级恢复延时S","C_OE_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-1级告警值A","Dis_C_OE_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电过流-1级告警延时mS","Dis_C_OE_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-1级恢复值A","Dis_C_OE_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电过流-1级恢复延时S","Dis_C_OE_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-2级告警值A","Dis_C_OE_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电过流-2级告警延时mS","Dis_C_OE_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-2级恢复值A","Dis_C_OE_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电过流-2级恢复延时S","Dis_C_OE_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-3级保护值A","Dis_C_OE_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["放电过流-3级保护延时mS","Dis_C_OE_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电过流-3级恢复值A","Dis_C_OE_recoverV_l3",format,c.slice(i,i+=2),1,0,1]),push(_data,["放电过流-3级恢复延时S","Dis_C_OE_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESCtInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["充电高温-1级告警值℃","C_HT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-1级告警延时mS","C_HT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电高温-1级恢复值℃","C_HT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-1级恢复延时S","C_HT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电高温-2级告警值℃","C_HT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-2级告警延时mS","C_HT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电高温-2级恢复值℃","C_HT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-2级恢复延时S","C_HT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电高温-3级保护值℃","C_HT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-3级保护延时mS","C_HT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电高温-3级恢复值℃","C_HT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电高温-3级恢复延时S","C_HT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-1级告警值℃","C_LT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-1级告警延时mS","C_LT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-1级恢复值℃","C_LT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-1级恢复延时S","C_LT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-2级告警值℃","C_LT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-2级告警延时mS","C_LT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-2级恢复值℃","C_LT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-2级恢复延时S","C_LT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-3级保护值℃","C_LT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-3级保护延时mS","C_LT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电低温-3级恢复值℃","C_LT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["充电低温-3级恢复延时S","C_LT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESDisCtInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["放电高温-1级告警值℃","Dis_C_HT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-1级告警延时mS","Dis_C_HT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电高温-1级恢复值℃","Dis_C_HT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-1级恢复延时S","Dis_C_HT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电高温-2级告警值℃","Dis_C_HT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-2级告警延时mS","Dis_C_HT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电高温-2级恢复值℃","Dis_C_HT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-2级恢复延时S","Dis_C_HT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电高温-3级保护值℃","Dis_C_HT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-3级保护延时mS","Dis_C_HT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电高温-3级恢复值℃","Dis_C_HT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电高温-3级恢复延时S","Dis_C_HT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-1级告警值℃","Dis_C_LT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-1级告警延时mS","Dis_C_LT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-1级恢复值℃","Dis_C_LT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-1级恢复延时S","Dis_C_LT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-2级告警值℃","Dis_C_LT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-2级告警延时mS","Dis_C_LT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-2级恢复值℃","Dis_C_LT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-2级恢复延时S","Dis_C_LT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-3级保护值℃","Dis_C_LT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-3级保护延时mS","Dis_C_LT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电低温-3级恢复值℃","Dis_C_LT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["放电低温-3级恢复延时S","Dis_C_LT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESEtInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["环境高温-1级告警值℃","E_HT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-1级告警延时mS","E_HT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境高温-1级恢复值℃","E_HT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-1级恢复延时S","E_HT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境高温-2级告警值℃","E_HT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-2级告警延时mS","E_HT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境高温-2级恢复值℃","E_HT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-2级恢复延时S","E_HT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境高温-3级保护值℃","E_HT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-3级保护延时mS","E_HT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境高温-3级恢复值℃","E_HT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境高温-3级恢复延时S","E_HT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-1级告警值℃","E_LT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-1级告警延时mS","E_LT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-1级恢复值℃","E_LT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-1级恢复延时S","E_LT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-2级告警值℃","E_LT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-2级告警延时mS","E_LT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-2级恢复值℃","E_LT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-2级恢复延时S","E_LT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-3级保护值℃","E_LT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-3级保护延时mS","E_LT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["环境低温-3级恢复值℃","E_LT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["环境低温-3级恢复延时S","E_LT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESOtrInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["温差过大-1级告警值℃","OTR_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-1级告警延时mS","OTR_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["温差过大-1级恢复℃","OTR_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-1级恢复延时S","OTR_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["温差过大-2级告警值℃","OTR_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-2级告警延时mS","OTR_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["温差过大-2级恢复℃","OTR_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-2级恢复延时S","OTR_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["温差过大-3级保护值℃","OTR_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-3级保护延时mS","OTR_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["温差过大-3级恢复℃","OTR_recoverV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温差过大-3级恢复延时S","OTR_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESOtRisingInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["温升过高-1级告警值℃","OTRising_alarmV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-1级告警延时mS","OTRising_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["温升过高-1级恢复℃","OTRising_recoverV_l1",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-1级恢复延时S","OTRising_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["温升过高-2级告警值℃","OTRising_alarmV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-2级告警延时mS","OTRising_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["温升过高-2级恢复℃","OTRising_recoverV_l2",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-2级恢复延时S","OTRising_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["温升过高-3级保护值℃","OTRising_protectionV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-3级保护延时mS","OTRising_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["温升过高-3级恢复℃","OTRising_recoverV_l3",format,c.slice(i,i+=2),.1,0,1]),push(_data,["温升过高-3级恢复延时S","OTRising_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESElectrodeHTInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["极柱高温-1级告警值℃","Electrode_HT_alarmV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-1级告警延时mS","Electrode_HT_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱高温-1级恢复值℃","Electrode_HT_recoverV_l1",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-1级恢复延时S","Electrode_HT_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱高温-2级告警值℃","Electrode_HT_alarmV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-2级告警延时mS","Electrode_HT_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱高温-2级恢复值℃","Electrode_HT_recoverV_l2",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-2级恢复延时S","Electrode_HT_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱高温-3级保护值℃","Electrode_HT_protectionV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-3级保护延时mS","Electrode_HT_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["极柱高温-3级恢复值℃","Electrode_HT_recoverV_l3",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["极柱高温-3级恢复延时S","Electrode_HT_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESInsulationLRInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["绝缘过低-1级告警值KΩ","Insulation_LR_alarmV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-1级告警延时mS","Insulation_LR_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-1级恢复值KΩ","Insulation_LR_recoverV_l1",format,c.slice(i,i+=2),.1,0,0]),push(_data,["绝缘过低-1级恢复延时S","Insulation_LR_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-2级告警值KΩ","Insulation_LR_alarmV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-2级告警延时mS","Insulation_LR_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-2级恢复值KΩ","Insulation_LR_recoverV_l2",format,c.slice(i,i+=2),.1,0,0]),push(_data,["绝缘过低-2级恢复延时S","Insulation_LR_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-3级保护值KΩ","Insulation_LR_protectionV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-3级保护延时mS","Insulation_LR_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["绝缘过低-3级恢复值KΩ","Insulation_LR_recoverV_l3",format,c.slice(i,i+=2),.1,0,0]),push(_data,["绝缘过低-3级恢复延时S","Insulation_LR_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESLSocInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["SOC过低-1级告警值%","L_SOC_alarmV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-1级告警延时mS","L_SOC_alarmD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-1级恢复值%","L_SOC_recoverV_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-1级恢复延时S","L_SOC_recoverD_l1",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-2级告警值%","L_SOC_alarmV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-2级告警延时mS","L_SOC_alarmD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-2级恢复值%","L_SOC_recoverV_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-2级恢复延时S","L_SOC_recoverD_l2",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-3级保护值%","L_SOC_protectionV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-3级保护延时mS","L_SOC_protectionD_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-3级恢复值%","L_SOC_recoverV_l3",format,c.slice(i,i+=2),1,0,0]),push(_data,["SOC过低-3级恢复延时S","L_SOC_recoverD_l3",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESPackInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["电池类型-0铁锂1三元","batteryType",format,c.slice(i,i+=2),1,0,0]),push(_data,["电池厂家","batteryFactory",format,c.slice(i,i+=2),1,0,0]),push(_data,["均衡开启电压","equilizationOpenedVoltage",format,c.slice(i,i+=2),1,0,0]),push(_data,["均衡开启压差","equilibriumOpenedVoltageDeviation",format,c.slice(i,i+=2),1,0,0]),push(_data,["加热开启温度-℃","hotOpenedTemperature",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["加热关闭温度-℃","hotClosedTemperature",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["满充校准电压-V","fullyChargedCalibrationVoltage",format,c.slice(i,i+=2),.01,0,1]),push(_data,["满充校准电流-mA","fullyChargedCalibrationElectricity",format,c.slice(i,i+=2),1,0,0]),push(_data,["BMS条码","bmsBarcode",hex2Ascii,c.slice(i,i+=30),1,0,0]),push(_data,["BMS生产日期-年","bmsProductionDate_Year",format,c.slice(i,i+=2),1,0,0]),push(_data,["BMS生产日期-月","bmsProductionDate_Month",format,c.slice(i,i+=2),1,0,0]),push(_data,["BMS生产日期-日","bmsProductionDate_Day",format,c.slice(i,i+=2),1,0,0]),push(_data,["SN条码","snBarcode",hex2Ascii,c.slice(i,i+=30),1,0,0]),push(_data,["PACK生产日期-年","packProductionDate_Year",format,c.slice(i,i+=2),1,0,0]),push(_data,["PACK生产日期-月","packProductionDate_Month",format,c.slice(i,i+=2),1,0,0]),push(_data,["PACK生产日期-日","packProductionDate_Day",format,c.slice(i,i+=2),1,0,0]),push(_data,["厂家代号","factoryCode",hex2Ascii,c.slice(i,i+=30),1,0,0]),push(_data,["CAN协议","can",format,c.slice(i,i+=2),1,0,0]),push(_data,["待机休眠电压-mV","standbySleepVoltage",format,c.slice(i,i+=2),1,0,0]),push(_data,["待机休眠延时-min","standbySleepDelay",format,c.slice(i,i+=2),1,0,0]),push(_data,["均衡模式0充电均衡1静态与充电均衡","equilibriumMode",format,c.slice(i,i+=2),1,0,0]),push(_data,["RS485协议","rs485",format,c.slice(i,i+=2),1,0,0]),push(_data,["CAN波特率设置","canTeport",format,c.slice(i,i+=2),1,0,0]),push(_data,["RS485波特率设置","rs385Teport",format,c.slice(i,i+=2),1,0,0]),push(_data,["传感器类型","sensorType",format,c.slice(i,i+=2),1,0,0]);const[Insulation,Electrode]=push(_data,["开关设置","switcher",formatBools,c.slice(i,i+=2),1,0,void 0,2]);push(_data,["绝缘检测","Insulation",void 0,Insulation,void 0,void 0,void 0]),push(_data,["极柱高温","Electrode",void 0,Electrode,void 0,void 0,void 0]),push(_data,["预充延时mS","pre_c_D",format,c.slice(i,i+=2),1,0,0]),push(_data,["分流器-电压系数mV","K_v",format,c.slice(i,i+=2),1,0,0]),push(_data,["分流器-电流系数A","K_e",format,c.slice(i,i+=2),1,0,1]),push(_data,["OCV校准命令","ovc",format,c.slice(i,i+=2),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESCalibrationInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["标称容量AH","n_C",format,c.slice(i,i+=2),.01,0,2]),push(_data,["满充容量AH","f_C",format,c.slice(i,i+=2),.01,0,2]),push(_data,["剩余容量AH","r_C",format,c.slice(i,i+=2),.01,0,2]),push(_data,["SOC%","soc",format,c.slice(i,i+=2),.01,0,2]),push(_data,["SOH%","soh",format,c.slice(i,i+=2),1,0,0]),push(_data,["循环次数","cycleNo",format,c.slice(i,i+=2),1,0,0]),push(_data,["循环衰减系数(衰减1%循环次数)","cycleReduceRate",format,c.slice(i,i+=2),1,0,0]),push(_data,["循环系数%","cycleRate",format,c.slice(i,i+=2),1,0,0]),push(_data,["累计充电AH","cum_charge",format,c.slice(i,i+=4),.1,0,0]),push(_data,["累计放电AH","cum_discharge",format,c.slice(i,i+=4),.1,0,0]),push(_data,["电池自功耗系数(多少天1%)","self_power_rate",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准电压1","ocv_v1",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准soc1%","ocv_soc1",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准电压2","ocv_v2",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准soc2%","ocv_soc2",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准电压3","ocv_v3",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准soc3%","ocv_soc3",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准电压4","ocv_v4",format,c.slice(i,i+=2),1,0,0]),push(_data,["OCV校准soc4%","ocv_soc4",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电需求电压V","c_DV",format,c.slice(i,i+=2),.1,0,2]),push(_data,["充电需求电流A","c_DA",format,c.slice(i,i+=2),.1,0,2]),push(_data,["放电需求电压V","dis_c_DV",format,c.slice(i,i+=2),.1,0,2]),push(_data,["放电需求电流A","dis_c_DA",format,c.slice(i,i+=2),.1,0,2]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESCalibrationConfigInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["BMU个数","bmu_num",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体个数","cell_num",format,c.slice(i,i+=2),1,0,0]),push(_data,["温控个数","temp_num",format,c.slice(i,i+=2),1,0,0]);const mono_invalid_locations=push(_data,["单体无效位置","mono_invalid_locations",formatBools,c.slice(i,i+=4),1,0,void 0,32]);let arr=[];mono_invalid_locations.forEach((_,i)=>_&&arr.push(`B${i+1}`)),push(_data,["单体无效位置","mono_invalid_location",void 0,arr.join(", "),void 0,void 0,void 0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESCalibrationC1Info=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["零点校准值A","c_0",format,c.slice(i,i+=2),.1,-3e3,0]),push(_data,["充电电流校准系数K","c_v_K",format,c.slice(i,i+=2),1,0,0]),push(_data,["充电电流校准系数B","c_v_B",format,c.slice(i,i+=2),.1,-100,0]),push(_data,["放电电流校准系数K","dis_c_v_K",format,c.slice(i,i+=2),1,0,0]),push(_data,["放电电流校准系数B","dis_c_v_B",format,c.slice(i,i+=2),.1,-100,0]),push(_data,["总压校准系数K","s_v_K",format,c.slice(i,i+=2),1,0,0]),push(_data,["总压校准系数B","s_v_B",format,c.slice(i,i+=2),.1,-100,0]),push(_data,["回踩电压1校准K","h_v1_K",format,c.slice(i,i+=2),1,0,0]),push(_data,["回踩电压1校准B","h_v1_B",format,c.slice(i,i+=2),.1,-100,0]),push(_data,["回踩电压2校准K","h_v2_K",format,c.slice(i,i+=2),1,0,0]),push(_data,["回踩电压2校准B","h_v2_B",format,c.slice(i,i+=2),.1,-100,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESCalibrationC2Info=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["BMU个数","bmu_num",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体个数","cell_num",format,c.slice(i,i+=2),1,0,0]),push(_data,["温度个数","temp_num",format,c.slice(i,i+=2),1,0,0]),push(_data,["单体无效位置","mono_invalid_location",format,c.slice(i,i+=4),1,0,0]),push(_data,["配置使能","enabler_conf",format,c.slice(i,i+=2),1,0,0]);let bmus=[];[...Array(32)].forEach((__,i)=>{let arr=[];const j=i+1;push(arr,[`BMU${j}单体个数`,`bmu${j}_cell_num`,format,c.slice(i,i+=2),1,0,0]),push(arr,[`BMU${j}温度个数`,`bmu${j}}_temp_num`,format,c.slice(i,i+=2),1,-3e3,0]),push(arr,[`BMU${j}无效位置`,`bmu${j}}_mono_invalid_location`,format,c.slice(i,i+=2),1,0,0]),bmus.push(arr)}),push(_data,["BMUs","bmus",void 0,bmus,void 0,void 0,void 0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESVersionInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["BOOT版本","bootV",format,c.slice(i,i+=2),1,0,0]),push(_data,["硬件版本","hardwareV",format,c.slice(i,i+=2),1,0,0]),push(_data,["APP主版本","app_v_major",format,c.slice(i,i+=2),1,0,0]),push(_data,["APP次版本","app_v_minor",format,c.slice(i,i+=2),1,0,0]),push(_data,["测试版本","test_v",format,c.slice(i,i+=2),1,0,0]),push(_data,["协议版本","protocolV",format,c.slice(i,i+=2),1,0,0]),push(_data,["硬件名称","hardwareName",formatAssicString,c.slice(i,i+=16),1,0,0]),push(_data,["项目名称","projectName",formatAssicString,c.slice(i,i+=16),1,0,0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}},resolveHVESBMUInfo=data=>{if(!data)return null;const dataStr=hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>hex2string(o));let i=0,_data=[];push(_data,["最高单体电压mV","maxVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["最低单体电压mV","minVol",format,c.slice(i,i+=2),1,0,0]),push(_data,["DO/DI状态","do_di_state",format,c.slice(i,i+=2),1,0,0]),push(_data,["电源电压V","batteryVOl",format,c.slice(i,i+=2),.1,0,1]),push(_data,["最高温度℃","maxTem",format,c.slice(i,i+=2),.1,-50,1]),push(_data,["最低温度℃","minTem",format,c.slice(i,i+=2),.1,-50,1]);for(let j=1;j<=8;j++)push(_data,[`预留${j}`,`pre_${j}`,format2HexString,c.slice(i,i+=2),1,0,0]);const cellNo=1*push(_data,["单体个数","cellNo",format,c.slice(i,i+=2),1,0,0]);let cells=[];[...Array(cellNo)].forEach(()=>{const _v=c.slice(i,i+=2),v=format(_v,1,0,void 0);cells.push({v:v,hex:_v.join(""),cellV:extractBits(v,0,12),equState:extractBits(v,13,14),onlioeState:extractBits(v,15,16)})}),push(_data,["CELLS","cells",void 0,cells,void 0,void 0,void 0]);const tempNo=1*push(_data,["温度个数","tempNo",format,c.slice(i,i+=2),1,0,0]);let temps=[];[...Array(tempNo)].forEach(()=>{const _v=c.slice(i,i+=2),v=format(_v,.1,-50,1);temps.push({v:v,hex:_v.join(""),temp:extractBits(v,0,14),onlioeState:extractBits(v,15,16)})}),push(_data,["TEMPS","temps",void 0,temps,void 0,void 0,void 0]);let res={};return _data.forEach(([v0,v1,v2])=>res[v1]=v2),{dataStr:dataStr,header:header,_data:_data,upTime:(new Date).getTime(),res:res}};export{getCMDESInfoAsync,getHVESInfoAsync,resolveHVESBMUInfo,resolveHVESBaseInfo,resolveHVESCalibrationC1Info,resolveHVESCalibrationC2Info,resolveHVESCalibrationConfigInfo,resolveHVESCalibrationInfo,resolveHVESCtInfo,resolveHVESDisCtInfo,resolveHVESElectrodeHTInfo,resolveHVESEtInfo,resolveHVESInsulationLRInfo,resolveHVESLSocInfo,resolveHVESMonoVolInfo,resolveHVESOeInfo,resolveHVESOtRisingInfo,resolveHVESOtrInfo,resolveHVESOvrInfo,resolveHVESPackInfo,resolveHVESParamsInfo,resolveHVESSumInfo,resolveHVESSumVolInfo,resolveHVESVersionInfo};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{decimalToHex,hexStringToBinary}from"../BleDataProcess.js";function format(value,n,offset,scope){const v=parseInt(value.join(""),16)*n+offset;return null==scope?v:v.toFixed(scope)}function socFormat(value,n,offset,scope){const v=parseInt(value.join(""),16)*n+offset;return Math.floor(v)}function kelvinToCelsius(value){return(value-273.1).toFixed(2)}function formatBools(value,n,offset,scope,len){const hexs=value.join(""),binary=hexStringToBinary(hexs).split("");binary.reverse();const arr=new Array(Math.max(len,binary.length));for(let i=0;i<arr.length;i++)arr[i]="1"==binary[i]||1==binary[i];return arr}function hexToAscii(hexString){let asciiString="";for(let i=0;i<hexString.length;i+=2){const hexPair=hexString.substr(i,2),decimalValue=parseInt(hexPair,16);asciiString+=String.fromCharCode(decimalValue)}return asciiString.replace(/\u0000/g,"")}class HostProtocol{readValue;receiveLength;constructor(){this.readValue=[],this.receiveLength=null}getBuffer(values){const checks=this.generateCheck(values),arr=[...values,...checks];"0x79"==arr[1]&&console.log("======下发指令======",arr.join("").replace(/0x/g,""),arr);const buffer=new ArrayBuffer(arr.length),dataView=new DataView(buffer);return arr.forEach((v,i)=>dataView.setUint8(i,v.toString())),buffer}generateCheck(data){const hex=this.crc16modbus(data),hexStr=decimalToHex(hex,4);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]}generateCheck2(dataHexString){const dataBytes=[];for(let i=0;i<dataHexString.length;i+=2)dataBytes.push(parseInt(dataHexString.substr(i,2),16));let crc=65535;for(const byte of dataBytes){crc^=byte;for(let i=0;i<8;i++)1&crc?crc=65535&(crc>>1^40961):crc>>=1}const res=crc.toString(16).toUpperCase();return[res.slice(-2),res.slice(-4,-2)]}crc16modbus(data){let crc=65535;for(let i=0;i<data.length;i++){crc^=data[i];for(let j=0;j<8;j++)1&crc?crc=crc>>1^40961:crc>>=1}return crc=(255&crc)<<8|crc>>8&255,65535&crc}resolveResponse(value,callback){const intArr=Array.prototype.map.call(new Uint8Array(value),x=>("00"+x.toString(16)).slice(-2));if(intArr.length>0){if(null==this.receiveLength){const intArr=Array.prototype.map.call(new Uint8Array(value),x=>x);this.receiveLength=intArr[7]+10}this.readValue=this.readValue.concat(intArr),this.readValue.length==this.receiveLength&&(callback([...this.readValue]),this.readValue=[],this.receiveLength=null)}else this.readValue=[],this.receiveLength=null}getHostData(values){if(1!=values[0]||80!=values[1])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2)),summarizedVoltage=format([data[0],data[1]],.01,0,2),summarizedElectricity=function(value,n,offset,scope=2){const el=1*["0x",...value].join("");return((32768&el?el-65536:el)*n+offset).toFixed(scope)}([data[2],data[3]],.1,0,2),soc=socFormat([data[4],data[5]],1,0),soh=format([data[6],data[7]],1,0,0),envTemperature=kelvinToCelsius(format([data[8],data[9]],.1,0,2)),maxVoltage=format([data[10],data[11]],.001,0,3),minVoltage=format([data[12],data[13]],.001,0,3),maxTemperature=kelvinToCelsius(format([data[14],data[15]],.1,0,2)),minTemperature=kelvinToCelsius(format([data[16],data[17]],.1,0,2)),[dischangeMos,changeMos,dischangeState,changeState]=formatBools([data[18],data[19]],0,0,0,4),restCapacity=format([data[20],data[21]],.1,0,2),fullCapacity=format([data[22],data[23]],.1,0,2),PACK_DATA_paralleNum=[data[24],data[25]].join(""),PACK_DATA_paralleState=[data[26],data[27]].join(""),paralleNum=format([data[24],data[25]],1,0,0);return{summarizedVoltage:summarizedVoltage,summarizedElectricity:summarizedElectricity,soc:soc,soh:soh,envTemperature:envTemperature,maxVoltage:maxVoltage,minVoltage:minVoltage,maxTemperature:maxTemperature,minTemperature:minTemperature,dischangeMos:dischangeMos,changeMos:changeMos,dischangeState:dischangeState,changeState:changeState,restCapacity:restCapacity,fullCapacity:fullCapacity,paralleNum:paralleNum,paralleState:formatBools([data[26],data[27]],0,0,0,paralleNum),cycleNum:format([data[28],data[29]],1,0,0),protectionInfo:formatBools([data[30],data[31],data[32],data[33]],0,0,0,28),maxMonomerNum:format([data[35]],1,0),minMonomerNum:format([data[37]],1,0),maxTemperatureNum:format([data[39]],1,0),minTemperatureNum:format([data[41]],1,0),can:format([data[42],data[43]],1,0),rs485:format([data[44],data[45]],1,0),PACK_DATA_paralleNum:PACK_DATA_paralleNum,PACK_DATA_paralleState:PACK_DATA_paralleState}}getBaseInfo(values){if(120!=values[1]||16!=values[2])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2)),summarizedVoltage=format([data[0],data[1]],.01,0,2),summarizedElectricity=format([data[4],data[5],data[6],data[7]],.01,-3e3,2),soc=socFormat([data[8],data[9]],.01,0),restCapacity=format([data[10],data[11]],.01,0,2),fullCapacity=format([data[12],data[13]],.01,0,2),nominalCapacity=format([data[14],data[15]],.01,0,2),mosTemperature=format([data[16],data[17]],.1,-50,2),envTemperature=format([data[18],data[19]],.1,-50,2),state=format([data[20],data[21]],1,0),soh=format([data[22],data[23]],1,0),protectionInfo=formatBools([data[24],data[25],data[26],data[27]],0,0,0,28),warningInfo=formatBools([data[28],data[29],data[30],data[31]],0,0,0,19),[dischangeMos,changeMos,preChangeState,hotState,fanState,dryContact1,dryContact2,limitedModule]=formatBools([data[32],data[33]],0,0,0,8),cycleNum=format([data[36],data[37]],1,0,0),maxMonomerNum=format([data[38],data[39]],1,0),maxVoltage=format([data[40],data[41]],.001,0,3),minMonomerNum=format([data[42],data[43]],1,0),minVoltage=format([data[44],data[45]],.001,0,3),maxTemperatureNum=format([data[48],data[49]],1,0),maxTemperature=format([data[50],data[51]],.1,-50,2),minTemperatureNum=format([data[52],data[53]],1,0),minTemperature=format([data[54],data[55]],.1,-50,2),cellNum=format([data[66],data[67]],1,0),cellVoltages=[...Array(cellNum)].map((_,i)=>format([data[68+2*i],data[69+2*i]],.001,0,3)),n=68+2*cellNum,temperatureNum=format([data[n],data[n+1]],1,0),m=n+2,temperatures=[...Array(temperatureNum)].map((_,i)=>format([data[m+2*i],data[m+1+2*i]],.1,-50,2)),q=m+2*temperatureNum;return{summarizedVoltage:summarizedVoltage,summarizedElectricity:summarizedElectricity,soc:soc,restCapacity:restCapacity,fullCapacity:fullCapacity,nominalCapacity:nominalCapacity,mosTemperature:mosTemperature,envTemperature:envTemperature,state:state,soh:soh,protectionInfo:protectionInfo,warningInfo:warningInfo,dischangeMos:dischangeMos,changeMos:changeMos,preChangeState:preChangeState,hotState:hotState,fanState:fanState,dryContact1:dryContact1,dryContact2:dryContact2,limitedModule:limitedModule,cycleNum:cycleNum,maxMonomerNum:maxMonomerNum,maxVoltage:maxVoltage,minMonomerNum:minMonomerNum,minVoltage:minVoltage,maxTemperatureNum:maxTemperatureNum,maxTemperature:maxTemperature,minTemperatureNum:minTemperatureNum,minTemperature:minTemperature,cellNum:cellNum,cellVoltages:cellVoltages,temperatureNum:temperatureNum,temperatures:temperatures,cellEquilibriumInfo:formatBools([data[q],data[q+1],data[q+2],data[q+3]],0,0,0,cellNum)}}getProtectionParams(values){if(120!=values[1]||24!=values[2])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2)),n=148,m=160,q=172,o=184,p=196;return{monomerOverVoltageWarning:format([data[0],data[1]],1,0,0),monomerOverVoltageRecovery:format([data[2],data[3]],1,0,0),monomerOverVoltageDelay:format([data[4],data[5]],1,0,0),monomerOverVoltageProtection:format([data[6],data[7]],1,0,0),monomerOverVoltageProtectionRecovery:format([data[8],data[9]],1,0,0),monomerOverVoltageProtectionDelay:format([data[10],data[11]],1,0,0),monomerUnderVoltageWarning:format([data[12],data[13]],1,0,0),monomerUnderVoltageRecovery:format([data[14],data[15]],1,0,0),monomerUnderVoltageDelay:format([data[16],data[17]],1,0,0),monomerUnderVoltageProtection:format([data[18],data[19]],1,0,0),monomerUnderVoltageProtectionRecovery:format([data[20],data[21]],1,0,0),monomerUnderVoltageProtectionDelay:format([data[22],data[23]],1,0,0),collectivityOverVoltageWarning:format([data[24],data[25]],.01,0,1),collectivityOverVoltageRecovery:format([data[26],data[27]],.01,0,1),collectivityOverVoltageDelay:format([data[28],data[29]],1,0,0),collectivityOverVoltageProtection:format([data[30],data[31]],.01,0,1),collectivityOverVoltageProtectionRecovery:format([data[32],data[33]],.01,0,1),collectivityOverVoltageProtectionDelay:format([data[34],data[35]],1,0,0),collectivityUnderVoltageWarning:format([data[36],data[37]],.01,0,1),collectivityUnderVoltageRecovery:format([data[38],data[39]],.01,0,1),collectivityUnderVoltageDelay:format([data[40],data[41]],1,0,0),collectivityUnderVoltageProtection:format([data[42],data[43]],.01,0,1),collectivityUnderVoltageProtectionRecovery:format([data[44],data[45]],.01,0,1),collectivityUnderVoltageProtectionDelay:format([data[46],data[47]],1,0,0),chargeOverElectricityWarning:format([data[48],data[49]],.1,0,2),chargeOverElectricityRecovery:format([data[50],data[51]],.1,0,2),chargeOverElectricityDelay:format([data[52],data[53]],1,0,2),chargeOverElectricityProtection:format([data[54],data[55]],.1,0,2),chargeOverElectricityProtectionDelay:format([data[56],data[57]],1,0,0),chargeOverElectricityRecoveryDelay:format([data[58],data[59]],1,0,0),chargeOverElectricityLockNum:format([data[60],data[61]],1,0,0),chargeOverElectricity2Protection:format([data[62],data[63]],.1,0,2),chargeOverElectricity2ProtectionDelay:format([data[64],data[65]],1,0,0),chargeOverElectricity2RecoveryDelay:format([data[66],data[67]],1,0,0),dischargeOverElectricityWarning:format([data[68],data[69]],.1,0,2),dischargeOverElectricityRecovery:format([data[70],data[71]],.1,0,2),dischargeOverElectricityDelay:format([data[72],data[73]],1,0,0),dischargeOverElectricityProtection:format([data[74],data[75]],.1,0,2),dischargeOverElectricityProtectionDelay:format([data[76],data[77]],1,0,0),dischargeOverElectricityRecoveryDelay:format([data[78],data[79]],1,0,0),dischargeOverElectricityLockNum:format([data[80],data[81]],1,0,0),dischargeOverElectricity2Protection:format([data[82],data[83]],.1,0,2),dischargeOverElectricity2ProtectionDelay:format([data[84],data[85]],1,0,0),dischargeOverElectricity2RecoveryDelay:format([data[86],data[87]],1,0,0),chargeHighTemperatureWarning:format([data[88],data[89]],.1,-50,2),chargeHighTemperatureRecovery:format([data[90],data[91]],.1,-50,2),chargeHighTemperatureDelay:format([data[92],data[93]],1,0,0),chargeHighTemperatureProtection:format([data[94],data[95]],.1,-50,2),chargeHighTemperatureProtectionRecovery:format([data[96],data[97]],.1,-50,2),chargeHighTemperatureProtectionDelay:format([data[98],data[99]],1,0,0),chargeLowTemperatureWarning:format([data[100],data[101]],.1,-50,2),chargeLowTemperatureRecovery:format([data[102],data[103]],.1,-50,2),chargeLowTemperatureDelay:format([data[104],data[105]],1,0,0),chargeLowTemperatureProtection:format([data[106],data[107]],.1,-50,2),chargeLowTemperatureProtectionRecovery:format([data[108],data[109]],.1,-50,2),chargeLowTemperatureProtectionDelay:format([data[110],data[111]],1,0,0),dischargeHighTemperatureWarning:format([data[112],data[113]],.1,-50,2),dischargeHighTemperatureRecovery:format([data[114],data[115]],.1,-50,2),dischargeHighTemperatureDelay:format([data[116],data[117]],1,0,0),dischargeHighTemperatureProtection:format([data[118],data[119]],.1,-50,2),dischargeHighTemperatureProtectionRecovery:format([data[120],data[121]],.1,-50,2),dischargeHighTemperatureProtectionDelay:format([data[122],data[123]],1,0,0),dischargeLowTemperatureWarning:format([data[124],data[125]],.1,-50,2),dischargeLowTemperatureRecovery:format([data[126],data[127]],.1,-50,2),dischargeLowTemperatureDelay:format([data[128],data[129]],1,0,0),dischargeLowTemperatureProtection:format([data[130],data[131]],.1,-50,2),dischargeLowTemperatureProtectionRecovery:format([data[132],data[133]],.1,-50,2),dischargeLowTemperatureProtectionDelay:format([data[134],data[135]],1,0,0),mosHighTemperatureWarning:format([data[136],data[137]],.1,-50,2),mosHighTemperatureRecovery:format([data[138],data[139]],.1,-50,2),mosHighTemperatureDelay:format([data[140],data[141]],1,0,0),mosHighTemperatureProtection:format([data[142],data[143]],.1,-50,2),mosHighTemperatureProtectionRecovery:format([data[144],data[145]],.1,-50,2),mosHighTemperatureProtectionDelay:format([data[146],data[147]],1,0,0),envHighTemperatureWarning:format([data[n],data[149]],.1,-50,2),envHighTemperatureRecovery:format([data[150],data[151]],.1,-50,2),envHighTemperatureDelay:format([data[152],data[153]],1,0,0),envHighTemperatureProtection:format([data[154],data[155]],.1,-50,2),envHighTemperatureProtectionRecovery:format([data[156],data[157]],.1,-50,2),envHighTemperatureProtectionDelay:format([data[158],data[159]],1,0,0),envLowTemperatureWarning:format([data[m],data[161]],.1,-50,2),envLowTemperatureRecovery:format([data[162],data[163]],.1,-50,2),envLowTemperatureDelay:format([data[164],data[165]],1,0,0),envLowTemperatureProtection:format([data[166],data[167]],.1,-50,2),envLowTemperatureProtectionRecovery:format([data[168],data[169]],.1,-50,2),envLowTemperatureProtectionDelay:format([data[170],data[171]],1,0,0),overTemperatureRangeWarning:format([data[q],data[173]],.1,0,2),overTemperatureRangeRecovery:format([data[174],data[175]],.1,0,2),overTemperatureRangeDelay:format([data[176],data[177]],1,0,0),overTemperatureRangeProtection:format([data[178],data[179]],.1,0,2),overTemperatureRangeProtectionRecovery:format([data[180],data[181]],.1,0,2),overTemperatureRangeProtectionDelay:format([data[182],data[183]],1,0,0),overVoltageRangeWarning:format([data[o],data[185]],1,0,0),overVoltageRangeRecovery:format([data[186],data[187]],1,0,0),overVoltageRangeDelay:format([data[188],data[189]],1,0,0),overVoltageRangeProtection:format([data[190],data[191]],1,0,0),overVoltageRangeProtectionRecovery:format([data[192],data[193]],1,0,0),overVoltageRangeProtectionDelay:format([data[194],data[195]],1,0,0),underSOCRangeWarning:format([data[p],data[197]],1,0),underSOCRangeRecovery:format([data[198],data[199]],1,0),underSOCRangeDelay:format([data[200],data[201]],1,0),underSOCRangeProtection:format([data[202],data[203]],1,0),underSOCRangeProtectionRecovery:format([data[204],data[205]],1,0),underSOCRangeProtectionDelay:format([data[206],data[207]],1,0)}}getParams(values){if(120!=values[1]||28!=values[2])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2));let i=0;const batteryType=format(data.slice(i,i+=2),1,0),batteryTypeName=0==batteryType?"铁锂":1==batteryType?"三元":"",batteryFactory=format(data.slice(i,i+=2),1,0),equilibriumOpenedVoltage=format(data.slice(i,i+=2),1,0),equilibriumOpenedVoltageDeviation=format(data.slice(i,i+=2),1,0),hotOpenedTemperature=format(data.slice(i,i+=2),.1,-50,2),hotClosedTemperature=format(data.slice(i,i+=2),.1,-50,2),fullyChargedCalibrationVoltage=format(data.slice(i,i+=2),.01,0),fullyChargedCalibrationElectricity=format(data.slice(i,i+=2),1,0),bmsBarcode=hexToAscii(data.slice(i,i+=30).join("")),bmsProductionDate_Year=format(data.slice(i,i+=2),1,0),bmsProductionDate_Month=format(data.slice(i,i+=2),1,0),bmsProductionDate_Day=format(data.slice(i,i+=2),1,0),bmsProductionDate=[bmsProductionDate_Year,bmsProductionDate_Month,bmsProductionDate_Day].join("-"),snBarcode=hexToAscii(data.slice(i,i+=30).join("")),packProductionData_Year=format(data.slice(i,i+=2),1,0),packProductionData_Month=format(data.slice(i,i+=2),1,0),packProductionData_Day=format(data.slice(i,i+=2),1,0),factoryCode=hexToAscii(data.slice(i,i+=30).join("")),can=format(data.slice(i,i+=2),1,0),standbySleepVoltage=format(data.slice(i,i+=2),1,0),standbySleepDelay=format(data.slice(i,i+=2),1,0),equilibriumMode=format(data.slice(i,i+=2),1,0);return{batteryType:batteryType,batteryTypeName:batteryTypeName,batteryFactory:batteryFactory,equilibriumOpenedVoltage:equilibriumOpenedVoltage,equilibriumOpenedVoltageDeviation:equilibriumOpenedVoltageDeviation,hotOpenedTemperature:hotOpenedTemperature,hotClosedTemperature:hotClosedTemperature,fullyChargedCalibrationVoltage:fullyChargedCalibrationVoltage,fullyChargedCalibrationElectricity:fullyChargedCalibrationElectricity,bmsBarcode:bmsBarcode,bmsProductionDate_Year:bmsProductionDate_Year,bmsProductionDate_Month:bmsProductionDate_Month,bmsProductionDate_Day:bmsProductionDate_Day,bmsProductionDate:bmsProductionDate,snBarcode:snBarcode,packProductionData_Year:packProductionData_Year,packProductionData_Month:packProductionData_Month,packProductionData_Day:packProductionData_Day,factoryCode:factoryCode,can:can,standbySleepVoltage:standbySleepVoltage,standbySleepDelay:standbySleepDelay,equilibriumMode:equilibriumMode,equilibriumModeName:0==equilibriumMode?"充电均衡":1==batteryType?"静态与充电均衡":"",rs485:format(data.slice(i,i+=2),1,0),canTeport:format(data.slice(i,i+=2),1,0),rs385Teport:format(data.slice(i,i+=2),1,0),standbySleepElectricity:format(data.slice(i,i+=2),.1,0)}}getCalibrationInfo(values){if(120!=values[1]||32!=values[2])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2));let i=0;return{nominalCapacity:format(data.slice(i,i+=2),.01,0,2),fullCapacity:format(data.slice(i,i+=2),.01,0,2),restCapacity:format(data.slice(i,i+=2),.01,0,2),soc:socFormat(data.slice(i,i+=2),.01,0),soh:format(data.slice(i,i+=2),1,0,0),cycleNum:format(data.slice(i,i+=2),1,0,0),cycleAttenuationFactor:format(data.slice(i,i+=2),1,0,0),cycleFactor:format(data.slice(i,i+=2),1,0),cumulativeCharge:format(data.slice(i,i+=4),.1,0),cumulativeDisharge:format(data.slice(i,i+=4),.1,0),batterySelfConsumptionFactor:format(data.slice(i,i+=2),1,0),ocvCalibrationVoltage1:format(data.slice(i,i+=2),1,0),ocvCalibrationSOC1:format(data.slice(i,i+=2),1,0),ocvCalibrationVoltage2:format(data.slice(i,i+=2),1,0),ocvCalibrationSOC2:format(data.slice(i,i+=2),1,0),ocvCalibrationVoltage3:format(data.slice(i,i+=2),1,0),ocvCalibrationSOC3:format(data.slice(i,i+=2),1,0),ocvCalibrationVoltage4:format(data.slice(i,i+=2),1,0),ocvCalibrationSOC4:format(data.slice(i,i+=2),1,0),chargeDemandVoltage:format(data.slice(i,i+=2),.1,0,2),chargeDemandElectricity:format(data.slice(i,i+=2),.1,0,2),dischargeDemandVoltage:format(data.slice(i,i+=2),.1,0,2),dischargeDemandElectricity:format(data.slice(i,i+=2),.1,0,2),batterySerial:format(data.slice(i,i+=1),1,0)}}getVersionInfo(values){if(120!=values[1]||40!=values[2])return null;const data=values.slice(8,values.length-2).map(x=>("00"+x.toString(16)).toUpperCase().slice(-2));let i=0;const bootVersion=format(data.slice(i,i+=2),1,0),hardwareVersion=format(data.slice(i,i+=2),1,0),appMajorVersion=format(data.slice(i,i+=2),1,0),appMinorVersion=format(data.slice(i,i+=2),1,0),appBetaVersion=format(data.slice(i,i+=2),1,0),protocolVersion=format(data.slice(i,i+=2),1,0),hardwareName=hexToAscii(data.slice(i,i+=16).join("")),projectName=hexToAscii(data.slice(i,i+=16).join("")),appVersion=[projectName,appMajorVersion,appMinorVersion,appBetaVersion].join(".");return{bootVersion:bootVersion,hardwareVersion:hardwareVersion,appBetaVersion:appBetaVersion,appVersion:appVersion,protocolVersion:protocolVersion,hardwareName:hardwareName,projectName:projectName,firmwaeVersion:appVersion}}}export{HostProtocol};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{decimalToTwoByteHexArray,decimalToHex}from"../BleDataProcess.js";import{getDDA5FAAsync,enterFactory,getDDA5OldAsync,setDDA5FAAsync,setDDA5OldAsync,existFactory,readExistFactory}from"./BleCmdDD.js";const readParamCmd=(chipType,deviceId,paramInfo,needFactoryMode=!0)=>(console.log("chipType: ",chipType),new Promise(async(resolve,reject)=>{const{address:address=0,length:length=1,oldAddress:oldAddress="0x1f"}=paramInfo,hexAddress=decimalToTwoByteHexArray(address),hexLength=decimalToHex(length),handleRead=async(readFunction,index)=>{try{const hex=await readFunction();if(4==index&&needFactoryMode&&await readExistFactory(deviceId),!hex)return void resolve(null);const data=hex.slice(index,-3);console.log("data: 读参数",data),resolve(data||null)}catch(error){console.error("读取参数出错: ",error),reject(error)}};try{if(chipType)await handleRead(async()=>await getDDA5FAAsync(deviceId,hexAddress,hexLength),7);else{if(!oldAddress)return resolve(null);needFactoryMode&&await enterFactory(deviceId),await handleRead(async()=>await getDDA5OldAsync(deviceId,oldAddress),4)}}catch(error){console.error("读取参数出错---: ",error),reject(error)}})),getSysParamCmd=async(chipType,deviceId,paramInfo,needFactoryMode=!0)=>{try{console.log("paramInfo: ",paramInfo);const paramObj={address:paramInfo.paramNo,length:paramInfo.paramLength/2,oldAddress:paramInfo.oldParamNo};let data=await readParamCmd(chipType,deviceId,paramObj,needFactoryMode);return data||null}catch(error){throw console.error("error: 读系统参数报错 getSysParamCmd",error),error}},setSysParamCmd=async(chipType,deviceId,paramInfoArray)=>{try{console.log("paramInfoArray: ",paramInfoArray);const paramsToProcess=Array.isArray(paramInfoArray)?paramInfoArray:[paramInfoArray],paramObjs=[];for(const paramInfo of paramsToProcess){let value=Math.round(Number(paramInfo?.paramValue||paramInfo.newValue)/Number(paramInfo?.divisor||1));console.log("value: ",value),paramInfo.isTemp&&(value=2731+10*Number(paramInfo.newValue));const valuesHexs=decimalToTwoByteHexArray(value);console.log("valuesHexs: ",valuesHexs),paramObjs.push({address:paramInfo.paramNo,length:paramInfo.paramLength/2,values:valuesHexs,oldAddress:paramInfo.oldParamNo})}await setParamCmd(chipType,deviceId,paramObjs)}catch(error){throw console.error("error: 写系统参数报错 setSysParamCmd",error),error}},setParamCmd=(chipType,deviceId,paramInfoArray)=>{console.log("chipType: 芯片",chipType);const paramsToProcess=Array.isArray(paramInfoArray)?paramInfoArray:[paramInfoArray];return new Promise(async(resolve,reject)=>{try{await enterFactory(deviceId);const results=[];for(let i=0;i<paramsToProcess.length;i++){const paramInfo=paramsToProcess[i],{address:address,length:length,values:values,oldAddress:oldAddress}=paramInfo,hexAddress=decimalToTwoByteHexArray(address),hexLength=decimalToHex(length);let hex;if(hex=chipType?await setDDA5FAAsync(deviceId,hexAddress,hexLength,values):await setDDA5OldAsync(deviceId,oldAddress,values),console.log(`data: 写入第${i+1}个参数结果`,hex),!hex)throw new Error(`设置第${i+1}个参数失败`);results.push(hex)}await existFactory(deviceId),resolve(results)}catch(error){console.error("设置参数出错: ",error);try{await existFactory(deviceId)}catch(exitError){console.error("退出工厂模式失败: ",exitError)}reject(error)}})},setCapacityParamCmd=(chipType,deviceId,paramInfo)=>(console.log("chipType: 芯片",chipType),new Promise(async(resolve,reject)=>{const{values:values}=paramInfo,circular={address:1,oldAddress:"0x11",values:.8*values,length:1},full={address:112,oldAddress:"0x10",values:values,length:1},handleSet=async(setFunction,index)=>{try{const hex=await setFunction();return console.log("data: 写入参数结果",hex),hex||void reject("设置参数失败")}catch(error){console.error("设置参数出错: ",error),reject(error)}},handleParam=async paramObj=>{const{address:address,oldAddress:oldAddress,length:length}=paramObj,hexValues=decimalToTwoByteHexArray(100*Number(paramObj.values)),hexAddress=decimalToTwoByteHexArray(address),hexLength=decimalToHex(length);return chipType?await handleSet(()=>setDDA5FAAsync(deviceId,hexAddress,hexLength,hexValues)):await handleSet(()=>setDDA5OldAsync(deviceId,oldAddress,hexValues))};try{await enterFactory(deviceId);const paramInfoHex=await handleParam(paramInfo);await handleParam(circular);if(chipType){await handleParam(full)}await existFactory(deviceId),paramInfoHex&&resolve(paramInfoHex)}catch(error){reject(error)}}));export{getSysParamCmd,readParamCmd,setCapacityParamCmd,setParamCmd,setSysParamCmd};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import BleDataProcess from"./BleDataProcess.js";import{getOS,eventBus}from"./commonfun.js";class BleCmdAnalysis extends BleDataProcess{static async _writeAsync(deviceId,value){return console.log("deviceId, value: ",deviceId,value),!(!deviceId||!value)&&new Promise(resolve=>{const characteristicId=this.UUID_WRITE,{isAndroid:isAndroid,isIOS:isIOS}=getOS();console.log("isAndroid, isIOS: ",isAndroid,isIOS);const writeType=isAndroid?"writeNoResponse":"write";uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:this.serviceId,characteristicId:characteristicId,writeType:writeType,value:value,success:res=>{console.error("res: 写入成功",res),resolve(!0)},fail:e=>{console.error("写入失败",e),resolve(!1)}}),isIOS&&setTimeout(()=>resolve(!0),50)})}static async writeAsync(deviceId,value){return console.log("value: ",value),console.log("deviceId: ",deviceId),!(!deviceId||!value)&&new Promise(async resolve=>{const n=Math.ceil(value.byteLength/20);let res;for(let i=0;i<n;i++){const _value=value.slice(20*i,20*(i+1));if(console.log("分包写入_value: ",_value),await this.sleep(150),res=await this._writeAsync(deviceId,_value),console.log(`分包写入结果 ${i+1}/${n} : ${res}`),!res)return resolve(!1)}resolve(res)})}static async getData(deviceId,{command:command,commandVerifyHandler:commandVerifyHandler=hexArr=>({verified:!1,pkgLen:null}),pkgVerifyHandler:pkgVerifyHandler=pkg=>({verified:!1}),maxRetries:maxRetries=2,retryInterval:retryInterval=300},tag=""){if(!deviceId)throw new Error("deviceId is required");if(!command||command.length<=0)throw new Error("command is required");return new Promise((resolve,reject)=>{let isCompleted=!1,timeoutId=null,responsed=!1,len=null,pkg=[];const cmdContent=this.hexArr2ab(command),cleanup=()=>{isCompleted||(isCompleted=!0,clearTimeout(timeoutId),eventBus.off("setBleChangedCharacteristicValue",dataHandler))},dataHandler=payload=>{if(!payload||payload.deviceId!==deviceId||!payload.value)return;const hexArr=this.ab2decimalArr(payload.value);if(console.warn(tag,"接收到数据:",this.hexArr2string(hexArr)),0!==hexArr.length){if(null===len){const{verified:verified,pkgLen:pkgLen}=commandVerifyHandler(hexArr);console.log("指令验证结果:",{verified:verified,pkgLen:pkgLen}),verified&&(len=pkgLen)}if(len){if(pkg=[...pkg,...hexArr],console.log("当前数据包:",pkg,`长度: ${pkg.length}/${len}`),pkg.length>=len){pkg=pkg.slice(0,len);const{verified:verified}=pkgVerifyHandler(pkg);console.log("数据包验证结果:",{verified:verified}),verified?(responsed=!0,cleanup(),resolve([...pkg])):(len=null,pkg=[])}}else pkg=[]}},writeToDevice=async(attempt=1)=>{try{console.warn(tag,`第${attempt}次写入指令:`,command.join("").replace(/0x/g,"").toUpperCase());const writeSucceed=await this.writeAsync(deviceId,cmdContent);if(console.warn(tag,`第${attempt}次写入结果:`,writeSucceed?"成功":"失败"),!writeSucceed)return void(attempt<maxRetries?setTimeout(()=>writeToDevice(attempt+1),retryInterval):(cleanup(),resolve(null)));await this.sleep(retryInterval),!responsed&&attempt<maxRetries?(console.log(tag,`未收到响应,准备第${attempt+1}次重试`),writeToDevice(attempt+1)):responsed||(console.warn(tag,`达到最大重试次数(${maxRetries}),未收到响应`),cleanup(),resolve(null))}catch(error){console.error(tag,"写入过程发生错误:",error),cleanup(),reject(error)}};timeoutId=setTimeout(()=>{console.warn(tag,"操作超时"),cleanup(),resolve(null)},(maxRetries+2)*retryInterval),eventBus.on("setBleChangedCharacteristicValue",dataHandler),writeToDevice().catch(error=>{cleanup(),reject(error)})})}static async getDDA503Async(deviceId){const hex=await this.getData(deviceId,{command:["0xdd","0xa5","0x03","0x00","0xff","0xfd","0x77"],commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&3==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>{const len=pkg.length,[c1,c2]=this.generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_03");return hex?this.resolveDDA503(hex):null}static resolveDDA503(data){if(!data)return null;const dataStr=this.hexArr2string(data),content=data.slice(4,data.length-3),binArr=data[24].toString(2).padStart(8,"0").split("").reverse(),n=Number(binArr[7])?10:100,fet=data[24],chargeSwitch=1==fet||3==fet,dischargeSwitch=2==fet||3==fet,BMSVersion=this.decimalToHex(data[22]),totalVoltage=(((data[4]<<8)+(255&data[5]))/100).toFixed(2);let current=(data[6]<<8)+(255&data[7]);current=current>32768?(current-65536)/n:current/n;const electricity=Number(current.toFixed(2)),power=(parseFloat(totalVoltage)*electricity).toFixed(2),soc=data[23]??0,volumeHex=this.decimalToHex(data[8])+this.decimalToHex(data[9]),seriesNum=data[25]??0,surplusCapacity=Number((this.hexToDecimal(volumeHex)/n).toFixed(2)),normCapHex=this.decimalToHex(data[10])+this.decimalToHex(data[11]),normCap=Number((this.hexToDecimal(normCapHex)/n).toFixed(2)),humidityIndex=2*data[26]+27,humidity=data[humidityIndex],cycleHex=this.decimalToHex(data[12])+this.decimalToHex(data[13]),cycleIndex=this.hexToDecimal(cycleHex),fccHex=this.decimalToHex(data[humidityIndex+3])+this.decimalToHex(data[humidityIndex+4]),fullChargeCapacity=10*this.hexToDecimal(fccHex)/1e3,SOH=cycleIndex<=100?100:Math.min(100,fullChargeCapacity/normCap*100),isHeating=!!Number(binArr[4]);let heatingCurrent=0;if(isHeating){const i=humidityIndex+9;heatingCurrent=10*parseInt([data[i],data[i+1]].map(o=>o.toString(16)).join(""),16)}const isFactoryMode=!!Number(binArr[6]),equilibriumStatus=!(0===data[16]&&0===data[17]),protectStatus=!(0===data[20]&&0===data[21]),protectStateHex=this.decimalToHex(data[20])+this.decimalToHex(data[21]),protectState=this.hexToDecimal(protectStateHex);let protectStatusIndexs=[];for(let i=0;i<16;i++)protectState&1<<i&&protectStatusIndexs.push(i);const protectStatusIndex=protectStatusIndexs.join(","),ntcNums=255&data[26],temperaturesList=Array.from({length:ntcNums},(_,i)=>((256*(255&data[26+2*i+1])+(255&data[26+2*i+2])-2731)/10).toFixed(1)),fahTempList=[];return temperaturesList.forEach(el=>{const value=1.8*Number(el)+32;fahTempList.push(value.toFixed(1))}),{dataStr:dataStr,status:this.hex2string(data[2]),len:data[3],softwareV:this.hex2string(content[18]),chargeSwitch:chargeSwitch,dischargeSwitch:dischargeSwitch,BMSVersion:BMSVersion,totalVoltage:totalVoltage,electricity:electricity,power:power,soc:soc,surplusCapacity:surplusCapacity,normCap:normCap,humidity:humidity,cycleIndex:cycleIndex,fullChargeCapacity:fullChargeCapacity,SOH:SOH,isHeating:isHeating,heatingCurrent:heatingCurrent,isFactoryMode:isFactoryMode,equilibriumStatus:equilibriumStatus,protectStatus:protectStatus,protectStatusIndex:protectStatusIndex,ntcNums:ntcNums,temperaturesList:temperaturesList,fahTempList:fahTempList,fet:fet,seriesNum:seriesNum}}static getFFAA17Async(deviceId){return this.getData(deviceId,{command:["0xFF","0xAA","0x17","0x00","0x17"],commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&23==hexArr[2],pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>this.hex2string(o)),len=pkg.length,[c1]=this.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_17(获取随机数)")}static getFFAAKeyAsync(deviceId,code,content,type){const commandCode=[code],data=[...content],dataLength=[`0x${this.decimalToHex(data.length,2)}`],check=this.generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return console.log("command: ---------------",command),this.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&hexArr[2]==this.hexToDecimal(code),pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>this.hex2string(o)),len=pkg.length,[c1]=this.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},`FFAA_${code}(${type})`)}static resolveFFAAKey(data){if(!data)return null;const dataStr=this.hexArr2string(data),response=data[data.length-2];return{dataStr:dataStr,response:response,status:response}}static getBroadcastDataCmd(deviceId){return this.getFFAAKeyAsync(deviceId,"0x19",["0x01"],"广播数据")}static getDD5AE1Async(deviceId,value){const _command=["0xE1","0x02","0x00",value],checks=this.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return this.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&225==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E1")}}export{BleCmdAnalysis,BleCmdAnalysis as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const crc16modbus=(data,swapNeed=!1)=>{let crc=65535;for(let i=0;i<data.length;i++){crc^=data[i];for(let j=0;j<8;j++)1&crc?crc=crc>>1^40961:crc>>=1}return swapNeed&&(crc=(255&crc)<<8|crc>>8&255),65535&crc},generateCrc16modbusCheck=(data,swapNeed=!1)=>{const hex=crc16modbus(data,swapNeed),hexStr=decimalToHex(hex,4);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]},crcCheckSum=(data,offset=1)=>{console.log("data: --------",data);let hex=0;for(let i=0;i<data.length;i++)hex+=255&data[i];return hex^=65535,hex+=offset,console.log("hex: -------------",hex),hex},generateCrcCheckSum=data=>{const hex=crcCheckSum(data),hexStr=decimalToHex(hex,4);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]},checkSum=(data=[])=>{const sum=data.map(o=>parseInt(o,16)).reduce((a,c)=>a+c,0);let sumHex="0x"+decimalToHex(sum,2);return sumHex&=255,sumHex},generateCheckSum=data=>{const hex=checkSum(data);return[`0x${decimalToHex(hex,2)}`]},ab2decimalArr=buffer=>Array.prototype.map.call(new Uint8Array(buffer),bit=>bit),ab2hex=buffer=>Array.prototype.map.call(new Uint8Array(buffer),function(bit){return("00"+bit.toString(16)).slice(-2)}).join(""),arrayBufferToHexArray=(arrayBuffer,withPrefix=!0)=>Array.prototype.map.call(new Uint8Array(arrayBuffer),x=>{let hex=("00"+x.toString(16)).slice(-2);return withPrefix?`0x${hex}`:hex}),base64ToHexArray=(base64,withPrefix=!0)=>{const arrayBuffer=uni.base64ToArrayBuffer(base64);return arrayBufferToHexArray(arrayBuffer,withPrefix)},hexArrayToModuleArrayBuffer=(fields,hexArray,withCheck=!0,withPrefix=!0)=>{const fieldsLength=fields.length;let offset=fieldsLength+1;withCheck&&offset++;let bufferLength=hexArray.length+offset;const buffer=new ArrayBuffer(bufferLength),dataView=new DataView(buffer),lengthCode=decimalToHex(hexArray.length);fields.forEach((field,i)=>{dataView.setUint8(i,field)}),dataView.setUint8(fieldsLength,"0x"+lengthCode);let indexNum=fieldsLength+1;if(hexArray.forEach((el,index)=>{dataView.setUint8(indexNum,withPrefix?"0x"+el:el),indexNum+=1}),withCheck){const code=fields[2].toString(16);let check=generateCheckSum([code,lengthCode,...hexArray]);dataView.setUint8(bufferLength-1,check[0])}return buffer},getParamBaseValue=arr=>{const hexString=arr.map(el=>decimalToHex(el)).join("");return parseInt(hexString,16)},decimalToHex=(decimal,padding=2)=>Number(decimal).toString(16).padStart(padding,"0"),decimalToHex0x=(decimal,padding=2)=>"0x"+Number(decimal).toString(16).padStart(padding,"0"),hexToDecimal=hex=>parseInt(hex,16),hexArr2ab=hexArr=>{const buffer=new ArrayBuffer(hexArr.length),dataView=new DataView(buffer);return hexArr.forEach((hex,i)=>dataView.setUint8(i,hex)),buffer},hex2string=hex=>("00"+hex.toString(16)).slice(-2).toUpperCase(),string2hexArr=str=>{let hexArray=[];for(let i=0;i<str.length;i++){const charCode=str.charCodeAt(i).toString(16).padStart(2,"0");hexArray.push(charCode)}return hexArray},hexArr2Assic=(hexArr=[])=>String.fromCharCode(...hexArr).replace(/\u0000/g,""),hexStrAscii=hexString=>{let asciiString="";for(let i=0;i<hexString.length;i+=2){const hexPair=hexString.substr(i,2),decimalValue=parseInt(hexPair,16);asciiString+=String.fromCharCode(decimalValue)}return asciiString.replace(/\u0000/g,"")},hex2Ascii=(value=[])=>{const hexString=value.join("");return hexStrAscii(hexString)},hexArr2string=(hexArr=[],connector="")=>hexArr.map(o=>hex2string(o)).join(connector),hex2Binary=(hex,len=0)=>parseInt(hex,16).toString(2).padStart(len,"0"),extractBits=(number,start,end)=>number>>start&(1<<end-start+1)-1,sleep=(n=500)=>new Promise(r=>setTimeout(()=>r(!0),n)),decimalToTwoByteHexArray=decimal=>{if("number"!=typeof decimal||!Number.isInteger(decimal))throw new Error("输入必须为整数");if(decimal<0||decimal>65535)throw new Error("输入的十进制数超出 16 位无符号整数范围(0 - 65535)");return[`0x${`00${(decimal>>8).toString(16)}`.slice(-2)}`,`0x${`00${(255&decimal).toString(16)}`.slice(-2)}`]},stringToTwoHexArray=str=>{const paddedStr=str.padStart(4,"0");return[`0x${paddedStr.slice(0,2)}`,`0x${paddedStr.slice(2,4)}`]},hexStringToBinary=hexString=>parseInt(hexString,16).toString(2);export{ab2decimalArr,ab2hex,arrayBufferToHexArray,base64ToHexArray,checkSum,crc16modbus,crcCheckSum,decimalToHex,decimalToHex0x,decimalToTwoByteHexArray,extractBits,generateCheckSum,generateCrc16modbusCheck,generateCrcCheckSum,getParamBaseValue,hex2Ascii,hex2Binary,hex2string,hexArr2Assic,hexArr2ab,hexArr2string,hexArrayToModuleArrayBuffer,hexStrAscii,hexStringToBinary,hexToDecimal,sleep,string2hexArr,stringToTwoHexArray};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getOS}from"./commonfun.js";import{TelinkApi}from"./TelinkApi.js";import{BLE,Transfer}from"./Transfer.js";const max=BLE.PACKAGE_MAX_LENGTH,delayDefault=BLE.WRITE_DELAY,{isIOS:isIOS,isAndroid:isAndroid}=getOS();class OTAUpgrade{constructor({deviceId:deviceId,filePath:filePath,otaInfo:otaInfo,otaStart:otaStart,otaReStart:otaReStart,macAddr:macAddr,onProgress:onProgress,onSuccess:onSuccess,onError:onError,delay:delay,platform:platform="APP"}){this.deviceId=deviceId,this.filePath=filePath,this.otaInfo=otaInfo,this.otaStart=otaStart,this.otaReStart=otaReStart,this.macAddr=macAddr,this.platform=platform,this.isTeLink=!!TelinkApi.isTeLink&&TelinkApi.isTeLink(macAddr),this.onProgress=onProgress,this.onSuccess=onSuccess,this.onError=onError,this.delay=delay||delayDefault,this.fileHexArray=[],this.totalTimes=1,this.finishedTimes=0,this.succeed=!1,this.ready=!0,this.timer=null,this.s_progress=0,this.progressType="download"}async start(){this.progressType="download";try{await this.download()}catch(e){this.fail("下载失败: "+e.message)}}async download(){const that=this;return new Promise((resolve,reject)=>{const downloadTask=uni.downloadFile({url:that.filePath,success:({tempFilePath:tempFilePath})=>{that.resolve(tempFilePath).then(resolve).catch(reject)},fail:res=>{that.fail("固件下载失败"),reject(res)}});downloadTask.onProgressUpdate&&downloadTask.onProgressUpdate(({progress:progress})=>{that.onProgress&&that.onProgress({type:"download",percent:progress})})})}async resolve(tempFilePath){const that=this;return new Promise((resolve,reject)=>{uni.saveFile({tempFilePath:tempFilePath,success:({savedFilePath:savedFilePath})=>{if("APP"===this.platform)plus.io.resolveLocalFileSystemURL(savedFilePath,entry=>{entry.file(file=>{var fileReader=new plus.io.FileReader;fileReader.readAsDataURL(file),fileReader.onloadend=e=>{let base64=e.target.result.split(",")[1];const hexArray=Transfer.base64ToHexArray(base64),times=Math.ceil(hexArray.length/(that.isTeLink?16:max));that.fileHexArray=hexArray,that.totalTimes=times,that.finishedTimes=0,that.progressType="upgrade",that.isTeLink?that.telinkUpgrade():that.normalUpgrade(),resolve()},fileReader.onerror=e=>{that.fail("固件解析失败"),reject(e)}})},err=>{that.fail("固件保存失败"),reject(err)});else if("MP"===this.platform){wx.getFileSystemManager().readFile({filePath:savedFilePath,encoding:"base64",success:res=>{let base64=res.data;const hexArray=Transfer.base64ToHexArray(base64),times=Math.ceil(hexArray.length/(that.isTeLink?16:max));that.fileHexArray=hexArray,that.totalTimes=times,that.finishedTimes=0,that.progressType="upgrade",that.isTeLink?that.telinkUpgrade():that.normalUpgrade(),resolve()},fail:err=>{console.error("[OTA] resolve failed:",JSON.stringify(err)),that.failed("文件解析失败")}})}},fail:res=>{that.fail("固件保存失败"),reject(res)}})})}normalUpgrade(){setTimeout(()=>{BLE.writeATCmd(this.otaInfo,this.deviceId,this.fail.bind(this)),this.addBLECharValueChangeListener()},2600)}telinkUpgrade(){this.write(["0x00","0xff"],0)}write(pkg,type){const value=function(hexArr){const buffer=new ArrayBuffer(hexArr.length),dataView=new DataView(buffer);return hexArr.forEach((hex,i)=>dataView.setUint8(i,hex)),buffer}(pkg.map(o=>parseInt(o,16))),opt={deviceId:this.deviceId,serviceId:"00010203-0405-0607-0809-0a0b0c0d1912",characteristicId:"00010203-0405-0607-0809-0a0b0c0d2b12",value:value,success:()=>this.onSucceed(type),fail:async()=>{await this.sleep(2*this.delay),uni.writeBLECharacteristicValue({...opt,fail:async()=>{await this.sleep(2*this.delay),uni.writeBLECharacteristicValue({...opt,fail:this.fail.bind(this)})}})}};uni.writeBLECharacteristicValue(opt),isIOS&&setTimeout(()=>this.onSucceed(type),5)}onSucceed(type){0==type?this.write(["0x01","0xff"],1):1==type?this.sendNextOtaPacketCommand():2==type?(this.finishedTimes++,this.sendNextOtaPacketCommand()):3==type?this.sendNextOtaPacketCommand():4==type?this.sendOtaEndCommand():5==type&&(this.finishedTimes++,this.succeed=!0,this.onSuccess&&this.onSuccess()),this.onProgress&&this.onProgress({type:"upgrade",percent:Math.floor(100*this.finishedTimes/this.totalTimes)})}async sendNextOtaPacketCommand(){const i=this.finishedTimes,index=TelinkApi.getIndexHexArr(i);let pkgValue=this.fileHexArray.slice(16*i,16*(i+1));pkgValue.length<16&&(pkgValue=pkgValue.concat([...Array(16-pkgValue.length)].map(()=>"0xFF")));const crc=TelinkApi.genCheck([...index,...pkgValue]),pkg=[...index,...pkgValue,...crc],type=i>=this.totalTimes-1?4:2;await this.sleep(this.delay),this.write(pkg,type)}sendOtaEndCommand(){const pkgValue=function(i,c=65282){return[255&c,c>>8&255,255&i,i>>8&255,255&~i,~i>>8&255].map(o=>`0x${`00${o.toString(16)}`.slice(-2)}`.toUpperCase())}(this.totalTimes-1),crc=TelinkApi.genCheck([...pkgValue]),pkg=[...pkgValue,...crc];this.write(pkg,5)}addBLECharValueChangeListener(){const that=this;uni.notifyBLECharacteristicValueChange({deviceId:that.deviceId,serviceId:BLE.serviceId,characteristicId:BLE.readUUID,state:!0,success:()=>{},fail:()=>{}}),that.ready=!0,that.readValue=[],that.receiveLength=null,uni.onBLECharacteristicValueChange(({deviceId:deviceId,serviceId:serviceId,characteristicId:characteristicId,value:value})=>{if(that.ready&&deviceId==that.deviceId&&serviceId==BLE.serviceId){const intArr=Array.prototype.map.call(new Uint8Array(value),x=>x);intArr.length>0&&(null==that.receiveLength&&255==intArr[0]&&170==intArr[1]&&(that.receiveLength=intArr[3]+5),that.receiveLength?(that.readValue=that.readValue.concat(intArr),that.readValue.length==that.receiveLength&&(that.doWithResponse([...that.readValue]),that.readValue=[],that.receiveLength=null)):(that.readValue=[],that.receiveLength=null))}})}async doWithResponse(intArr){if(128==intArr[2]){let str=String.fromCharCode(...intArr.slice(4,-1));if(str.indexOf(this.otaInfo)>-1&&(this.finishedTimes=0,this.transferFirmwareFile()),str.indexOf(this.otaStart)>-1){if(str.toUpperCase().includes("ERROR"))return void this.fail(str);str.toUpperCase().indexOf("S100")>-1&&(this.succeed=!0,this.onSuccess&&this.onSuccess())}}80==intArr[2]&&(0==intArr[4]?(this.finishedTimes++,this.transferFirmwareFile()):this.transferFirmwareFile()),81==intArr[2]&&(0==intArr[4]?this.startOTA():this.fail("升级失败"))}transferFirmwareFile(){let nextTime=this.finishedTimes+1;if(nextTime>this.totalTimes){const pkg=[0];BLE.transferFirmwareFileCmd(this.deviceId,pkg,!0,this.fail.bind(this))}else{const pkg=this.fileHexArray.slice(this.finishedTimes*max,nextTime*max),index=Transfer.decimalToTwoByteHexArray(nextTime);BLE.transferFirmwareFileCmd(this.deviceId,index.concat(pkg),!1,this.fail.bind(this))}this.onProgress&&this.onProgress({type:"upgrade",percent:Math.floor(100*this.finishedTimes/this.totalTimes)})}async startOTA(){BLE.writeATCmd(this.otaStart,this.deviceId,this.fail.bind(this))}fail(msg){this.succeed=!1,this.onError&&this.onError(msg)}sleep(n=50){return new Promise(r=>setTimeout(()=>r(!0),n))}}export{OTAUpgrade,OTAUpgrade as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getChipTypeAsync,getDDA503Async,resolveDDA503}from"./BleCmdAnalysis/BleCmdDD.js";class TelinkApi{static async checkOTAAvailable({deviceId:deviceId,macAddr:macAddr}){const prefix=macAddr.slice(0,8).toUpperCase();try{if("A5:C2:37"==prefix){const socRes=await getChipTypeAsync(deviceId);if(console.warn("芯片类型",socRes),socRes&&5==socRes?.type){const versionHex=await getDDA503Async(deviceId),versionRes=resolveDDA503(versionHex);return console.warn("版本信息",versionRes),!0}}}catch(error){}return!1}static isTeLink({macAddr:macAddr=""}={macAddr:""}){const prefix1=macAddr.slice(0,2).toUpperCase(),prefix=macAddr.slice(0,8).toUpperCase();return"A5"==prefix1||"A4:C1:38"==prefix}static getIndexHexArr(i){return i.toString(16).padStart(4,"0").match(/(.{2})/g)?.reverse().map(o=>`0x${o.toUpperCase()}`)}static crc16modbus(data,swapNeed=!1){let crc=65535;for(let i=0;i<data.length;i++){crc^=data[i];for(let j=0;j<8;j++)1&crc?crc=crc>>1^40961:crc>>=1}return swapNeed&&(crc=(255&crc)<<8|crc>>8&255),65535&crc}static decimalToHex(decimal,padding=4){const hexDigits=[],hexMap={10:"A",11:"B",12:"C",13:"D",14:"E",15:"F"};for(;decimal>0;){const remainder=decimal%16;remainder>=10?hexDigits.unshift(hexMap[remainder]):hexDigits.unshift(`${remainder}`),decimal=Math.floor(decimal/16)}return hexDigits.join("").padStart(padding,"0")}static genCheck(data){const hex=this.crc16modbus(data,!0),hexStr=this.decimalToHex(hex);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]}}export{TelinkApi};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getOS}from"./commonfun.js";const Transfer={hexStringToBinary:hexString=>parseInt(hexString,16).toString(2),inArray(arr,key,val){for(let i=0;i<arr.length;i++)if(arr[i][key]===val)return i;return-1},decimalToHex(decimal,padding=2){const hexDigits=[],hexMap={10:"A",11:"B",12:"C",13:"D",14:"E",15:"F"};for(;decimal>0;){const remainder=decimal%16;remainder>=10?hexDigits.unshift(hexMap[remainder]):hexDigits.unshift(`${remainder}`),decimal=Math.floor(decimal/16)}return hexDigits.join("").padStart(padding,"0")},decimalToHexArray(decimal,padding=2){const inputHex=this.decimalToHex(decimal,padding);return[("0"+inputHex.slice(-4,-2)).slice(-2),("0"+inputHex.slice(-2)).slice(-2)].map(o=>`0x${o}`)},hexToDecimal(hex){let decimal=0;const hexMap={A:10,B:11,C:12,D:13,E:14,F:15};for(let i=0;i<hex.length;i++){const currentDigit=hex[i];decimal=hexMap.hasOwnProperty(currentDigit)?16*decimal+hexMap[currentDigit]:16*decimal+parseFloat(currentDigit,16)}return decimal},arrayBufferToHex(arrayBuffer){return this.arrayBufferToHexArray(arrayBuffer,!1).join("")},arrayBufferToHexArray:(arrayBuffer,withPrefix=!0)=>Array.prototype.map.call(new Uint8Array(arrayBuffer),x=>{let hex=("00"+x.toString(16)).slice(-2);return withPrefix?`0x${hex}`:hex}),areArraysEqual:(arr1,arr2)=>arr1.length===arr2.length&&arr1.every((value,index)=>value===arr2[index]),convertASCIItoHex(asciiVal){let asciiCode=asciiVal.charCodeAt(0);return this.decimalToHex(asciiCode)},getParamCheck(content){let sum=0;for(let i=0;i<content.length;i++)sum+=255&content[i];return sum^=65535,sum+=1,sum=this.decimalToHex(sum),{check1:"0x"+sum.substr(0,2),check2:"0x"+sum.substr(2,2)}},splitNumberToHexArray(decimalNumber){let hexString=decimalNumber.toString(16);hexString=hexString.length%2==0?hexString:"0"+hexString;let hexArray=hexString.match(/.{1,2}/g);for(;hexArray.length<2;)hexArray.unshift("00");return hexArray.map(hex=>"0x"+hex)},base64ToHexArray(base64,withPrefix=!0){const arrayBuffer=uni.base64ToArrayBuffer(base64);return this.arrayBufferToHexArray(arrayBuffer,withPrefix)},decimalToTwoByteHexArray:decimal=>[`0x${("00"+(decimal>>8)).slice(-2)}`,`0x${`00${(255&decimal).toString(16)}`.slice(-2)}`],stringToHexArray(str){const hexArray=[];for(let i=0;i<str.length;i++){let charCode=str.charCodeAt(i).toString(16);charCode=1===charCode.length?"0"+charCode:charCode,hexArray.push(charCode)}return hexArray},getAtValueCheck(cmdCode,lengthCode,hexArray){let sum=0;return hexArray.forEach(hexValue=>{sum+=parseInt(hexValue,16)}),this.getCheck(cmdCode,lengthCode,sum)},getCheck(cmdCode,lengthCode,sum){let checkSum=this.hexToDecimal(cmdCode)+this.hexToDecimal(lengthCode)+sum,codeHex="0x"+this.decimalToHex(checkSum);return codeHex&=255,"0x"+this.decimalToHex(codeHex)},hexArrayToModuleArrayBuffer(fields,hexArray,withCheck=!0,withPrefix=!0){const fieldsLength=fields.length;let offset=fieldsLength+1;withCheck&&offset++;let bufferLength=hexArray.length+offset;const buffer=new ArrayBuffer(bufferLength),dataView=new DataView(buffer),lengthCode=this.decimalToHex(hexArray.length);fields.forEach((field,i)=>{dataView.setUint8(i,field)}),dataView.setUint8(fieldsLength,"0x"+lengthCode);let indexNum=fieldsLength+1;if(hexArray.forEach((el,index)=>{dataView.setUint8(indexNum,withPrefix?"0x"+el:el),indexNum+=1}),withCheck){const code=fields[2].toString(16);let check=this.getAtValueCheck(code,lengthCode,hexArray);dataView.setUint8(bufferLength-1,check)}return buffer}},TAG="[BLE_OTA]",BLE={serviceId:"0000FF00-0000-1000-8000-00805F9B34FB",writeUUID:"0000FF02-0000-1000-8000-00805F9B34FB",readUUID:"0000FF01-0000-1000-8000-00805F9B34FB",TAG:"[BLE_OTA]",WRITE_DELAY:25,PACKAGE_MAX_LENGTH:240,sendMsgToKey(buffer,deviceId,fail){getOS();console.log(TAG,`大包数据: Len=${buffer.byteLength} writeType=writeNoResponse`),console.log(TAG,"写入中..."),uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:"0000FF00-0000-1000-8000-00805F9B34FB",characteristicId:"0000FF02-0000-1000-8000-00805F9B34FB",value:buffer,writeType:"writeNoResponse",success:()=>{console.log(TAG,"写入成功")},fail:res=>{console.log(TAG,"Error-写入失败"),fail?.(JSON.stringify(res))}})},sendDelay:(delay,buffer)=>new Promise((resolve,reject)=>{setTimeout(()=>resolve(buffer),delay)}),sendMsg(deviceId,value,fail){uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:this.serviceId,characteristicId:this.writeUUID,value:value,writeType:"writeNoResponse",success:res=>{console.log("[OTA] sendMsg succeed")},fail:res=>{console.error("[OTA] sendMsg failed",JSON.stringify(res)),fail?.(JSON.stringify(res))}})},sendMsgDelay(delay,deviceId,value,fail){return new Promise((resolve,reject)=>{setTimeout(()=>{uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:this.serviceId,characteristicId:this.writeUUID,value:value,writeType:"writeNoResponse",success:res=>{resolve(!0)},fail:res=>{console.error("[OTA] sendMsg failed",JSON.stringify(res)),resolve(!1)}})},delay)})},retryWarpper(asyncFunc,defaultRetryTime=2,retryInterval=20){let retryTime=defaultRetryTime;const retryCallback=async function(...args){try{return await asyncFunc(...args)}catch(e){if(retryTime<=0)throw e;return console.log(`写入失败,将在 ${retryInterval} 毫秒后重试,剩余重试次数 ${retryTime}`),retryTime-=1,await new Promise(reslove=>setTimeout(reslove,retryInterval)),await retryCallback(...args)}};return retryCallback},write(buffer,deviceId,delay=20){return console.log("write",deviceId,buffer.byteLength),new Promise((resolve,reject)=>setTimeout(()=>{uni.writeBLECharacteristicValue({deviceId:deviceId,serviceId:this.serviceId,characteristicId:this.writeUUID,value:buffer,writeType:"writeNoResponse",success:res=>{resolve("ok")},fail:res=>{reject(JSON.stringify(res))}})},delay))},async loopSendMsg(buffer,deviceId,fail){console.log("loopSendMsg",deviceId,buffer.byteLength);let _this=this;const fetchDataWithRetry=_this.retryWarpper(_this.write);let bytes=buffer.byteLength,pos=0;for(;bytes>0;){let endPos=bytes>20?pos+20:pos+bytes;const tempBuffer=buffer.slice(pos,endPos);pos+=20,bytes-=20;if(!await fetchDataWithRetry(tempBuffer,deviceId,_this.WRITE_DELAY).catch(e=>fail?.(e)))break}},writeATCmd(atValue,deviceId,fail){const hexArray=Transfer.stringToHexArray(atValue+"\r\n");let ab=Transfer.hexArrayToModuleArrayBuffer([255,170,128],hexArray,!0,!0);this.sendMsgToKey(ab,deviceId,fail)},transferFirmwareFileCmd(deviceId,hexArray,isEnd=!1,fail){let ab=Transfer.hexArrayToModuleArrayBuffer([255,170,isEnd?81:80],hexArray,!0,!1);this.sendMsgToKey(ab,deviceId,fail)},formatOTAContent(content){if(""!=content){const[_otaInfo,otaStart,otaReStart]=content.split(";"),[p1,p2,p3,filePath]=_otaInfo.split(",");return{filePath:filePath,otaInfo:_otaInfo.replace(filePath,"local"),otaStart:otaStart,otaReStart:otaReStart}}return null}};class Observer{constructor(exec){this.listeners=new Set,exec({next:value=>this.listeners.forEach(({next:next})=>next&&next(value)),error:err=>this.listeners.forEach(({error:error})=>error&&error(err)),complete:value=>this.listeners.forEach(({complete:complete})=>complete&&complete(value))})}subscribe(listeners){return this.listeners.add(listeners),{unsubscribe:()=>this.listeners.delete(listeners)}}}class Logger{key;temp;constructor(key){this.key=key,this.temp={}}log(...args){console.log(this.key,"[OTA] ",...args)}error(...args){console.error(this.key,"[OTA] ",...args)}time(key){const obj=this.temp;obj.hasOwnProperty(key)&&this.error(`Timer '${key}' already exists`),obj[key]=(new Date).getTime()}timeEnd(key){const obj=this.temp;if(!obj.hasOwnProperty(key))return void this.error(`Timer '${key}' does not exist`);let s=obj[key],e=(new Date).getTime();return this.log(`${key}: ${e-s}ms`),delete obj[key],e-s}}export{BLE,Logger,Observer,Transfer,Transfer as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function isEmpty(v){return null==v||""===v}function isNotEmpty(v){return!isEmpty(v)}function inArray(arr,key,val){for(let i=0;i<arr.length;i++)if(arr[i][key]===val)return i;return-1}function formatTimeHHmm(hours){const hour=Math.floor(hours),minute=Math.floor(60*(hours-hour));return console.log("H5环境"),`${hour}H:${minute}m`}function getOS(){const os=uni.getSystemInfoSync()?.osName;return{isIOS:"ios"==os,isAndroid:"android"==os}}const eventBus={events:{},on(event,callback){this.events[event]||(this.events[event]=[]),this.events[event].push(callback)},off(event,callback){this.events[event]&&(callback?(this.events[event]=this.events[event].filter(cb=>cb!==callback),0===this.events[event].length&&delete this.events[event]):delete this.events[event])},emit(event,...args){this.events[event]&&this.events[event].forEach(callback=>callback(...args))}};export{eventBus,formatTimeHHmm,getOS,inArray,isEmpty,isNotEmpty};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const batteryInfoJson=[{key:"barCode",paramNo:88,paramLength:32,oldParamNo:"0xA2"},{key:"manufacturer",paramNo:56,oldParamNo:"0xA0",paramLength:32},{key:"producedDate",paramNo:5,oldParamNo:"0x15",paramLength:2},{key:"model",paramNo:158,oldParamNo:"",paramLength:24},{key:"bmsModel",paramNo:176,oldParamNo:"",paramLength:16},{key:"bmsAddr",paramNo:170,oldParamNo:"",paramLength:12}],capInfoJson=[{key:"normCap",paramNo:0,oldParamNo:"0x10",paramLength:2},{key:"cycleCap",paramNo:1,oldParamNo:"0x11",paramLength:2},{key:"fullCap",paramNo:112,oldParamNo:"",paramLength:2}],voltageInfoJson=[{key:"allOvervoltageProtect",value:"",newValue:"",unit:"V",paramNo:16,oldParamNo:"0x20",paramLength:2},{key:"allOverpressureRecovery",value:"",newValue:"",unit:"V",paramNo:17,oldParamNo:"0x21",paramLength:2},{key:"allLowvoltageProtect",value:"",newValue:"",unit:"V",paramNo:18,oldParamNo:"0x22",paramLength:2},{key:"allLowvoltageRecover",value:"",newValue:"",unit:"V",paramNo:19,oldParamNo:"0x23",paramLength:2},{key:"singleOvervoltageProtect",value:"",newValue:"",unit:"V",paramNo:20,oldParamNo:"0x24",paramLength:2},{key:"singleOverpressureRecovery",value:"",newValue:"",unit:"V",paramNo:21,oldParamNo:"0x25",paramLength:2},{key:"singleLowvoltageProtect",value:"",newValue:"",unit:"V",paramNo:22,oldParamNo:"0x26",paramLength:2},{key:"singleLowvoltageRecover",value:"",newValue:"",unit:"V",paramNo:23,oldParamNo:"0x27",paramLength:2},{key:"allLowvoltageDelay",value:"",newValue:"",unit:"S",paramNo:48,oldParamNo:"0x3C",paramLength:2},{key:"allOverpressureDelay",value:"",newValue:"",unit:"S",paramNo:49,oldParamNo:"",paramLength:2},{key:"singleLowvoltageDelayed",value:"",newValue:"",unit:"S",paramNo:50,oldParamNo:"0x3d",paramLength:2},{key:"singleOverpressureDelay",value:"",newValue:"",unit:"S",paramNo:51,oldParamNo:"",paramLength:2},{key:"hardwareOV",value:null,newValue:"",unit:"V",paramNo:38,oldParamNo:"0x36",paramLength:2},{key:"hardwareUV",value:null,newValue:"",unit:"V",paramNo:39,oldParamNo:"0x37",paramLength:2}],currentInfoJson=[{value:"",newValue:"",unit:"A",paramNo:24,oldParamNo:"0x28",paramLength:2,key:"occhg"},{value:"",newValue:"",unit:"A",paramNo:25,oldParamNo:"0x29",paramLength:2,key:"dischargeOvercurrentProtect"},{value:"",newValue:"",unit:"S",paramNo:52,oldParamNo:"0x3E",paramLength:2,key:"chargeOvercurrentDelay"},{value:"",newValue:"",unit:"S",paramNo:53,oldParamNo:"",paramLength:2,key:"chargeOvercurrentRecoverDelay"},{value:"",newValue:"",unit:"S",paramNo:54,oldParamNo:"0x3F",paramLength:2,key:"dischargeOvercurrentDelay"},{value:"",newValue:"",unit:"S",paramNo:55,oldParamNo:"",paramLength:2,key:"dischargeOvercurrentRecoverDelay"},{value:null,newValue:"",unit:"(mV)",paramNo2:"1012",paramNo:40,oldParamNo:"0x38",paramLength:2,method:!0,key:"level2OvercurrentProtect"},{value:null,newValue:"",unit:"(mS)",paramNo2:"1013",paramNo:40,oldParamNo:"",paramLength:2,method:!0,key:"leve2OvercurrentDelay"},{checked:!1,isSwitch:!0,paramNo2:"1016",paramNo:41,oldParamNo:"",paramLength:2,key:"level2OvercurrentProtectV"},{value:null,newValue:"",unit:"(mV)",paramNo2:"1014",paramNo:41,oldParamNo:"",paramLength:2,method:!0,key:"shortcircuiProtect"},{value:null,newValue:"",unit:"(uS)",paramNo2:"1015",paramNo:41,oldParamNo:"",paramLength:2,method:!0,key:"shortcircuiProtectDelay"},{value:"",newValue:"",unit:"S",paramNo:43,oldParamNo:"0x39",paramLength:2,key:"shortcircuiProtectRecoverDelay",divisor:1}],tempInfoJson=[{value:"",newValue:"",unit:"℃",paramNo:8,oldParamNo:"0x18",paramLength:2,key:"chargeHightempProtect"},{value:"",newValue:"",unit:"℃",paramNo:9,oldParamNo:"0x19",paramLength:2,key:"chargeHightempRecover"},{value:"",newValue:"",unit:"℃",paramNo:10,oldParamNo:"0x1A",paramLength:2,key:"chargeLowtempProtect"},{value:"",newValue:"",unit:"℃",paramNo:11,oldParamNo:"0x1B",paramLength:2,key:"chargeLowtempRecover"},{value:"",newValue:"",unit:"℃",paramNo:12,oldParamNo:"0x1C",paramLength:2,key:"dischargingHightempProtect"},{value:"",newValue:"",unit:"℃",paramNo:13,oldParamNo:"0x1D",paramLength:2,key:"dischargingHightempRecover"},{value:"",newValue:"",unit:"℃",paramNo:14,oldParamNo:"0x1E",paramLength:2,key:"dischargingLowtempProtect"},{value:"",newValue:"",unit:"℃",paramNo:15,oldParamNo:"0x1F",paramLength:2,key:"dischargingLowtempRecover"},{value:"",newValue:"",unit:"S",paramNo:44,oldParamNo:"0x3A",paramLength:2,key:"chargeLowtempDelay"},{value:"",newValue:"",unit:"S",paramNo:45,oldParamNo:"",paramLength:2,key:"chargeHightempDelay"},{value:"",newValue:"",unit:"S",paramNo:46,oldParamNo:"0x3B",paramLength:2,key:"dischargingLowtempDelay"},{value:"",newValue:"",unit:"S",paramNo:47,oldParamNo:"",paramLength:2,key:"dischargingHightempDelay"}],equalizerFunJson=[{value:"",newValue:"",unit:"V",paramNo:26,oldParamNo:"0x2A",paramLength:2,key:"equalizingVoltage"},{value:"",newValue:"",unit:"V",paramNo:27,oldParamNo:"0x2B",paramLength:2,key:"accuracyEqualization"}],capVolInfoJson=[{value:null,newValue:"",unit:"V",paramNo:2,oldParamNo:"0x12",paramLength:2,isHidden:!1,key:"fullVolt"},{value:null,newValue:"",unit:"V",paramNo:3,oldParamNo:"0x13",paramLength:2,isHidden:!1,key:"emptyVolt"},{name:"容量80%",value:"",newValue:"",unit:"V",paramNo:34,oldParamNo:"0x32",paramLength:2,key:"voltage80p"},{name:"容量60%",value:"",newValue:"",unit:"V",paramNo:35,oldParamNo:"0x33",paramLength:2,key:"voltage60p"},{name:"容量40%",value:"",newValue:"",unit:"V",paramNo:36,oldParamNo:"0x34",paramLength:2,key:"voltage40p"},{name:"容量20%",value:"",newValue:"",unit:"V",paramNo:37,oldParamNo:"0x35",paramLength:2,key:"voltage20p"},{name:"容量90%",value:"",newValue:"",unit:"V",paramNo:106,oldParamNo:"0x42",paramLength:2,key:"voltage90p"},{name:"容量70%",value:"",newValue:"",unit:"V",paramNo:107,oldParamNo:"0x43",paramLength:2,key:"voltage70p"},{name:"容量50%",value:"",newValue:"",unit:"V",paramNo:108,oldParamNo:"0x44",paramLength:2,key:"voltage50p"},{name:"容量30%",value:"",newValue:"",unit:"V",paramNo:109,oldParamNo:"0x45",paramLength:2,key:"voltage30p"},{name:"容量10%",value:"",newValue:"",unit:"V",paramNo:110,oldParamNo:"0x46",paramLength:2,key:"voltage10p"},{name:"容量100%",value:"",newValue:"",unit:"V",paramNo:111,oldParamNo:"0x47",paramLength:2,key:"voltage100p"}],funcAndTempFuncJson=[{paramNo:29,oldParamNo:"0x2D",paramLength:2,key:"func"},{paramNo:30,oldParamNo:"0x2E",paramLength:2,key:"tempFunc"}],funcJson=[{paramNo2:"1001",value:"",newValue:"",checked:!1,unit:"mAH",key:"onOff"},{paramNo2:"1002",value:"",newValue:"",checked:!1,unit:"mAH",key:"loadCheck"},{paramNo2:"1003",value:"",newValue:"",checked:!1,unit:"mAH",key:"equalizerFun"},{paramNo2:"1004",value:"",newValue:"",checked:!1,method:!0,unit:"mAH",key:"equalization"},{paramNo2:"1005",value:"",newValue:"",checked:!1,unit:"mAH",key:"led"},{paramNo2:"1006",value:"",newValue:"",checked:!1,unit:"mAH",key:"ledCount"},{paramNo2:"1008",value:"",newValue:"",checked:!1,unit:"mAH",key:"rtc"},{paramNo2:"1007",value:"",newValue:"",checked:!1,unit:"mAH",key:"fccLimit"},{paramNo2:"1009",value:"",newValue:"",checked:!1,unit:"mAH",key:"charingHandle"},{paramNo2:"1010",value:"",newValue:"",checked:!1,unit:"mAH",key:"gps"},{paramNo2:"1011",value:"",newValue:"",checked:!1,unit:"mAH",key:"beepDevice"}],tempFuncJson=Array.from({length:8},(_,index)=>({name:""+(0===index?"保护板温度":`电池温度${index}`),value:"",newValue:"",checked:!1,unit:"",key:`tempera${index}`})),systemJson=[{value:"",newValue:"",unit:"",paramNo:6,oldParamNo:"",paramLength:2,isHidden:!0,key:"serialNumber"},{value:"",newValue:"",unit:"",paramNo:7,oldParamNo:"",paramLength:2,isHidden:!0,key:"cycleCount"},{name:"检流阻值",value:"",newValue:"",unit:"mR",paramNo:28,oldParamNo:"0x2C",paramLength:2,isHidden:!1,key:"rsnsValue"},{name:"串数设置",value:"",newValue:"",unit:"",paramNo:31,oldParamNo:"0x2F",paramLength:2,isHidden:!0,key:"strCount"}];export{batteryInfoJson,capInfoJson,capVolInfoJson,currentInfoJson,equalizerFunJson,funcAndTempFuncJson,funcJson,systemJson,tempFuncJson,tempInfoJson,voltageInfoJson};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getFFAAKeyAsync,getFFAA17Async,resolveFFAAKey,getBroadcastDataCmd}from"./BleCmdAnalysis/BleCmdFFAA.js";import{string2hexArr,decimalToHex0x}from"./BleDataProcess.js";const ALLOWED_MAC_PREFIX="A5:C2",APP_KEY_STATUS={NOT_ENABLED_NO_PASSWORD:"00",NOT_ENABLED_WITH_PASSWORD:"02",ENABLED_NO_PASSWORD:"01",ENABLED_WITH_PASSWORD:"03"},verifyMacAddrAndKey=(verifyMacAddr,key,randomNum)=>{let psdCode=[],macArr=verifyMacAddr.split(":"),psdHex=string2hexArr(key);return macArr.forEach((el,index)=>{let macDec="0x"+el,psdDec=psdHex[index],codeDec=(parseInt(macDec,16)^parseInt(psdDec,16))+randomNum,codeHex=decimalToHex0x(codeDec);codeHex=255&parseInt(codeHex,16),psdCode.push(decimalToHex0x(codeHex))}),psdCode},sendEnableOrVerifyKey=async(deviceData,key,code)=>{console.warn("发送code appkey指令",code,key);const randomNum=Math.floor(99*Math.random())+1;console.warn("randomNum: 随机数",randomNum);const psdCode=verifyMacAddrAndKey(deviceData.macAddr,key,randomNum);console.log("psdCode: ",psdCode),psdCode.push(decimalToHex0x(randomNum));return await getFFAAKeyAsync(deviceData.deviceId,code,psdCode,`验证或启用key${code}`)},sendOldAppKey=async(deviceData,key)=>{let psdHex=string2hexArr(key);return await getFFAAKeyAsync(deviceData.deviceId,"0x15",psdHex,"验证旧appkey")},sendWrite1LevelPwd=async(deviceData,pwd)=>{if(deviceData.isNewAppKey){const randomNum=await getRandomNum(deviceData),psdCode=verifyMacAddrAndKey(deviceData.macAddr,pwd,randomNum);psdCode.push(decimalToHex0x(randomNum));const hex=await getFFAAKeyAsync(deviceData.deviceId,"0x16",psdCode,"写入一级密码");return console.log("hex:写入一级密码 ",hex),hex}let psdHex=string2hexArr(pwd);return await getFFAAKeyAsync(deviceData.deviceId,"0x16",psdHex,"写入一级密码")},sendVerifyPwd=async(deviceData,pwd,code)=>{console.warn("deviceData: -----------",deviceData);const randomNum=await getRandomNum(deviceData),psdCode=verifyMacAddrAndKey(deviceData.macAddr,pwd,randomNum);deviceData.isNewAppKey&&psdCode.push(decimalToHex0x(randomNum));const hex=await getFFAAKeyAsync(deviceData.deviceId,code,psdCode,"验证密码");return console.log("hex: 验证密码",hex),hex},getRandomNum=async deviceData=>{if(deviceData.isNewAppKey)return Math.floor(99*Math.random())+1;{const hex=await getFFAA17Async(deviceData.deviceId),data=resolveFFAAKey(hex);return data?.response}},verify3LevelPassword=async(deviceData,ciphertext,randomNum)=>new Promise(async(resolve,reject)=>{const psdCode=ciphertext.split(/(\w{2})/g).filter(item=>""!==item).map(item=>`0x${item}`);console.log(psdCode,"psdCode");let code="";deviceData.isNewAppKey?(psdCode.push(decimalToHex0x(randomNum)),code="0x24"):code="0x1D";resolve(await getFFAAKeyAsync(deviceData.deviceId,code,psdCode,"验证三级密码"))}),extractModuleInfo=hexString=>({moduleType:hexString.slice(8,12),productType:hexString.slice(12,14),protocolVersion:hexString.slice(14,16),appkeyStatus:hexString.slice(16,18)}),getTypeBuyCmd=async deviceData=>{const hex=await getBroadcastDataCmd(deviceData.deviceId),data=resolveFFAAKey(hex);let moduleInfo=null;if(data&&data.dataStr.length>=20&&(moduleInfo=extractModuleInfo(data?.dataStr)),console.log("moduleInfo: 广播数据",moduleInfo),moduleInfo){const{moduleType:moduleType,productType:productType,protocolVersion:protocolVersion,appkeyStatus:appkeyStatus}=moduleInfo;deviceData.isNewAppKey=!0,deviceData.isConnect=!0,deviceData.appkeyStatus=appkeyStatus,deviceData.productType=productType,deviceData.protocolVersion=protocolVersion,deviceData.moduleType=moduleType}return console.warn("data: 获取模块产品类型等信息",moduleInfo),deviceData},sendAppKey=async(deviceData,appkeyValue,oldKey,canEnable=!1)=>{console.log("deviceData: ------------------",deviceData);try{let isAppKeyVerified=!0,hasPassword=!1,isEnableKey=!1,supportsBlueKey=!1,enableSuccess=!1;return deviceData.isNewAppKey?({isAppKeyVerified:isAppKeyVerified,hasPassword:hasPassword,isEnableKey:isEnableKey,supportsBlueKey:supportsBlueKey,enableSuccess:enableSuccess}=await handleNewAppKey(deviceData,appkeyValue,canEnable)):({isAppKeyVerified:isAppKeyVerified,hasPassword:hasPassword,supportsBlueKey:supportsBlueKey}=await handleOldAppKey(deviceData,oldKey)),{verifyAppkey:isAppKeyVerified,hasPwd:hasPassword,isEnableKey:isEnableKey,isBlueKey:supportsBlueKey,enableSuccess:enableSuccess}}catch(error){throw console.error("Error in sendAppKey:",error),error}},handleNewAppKey=async(deviceData,appkeyValue,canEnable)=>{const{appkeyStatus:appkeyStatus}=deviceData;let isAppKeyVerified=!0,hasPassword=!1,isEnableKey=!1,enableSuccess=!1;switch(appkeyStatus){case APP_KEY_STATUS.NOT_ENABLED_NO_PASSWORD:if(canEnable){const enableHex=await sendEnableOrVerifyKey(deviceData,appkeyValue,"0x22");enableHex?enableSuccess=0===enableHex[enableHex.length-2]:(console.log("启用key失败: ------------------",enableHex),isAppKeyVerified=!1),console.log(enableSuccess?"启用key成功":"启用key失败")}isEnableKey=!0;break;case APP_KEY_STATUS.NOT_ENABLED_WITH_PASSWORD:hasPassword=!0;break;case APP_KEY_STATUS.ENABLED_NO_PASSWORD:break;case APP_KEY_STATUS.ENABLED_WITH_PASSWORD:hasPassword=!0;break;default:console.log("无appkeyStatus-----------------")}if([APP_KEY_STATUS.ENABLED_NO_PASSWORD,APP_KEY_STATUS.ENABLED_WITH_PASSWORD].includes(appkeyStatus)){const hex=await sendEnableOrVerifyKey(deviceData,appkeyValue,"0x21");isAppKeyVerified=!!hex&&0===hex[hex.length-2]}return{isAppKeyVerified:isAppKeyVerified,hasPassword:hasPassword,isEnableKey:isEnableKey,supportsBlueKey:!0,enableSuccess:enableSuccess}},handleOldAppKey=async(deviceData,oldKey)=>{if("A5:C2"===deviceData.macAddr.slice(0,5).toUpperCase())return{isAppKeyVerified:!0,hasPassword:!1,supportsBlueKey:!1};const oldHex=await sendOldAppKey(deviceData,oldKey);if(console.log("oldHex: 验证旧key",oldHex),!oldHex)return console.log("验证旧key无响应: 无密码功能"),{isAppKeyVerified:!0,hasPassword:!1,supportsBlueKey:!1};switch(oldHex[oldHex.length-2]){case 0:return{isAppKeyVerified:!0,hasPassword:!0,supportsBlueKey:!0};case 1:default:return{isAppKeyVerified:!0,hasPassword:!1,supportsBlueKey:!1};case 2:return{isAppKeyVerified:!0,hasPassword:!1,supportsBlueKey:!0}}};export{ALLOWED_MAC_PREFIX,APP_KEY_STATUS,extractModuleInfo,getRandomNum,getTypeBuyCmd,handleNewAppKey,handleOldAppKey,sendAppKey,sendEnableOrVerifyKey,sendOldAppKey,sendVerifyPwd,sendWrite1LevelPwd,verify3LevelPassword,verifyMacAddrAndKey};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{chunk,unique}from"./core/array.js";export{
|
|
1
|
+
export{chunk,unique}from"./core/array.js";export{connectAsync,createBLEConnection,disConnect,foundScanDevice,getBLEDeviceCharacteristics,getBLEDeviceServices,getBluetoothAdapterState,initBle,notify,onBLECharacteristicValueChange,onBLEConnectionStateChange,onBleChangedConnectionState,onBluetoothAdapterStateChange,onBluetoothDeviceFound,onFoundDevice,scanHandle,startDevicesDiscovery,stopBluetoothDevicesDiscovery}from"./core/BleApiManager.js";export{eventBus,formatTimeHHmm,getOS,inArray,isEmpty,isNotEmpty}from"./core/commonfun.js";export{ALLOWED_MAC_PREFIX,APP_KEY_STATUS,extractModuleInfo,getRandomNum,getTypeBuyCmd,handleNewAppKey,handleOldAppKey,sendAppKey,sendEnableOrVerifyKey,sendOldAppKey,sendVerifyPwd,sendWrite1LevelPwd,verify3LevelPassword,verifyMacAddrAndKey}from"./core/keyAndPwdManager.js";export{OTAUpgrade}from"./core/OtaUpgrade.js";export{TelinkApi}from"./core/TelinkApi.js";export{BLE,Logger,Observer,Transfer}from"./core/Transfer.js";export{ab2decimalArr,ab2hex,arrayBufferToHexArray,base64ToHexArray,checkSum,crc16modbus,crcCheckSum,decimalToHex,decimalToHex0x,decimalToTwoByteHexArray,extractBits,generateCheckSum,generateCrc16modbusCheck,generateCrcCheckSum,getParamBaseValue,hex2Ascii,hex2Binary,hex2string,hexArr2Assic,hexArr2ab,hexArr2string,hexArrayToModuleArrayBuffer,hexStrAscii,hexStringToBinary,hexToDecimal,sleep,string2hexArr,stringToTwoHexArray}from"./core/BleDataProcess.js";export{getData,setMTUAsync}from"./core/BleCmdAnalysis/BleCmdAnalysis.js";export{clearPrimaryKey,getBluetoothName,getBroadcastDataCmd,getFFAA03Async,getFFAA17Async,getFFAA25Async,getFFAA26Async,getFFAA80Async,getFFAAKeyAsync,getWiFiIP,resetFactoryData,resetSecondaryKey,resolveFFAA25,resolveFFAA26,resolveFFAA80,resolveFFAAKey,setBluetoothName,setWiFi,setWiFiSta,set_PlanCMD_FFAA,set_PlanCMD_FFAA80}from"./core/BleCmdAnalysis/BleCmdFFAA.js";export{enterFactory,existFactory,get3B3CAsync,get3B3CInfo,getChipTypeAsync,getDD5A0AAsync,getDD5A0EAsync,getDD5A17Async,getDD5AAllAsync,getDD5AE0Async,getDD5AE1Async,getDD5AE4Async,getDD5AFAAsync,getDD5AFBAsync,getDDA503Async,getDDA504Async,getDDA505Async,getDDA507Async,getDDA508Async,getDDA5FAAsync,getDDA5OldAsync,getProtectCountCmd,readExistFactory,resolve3B3C,resolveBMSCmd,resolveBaseDD,resolveDDA500,resolveDDA503,resolveDDA504,resolveDDA505,resolveDDA508,resolveDDA5FA,resolveProtections,sendBMSAsync,setDDA5FAAsync,setDDA5OldAsync,set_PlanCMD_3B3C,set_PlanCMD_DD}from"./core/BleCmdAnalysis/BleCmdDD.js";export{getSysParamCmd,readParamCmd,setCapacityParamCmd,setParamCmd,setSysParamCmd}from"./core/BleCmdAnalysis/readAndSetParam.js";export{getBaseInfo,getBaseParams,getResistance}from"./core/BleCmdAnalysis/BaseParamProtocol.js";export{getCMDESInfoAsync,getHVESInfoAsync,resolveHVESBMUInfo,resolveHVESBaseInfo,resolveHVESCalibrationC1Info,resolveHVESCalibrationC2Info,resolveHVESCalibrationConfigInfo,resolveHVESCalibrationInfo,resolveHVESCtInfo,resolveHVESDisCtInfo,resolveHVESElectrodeHTInfo,resolveHVESEtInfo,resolveHVESInsulationLRInfo,resolveHVESLSocInfo,resolveHVESMonoVolInfo,resolveHVESOeInfo,resolveHVESOtRisingInfo,resolveHVESOtrInfo,resolveHVESOvrInfo,resolveHVESPackInfo,resolveHVESParamsInfo,resolveHVESSumInfo,resolveHVESSumVolInfo,resolveHVESVersionInfo}from"./core/BleCmdAnalysis/BleCmdHVES.js";export{HostProtocol}from"./core/BleCmdAnalysis/ESHostProtocol.js";export{batteryInfoJson,capInfoJson,capVolInfoJson,currentInfoJson,equalizerFunJson,funcAndTempFuncJson,funcJson,systemJson,tempFuncJson,tempInfoJson,voltageInfoJson}from"./core/dataJson/baseParamsJson.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jiabaida/tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"main": "dist/cjs/index.js",
|
|
5
5
|
"module": "dist/esm/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -10,10 +10,16 @@
|
|
|
10
10
|
},
|
|
11
11
|
"./array": "./dist/esm/core/array.js",
|
|
12
12
|
"./BleApiManager": "./dist/esm/core/BleApiManager.js",
|
|
13
|
-
"./commonfun": "./dist/esm/core/commonfun.js"
|
|
13
|
+
"./commonfun": "./dist/esm/core/commonfun.js",
|
|
14
|
+
"./keyAndPwdManager": "./dist/esm/core/keyAndPwdManager.js",
|
|
15
|
+
"./OtaUpgrade": "./dist/esm/core/OtaUpgrade.js",
|
|
16
|
+
"./TelinkApi": "./dist/esm/core/TelinkApi.js",
|
|
17
|
+
"./Transfer": "./dist/esm/core/Transfer.js",
|
|
18
|
+
"./index": "./src/index.js"
|
|
14
19
|
},
|
|
15
20
|
"files": [
|
|
16
|
-
"dist"
|
|
21
|
+
"dist",
|
|
22
|
+
"src"
|
|
17
23
|
],
|
|
18
24
|
"sideEffects": false,
|
|
19
25
|
"scripts": {
|
|
@@ -35,5 +41,9 @@
|
|
|
35
41
|
"jest": "^30.0.5",
|
|
36
42
|
"rollup": "^2.79.2",
|
|
37
43
|
"rollup-plugin-terser": "^7.0.2"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"crypto-js": "^4.2.0",
|
|
47
|
+
"mqtt": "^5.14.1"
|
|
38
48
|
}
|
|
39
49
|
}
|