@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.
Files changed (57) hide show
  1. package/dist/cjs/core/BleApiManager.js +1 -1
  2. package/dist/cjs/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
  3. package/dist/cjs/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
  4. package/dist/cjs/core/BleCmdAnalysis/BleCmdDD.js +1 -0
  5. package/dist/cjs/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
  6. package/dist/cjs/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
  7. package/dist/cjs/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
  8. package/dist/cjs/core/BleCmdAnalysis/readAndSetParam.js +1 -0
  9. package/dist/cjs/core/BleCmdAnalysis.js +1 -0
  10. package/dist/cjs/core/BleDataProcess.js +1 -0
  11. package/dist/cjs/core/OtaUpgrade.js +1 -0
  12. package/dist/cjs/core/TelinkApi.js +1 -0
  13. package/dist/cjs/core/Transfer.js +1 -0
  14. package/dist/cjs/core/commonfun.js +1 -1
  15. package/dist/cjs/core/dataJson/baseParamsJson.js +1 -0
  16. package/dist/cjs/core/keyAndPwdManager.js +1 -0
  17. package/dist/cjs/index.js +1 -1
  18. package/dist/esm/core/BleApiManager.js +1 -1
  19. package/dist/esm/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
  20. package/dist/esm/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
  21. package/dist/esm/core/BleCmdAnalysis/BleCmdDD.js +1 -0
  22. package/dist/esm/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
  23. package/dist/esm/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
  24. package/dist/esm/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
  25. package/dist/esm/core/BleCmdAnalysis/readAndSetParam.js +1 -0
  26. package/dist/esm/core/BleCmdAnalysis.js +1 -0
  27. package/dist/esm/core/BleDataProcess.js +1 -0
  28. package/dist/esm/core/OtaUpgrade.js +1 -0
  29. package/dist/esm/core/TelinkApi.js +1 -0
  30. package/dist/esm/core/Transfer.js +1 -0
  31. package/dist/esm/core/commonfun.js +1 -1
  32. package/dist/esm/core/dataJson/baseParamsJson.js +1 -0
  33. package/dist/esm/core/keyAndPwdManager.js +1 -0
  34. package/dist/esm/index.js +1 -1
  35. package/package.json +13 -3
  36. package/src/core/BleApiManager.js +487 -0
  37. package/src/core/BleCmdAnalysis/BaseParamProtocol.js +651 -0
  38. package/src/core/BleCmdAnalysis/BleCmdAnalysis.js +220 -0
  39. package/src/core/BleCmdAnalysis/BleCmdDD.js +1214 -0
  40. package/src/core/BleCmdAnalysis/BleCmdDDA4.js +762 -0
  41. package/src/core/BleCmdAnalysis/BleCmdFFAA.js +407 -0
  42. package/src/core/BleCmdAnalysis/BleCmdHVES.js +1222 -0
  43. package/src/core/BleCmdAnalysis/ESHostProtocol.js +829 -0
  44. package/src/core/BleCmdAnalysis/index.js +7 -0
  45. package/src/core/BleCmdAnalysis/readAndSetParam.js +288 -0
  46. package/src/core/BleDataProcess.js +355 -0
  47. package/src/core/OtaUpgrade.js +338 -0
  48. package/src/core/TelinkApi.js +73 -0
  49. package/src/core/Transfer.js +516 -0
  50. package/src/core/array.js +10 -0
  51. package/src/core/commonfun.js +84 -0
  52. package/src/core/dataJson/baseParamsJson.js +754 -0
  53. package/src/core/dataJson/index.js +1 -0
  54. package/src/core/keyAndPwdManager.js +346 -0
  55. package/src/core/mqttServer.js +296 -0
  56. package/src/core/rsaEncrypt.js +45 -0
  57. package/src/index.js +11 -0
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const BleApiManager={version:"1.0.0"};exports.BleApiManager=BleApiManager,exports.default=BleApiManager;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var commonfun=require("./commonfun.js"),BleDataProcess=require("./BleDataProcess.js"),vue=require("vue");const serviceId="0000FF00-0000-1000-8000-00805F9B34FB",bluetoothAdapterState=vue.ref({available:!1,discovering:!1}),startDevicesDiscovery=async(allowDuplicatesKey=!0)=>new Promise((resolve,reject)=>{bluetoothAdapterState.value.discovering?reject(new Error("蓝牙设备搜索已在进行中")):uni.startBluetoothDevicesDiscovery({services:[serviceId],allowDuplicatesKey:allowDuplicatesKey,success:async res=>{console.log("广播设备 success",res),resolve(res)},fail:err=>{console.log("广播设备 fail",err),reject(err)}})}),onBluetoothDeviceFound=async()=>{uni.onBluetoothDeviceFound(characteristic=>{console.log("setBluetoothDeviceFound",characteristic);const device=(device=>{const adv=device?.advertisData;if(!adv)return null;if(adv){const advHex=Array.prototype.map.call(new Uint8Array(adv),o=>("00"+o.toString(16)).slice(-2)).join("").toUpperCase();let macAddr=advHex.slice(0,12).toUpperCase(),arr=macAddr.match(/(.{2})/g);const flag=macAddr.slice(-4);"C1A4"!=flag&&"C2A5"!=flag&&"C2A8"!=flag||arr.reverse(),macAddr=arr.join(":"),device.hasFound=!0;const moduleType=advHex.slice(12,16),soc=advHex.slice(16,18),productType=advHex.slice(18,20),protocolVersion=advHex.slice(20,22),appkeyStatus=advHex.slice(22,24),broadcastLen=advHex.length/2,isNewAppKey=advHex.length>=24;device={...device,macAddr:macAddr,moduleType:moduleType,soc:soc,productType:productType,advHex:advHex,protocolVersion:protocolVersion,appkeyStatus:appkeyStatus,broadcastLen:broadcastLen,isNewAppKey:isNewAppKey}}return device})(characteristic.devices[0]);device&&commonfun.eventBus.emit("setBluetoothDeviceFound",device)})},onFoundDevice=callback=>{commonfun.eventBus.on("setBluetoothDeviceFound",callback)},onBluetoothAdapterStateChange=async()=>{uni.onBluetoothAdapterStateChange(res=>{console.log("onBluetoothAdapterStateChange监听蓝牙适配器变化",res),bluetoothAdapterState.value=res})},onBLECharacteristicValueChange=async()=>{uni.onBLECharacteristicValueChange(characteristic=>{const decimalArr=BleDataProcess.ab2decimalArr(characteristic.value);console.warn("decimalArr: 监听到的回复-------------------",decimalArr),commonfun.eventBus.emit("setBleChangedCharacteristicValue",characteristic)})},onBLEConnectionStateChange=async()=>{uni.onBLEConnectionStateChange(characteristic=>{console.log("onBLEConnectionStateChange",characteristic),commonfun.eventBus.emit("setBleChangedConnectionState",characteristic)})},createBLEConnection=async(deviceId,timeout=1e4)=>new Promise((resolve,reject)=>{console.log(deviceId,"点击的设备信息"),uni.createBLEConnection({deviceId:deviceId,timeout:timeout,success:res=>{console.log(res,"连接成功"),resolve(!0)},fail:err=>{console.log(err,"Connection"),-1==(err.code||err.errCode)?resolve(!0):reject(err)}})}),withRetry=async(asyncOperation,maxRetries=20,retryInterval=100,type)=>new Promise((resolve,reject)=>{let retryCount=0;const attempt=async()=>{try{const result=await asyncOperation();resolve(result)}catch(error){if(retryCount>=maxRetries)return void reject(new Error(`${type}失败,${error.message} (已重试${maxRetries}次)`));retryCount++,console.warn(`${type}失败,第${retryCount}次重试:`,error.message),setTimeout(attempt,retryInterval)}};attempt()}),getBLEDeviceServices=deviceId=>withRetry(async()=>{const res=await new Promise((resolve,reject)=>{uni.getBLEDeviceServices({deviceId:deviceId,success:resolve,fail:reject})});if(console.log("获取蓝牙服务成功:",res),0===res.services.length)throw new Error("未找到蓝牙服务");return await getBLEDeviceCharacteristics(deviceId),res.services},20,100,"获取蓝牙服务"),getBLEDeviceCharacteristics=async deviceId=>withRetry(async()=>{const res=await new Promise((resolve,reject)=>{uni.getBLEDeviceCharacteristics({deviceId:deviceId,serviceId:serviceId,success:resolve,fail:reject})});return console.log("获取特征值成功:",res),res.characteristics},20,100,"获取蓝牙特征值"),notify=async deviceId=>new Promise((resolve,reject)=>{uni.notifyBLECharacteristicValueChange({deviceId:deviceId,serviceId:serviceId,characteristicId:"0000FF01-0000-1000-8000-00805F9B34FB",state:!0,success:res=>{console.log("订阅===========",res),resolve(res)},fail:reject})}),foundScanDevice=async(result,connectFn)=>{const deviceList=[];await startDevicesDiscovery(),onFoundDevice(device=>{deviceList.push(device);const findDevice=device.macAddr===result||device.name===result;findDevice?(scanTimeout&&(clearTimeout(scanTimeout),scanTimeout=null),uni.stopBluetoothDevicesDiscovery(),connectFn(findDevice)):console.log("未找到设备,继续搜索中...")});let scanTimeout=setTimeout(async()=>{try{console.log("stopBluetoothDevicesDiscovery",deviceList),clearInterval(scanTimer),scanTimer=null,uni.stopBluetoothDevicesDiscovery();const findDevice=deviceList.find(device=>device.macAddr===result||device.name===result);connectFn(findDevice)}finally{}},5e3)};exports.connectAsync=async(deviceId,timeout=1e4)=>new Promise(async(resolve,reject)=>{try{await createBLEConnection(deviceId,timeout),await getBLEDeviceServices(deviceId),await notify(deviceId),resolve(!0)}catch(error){console.log("error: ",error),reject(error)}}),exports.createBLEConnection=createBLEConnection,exports.disConnect=deviceId=>new Promise((resolve,reject)=>{uni.closeBLEConnection({deviceId:deviceId,success:res=>{resolve(res),console.log(res,"断开连接成功")},fail:err=>{reject(err),console.log(err,"err 断开连接")}})}),exports.foundScanDevice=foundScanDevice,exports.getBLEDeviceCharacteristics=getBLEDeviceCharacteristics,exports.getBLEDeviceServices=getBLEDeviceServices,exports.getBluetoothAdapterState=async()=>new Promise((resolve,reject)=>{uni.getBluetoothAdapterState({success:res=>{console.log("getBluetoothAdapterState success",res),resolve(res)},fail:err=>{console.log("getBluetoothAdapterState fail",err),reject(err)}})}),exports.initBle=async()=>{const checkBluetoothStatus=async()=>new Promise((resolve,reject)=>{uni.openBluetoothAdapter({success:async res=>{console.log("openBluetoothAdapter success",res),resolve(res);try{onBluetoothDeviceFound(),onBLECharacteristicValueChange(),onBLEConnectionStateChange(),onBluetoothAdapterStateChange()}catch(error){console.log("error: ",error),reject(error)}},fail:err=>{console.log("openBluetoothAdapter fail",err),reject(err)}})});try{const{isAndroid:isAndroid}=commonfun.getOS();isAndroid?(async()=>{const timeoutPromise=new Promise((resolve,reject)=>{setTimeout(()=>{reject(new Error("网络信号差或连接异常,请检查网络情况"))},1e4)}),locationPromise=new Promise((resolve,reject)=>{uni.getLocation({type:"wgs84",success:res=>{console.log("位置信息-----------",res),resolve(res)},fail:err=>{console.log("位置信息err",err),reject(err)}})});Promise.race([locationPromise,timeoutPromise]).then(res=>{checkBluetoothStatus()}).catch(err=>{console.log("位置获取失败或超时:",err),Promise.reject({code:1})})})():checkBluetoothStatus()}catch(error){console.error("初始化蓝牙失败:",error),Promise.reject({code:error.code||error.errCode||-1})}},exports.notify=notify,exports.onBLECharacteristicValueChange=onBLECharacteristicValueChange,exports.onBLEConnectionStateChange=onBLEConnectionStateChange,exports.onBleChangedConnectionState=callback=>{commonfun.eventBus.on("setBleChangedConnectionState",callback)},exports.onBluetoothAdapterStateChange=onBluetoothAdapterStateChange,exports.onBluetoothDeviceFound=onBluetoothDeviceFound,exports.onFoundDevice=onFoundDevice,exports.scanHandle=(historyConnectedList=[],connectFn=device=>{})=>{uni.scanCode({scanType:["barCode","qrCode"],success:async({result:result})=>{console.log("扫描内容: "+result);let searchKey=result;try{const formatMacAddress=mac=>mac.replace(/(.{2})/g,"$1:").slice(0,-1).toUpperCase();let isMac=!1;result.includes("?qrCodeInfo=")?(searchKey=result.split("?qrCodeInfo=")[1],searchKey.includes(":")?(searchKey=searchKey.slice(-17).toUpperCase(),isMac=!0):(searchKey=searchKey.slice(-12),searchKey=formatMacAddress(searchKey),isMac=!0)):17===result.length&&result.includes(":")?(searchKey=result.toUpperCase(),isMac=!0):12===result.length&&(searchKey=formatMacAddress(result),isMac=!0);const{isAndroid:isAndroid}=commonfun.getOS(),matchedHistoryDevice=historyConnectedList.find(item=>item.macAddr==searchKey);if(matchedHistoryDevice)return void connectFn(matchedHistoryDevice);isAndroid&&isMac?connectFn({deviceId:searchKey,macAddr:searchKey,name:searchKey}):foundScanDevice(searchKey,connectFn)}catch(error){console.log(error)}}})},exports.startDevicesDiscovery=startDevicesDiscovery,exports.stopBluetoothDevicesDiscovery=async()=>new Promise((resolve,reject)=>{uni.stopBluetoothDevicesDiscovery({success:res=>{console.log("停止广播设备 success",res),resolve(res)},fail:err=>{console.log("停止广播设备 fail",err),reject(err)},complete:res=>{console.log("停止广播设备 取消订阅"),commonfun.eventBus.off("setBluetoothDeviceFound")}})});
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var readAndSetParam=require("./readAndSetParam.js"),BleDataProcess=require("../BleDataProcess.js"),baseParamsJson=require("../dataJson/baseParamsJson.js"),BleCmdDD=require("./BleCmdDD.js");function format(value,n=1,offset=0,scope=0){if(!value)return null;value=value.map(el=>{const hexValue=BleDataProcess.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 BleCmdDD.enterFactory(deviceId);index<params.length;){const item=params[index];try{const basedata=await readAndSetParam.getSysParamCmd(chipType,deviceId,item,!1);datasInfo[item.key]=basedata,index++}catch(error){console.error(`获取参数 ${item.key} 失败:`,error),index++}}chipType||await BleCmdDD.readExistFactory(deviceId)};let crsDivisor=.1;const 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+=BleDataProcess.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+=BleDataProcess.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={};baseParamsJson.funcJson.forEach((item,index)=>{item.key&&(func[item.key]=binaryFuncArr[index])});const tempFunc={};return baseParamsJson.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)});exports.getBaseInfo=getBaseInfo,exports.getBaseParams=async(chipType,deviceData,index,paramObj)=>{console.log("chipType: ",chipType);const deviceId=deviceData?.deviceId,protocolVersion=deviceData?.protocolVersion||"00";console.warn("protocolVersion: ",protocolVersion);const v=BleDataProcess.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,baseParamsJson.batteryInfoJson),dataInfo=getBaseInfo(datasInfo1),dataInfo;case 2:let datasInfo2={};if(chipType){const capData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.capInfoJson[0],paramLength:4});console.warn("capData: ",capData),datasInfo2.normCap=capData?.slice(0,2),datasInfo2.cycleCap=capData?.slice(2,4);const capData2=await readAndSetParam.getSysParamCmd(chipType,deviceId,baseParamsJson.capInfoJson[2]);datasInfo2.fullCap=capData2?.slice(0,2)}else await sendCmdSeq(datasInfo2,chipType,deviceId,baseParamsJson.capInfoJson);return dataInfo=getCapInfo(datasInfo2),dataInfo;case 3:let datasInfo3={};if(chipType){let vindex=baseParamsJson.voltageInfoJson.findIndex(el=>16==el.paramNo);console.log("vindex: ------------",vindex);let vindex1=baseParamsJson.voltageInfoJson.findIndex(el=>48==el.paramNo),vindex2=baseParamsJson.voltageInfoJson.findIndex(el=>38==el.paramNo);const voltageData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.voltageInfoJson[vindex],paramLength:16}),voltageData1=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.voltageInfoJson[vindex1],paramLength:8}),voltageData2=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.voltageInfoJson);return dataInfo=getVoltageInfo(datasInfo3,chipType),dataInfo;case 4:let datasInfo4={};if(chipType){let cindex=baseParamsJson.currentInfoJson.findIndex(el=>24==el.paramNo),cindex1=baseParamsJson.currentInfoJson.findIndex(el=>52==el.paramNo),cindex2=baseParamsJson.currentInfoJson.findIndex(el=>40==el.paramNo);const currentData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.currentInfoJson[cindex],paramLength:4}),currentData1=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.currentInfoJson[cindex1],paramLength:8}),currentData2=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.currentInfoJson);return dataInfo=getCurrentInfo(datasInfo4,chipType),dataInfo;case 5:let datasInfo5={};if(chipType){let tindex=baseParamsJson.tempInfoJson.findIndex(el=>8==el.paramNo),tindex1=baseParamsJson.tempInfoJson.findIndex(el=>44==el.paramNo);const tempData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.tempInfoJson[tindex],paramLength:16}),tempData1=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.tempInfoJson);return dataInfo=getTempInfo(datasInfo5,chipType),dataInfo;case 6:let datasInfo6={};if(chipType){const equalizerFunData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.equalizerFunJson);return dataInfo=getEqualizerFunInfo(datasInfo6),dataInfo;case 7:let datasInfo7={};if(chipType){let capVolIndex=baseParamsJson.capVolInfoJson.findIndex(el=>34==el.paramNo),capVolIndex1=baseParamsJson.capVolInfoJson.findIndex(el=>106==el.paramNo);const capVolInfoData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.capVolInfoJson[0],paramLength:4}),capVolInfoData1=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.capVolInfoJson[capVolIndex],paramLength:8}),capVolInfoData2=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.capVolInfoJson);return dataInfo=getcapVolInfoInfo(datasInfo7,chipType),dataInfo;case 9:let datasInfo9={};if(chipType){const funcAndTempFuncData=await readAndSetParam.getSysParamCmd(chipType,deviceId,{...baseParamsJson.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,baseParamsJson.funcAndTempFuncJson);return dataInfo=getFuncAndTempFuncInfo(datasInfo9),dataInfo;case 10:let datasInfo10={};return await sendCmdSeq(datasInfo10,chipType,deviceId,baseParamsJson.systemJson),dataInfo=getSystemInfo(datasInfo10),dataInfo;case 11:const counts=await BleCmdDD.getProtectCountCmd(deviceId);return console.log("counts: ",counts),counts;default:if(!paramObj)return null;let defaultDataInfo={};const onedata=await readAndSetParam.getSysParamCmd(chipType,deviceId,paramObj);return defaultDataInfo[paramObj.key]=onedata?.slice(0,2),defaultDataInfo}}catch(error){throw console.error("error: 读系统参数报错 getBaseParams",error),error}},exports.getResistance=async(chipType,deviceId)=>{try{const rsnsValue=await readAndSetParam.getSysParamCmd(chipType,deviceId,baseParamsJson.systemJson[2]);return format(rsnsValue,crsDivisor,0,2)}catch(error){throw console.error("error: 读检流阻值报错 getResistance",error),error}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleDataProcess=require("../BleDataProcess.js"),commonfun=require("../commonfun.js");async function _writeAsync(deviceId,value){return console.log("deviceId, value: ",deviceId,value),!(!deviceId||!value)&&new Promise(resolve=>{const{isAndroid:isAndroid,isIOS:isIOS}=commonfun.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)})}exports.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=BleDataProcess.hexArr2ab(command),cleanup=()=>{isCompleted||(isCompleted=!0,clearTimeout(timeoutId),commonfun.eventBus.off("setBleChangedCharacteristicValue",dataHandler))},dataHandler=payload=>{if(!payload||payload.deviceId!==deviceId||!payload.value)return;const hexArr=BleDataProcess.ab2decimalArr(payload.value);if(console.log("hexArr: ",hexArr),console.warn(tag,"接收到数据:",BleDataProcess.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 BleDataProcess.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 BleDataProcess.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),commonfun.eventBus.on("setBleChangedCharacteristicValue",dataHandler),writeToDevice().catch(error=>{cleanup(),reject(error)})})},exports.setMTUAsync=(deviceId,mtu=512,delay=2500)=>new Promise((resolve,reject)=>{try{if(commonfun.getOS().isIOS)return resolve(!0);setTimeout(async()=>{await uni.setBLEMTU({deviceId:deviceId,mtu:mtu}),resolve(!0)},delay)}catch(error){console.error(error),reject(error)}});
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleCmdAnalysis=require("./BleCmdAnalysis.js"),BleDataProcess=require("../BleDataProcess.js"),BleCmdFFAA=require("./BleCmdFFAA.js");const 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 BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"PlanCMD_DD");if(data){const dataStr=BleDataProcess.hexArr2string(data),content=data.slice(4,data.length-3);result={data:data,dataStr:dataStr,status:BleDataProcess.hex2string(data[2]),len:data[3],content:content}}else result={status:0,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${BleDataProcess.decimalToHex(data.length,2)}`],check=BleDataProcess.generateCrc16modbusCheck([...addressCode,...commandCode,...dataLength,...data],!1),command=["0x3b","0x3c",...addressCode,...commandCode,...dataLength,...data,...check,"0x0d"];return BleCmdAnalysis.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]=BleDataProcess.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:BleDataProcess.hexArr2string(data),status:BleDataProcess.hex2string(data[10]),addr:BleDataProcess.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=BleDataProcess.hex2string(v1),result.productLen=v2,v)){const[productType,frontType,protocolV,level]=v.map(o=>BleDataProcess.hex2string(o));Object.assign(result,{productType:productType,frontType:frontType,protocolV:protocolV,level:level})}2==v1&&(result.hardwareFlag=BleDataProcess.hex2string(v1),result.hardwareLen=v2,result.hardwareV=BleDataProcess.hexArr2Assic(v)),3==v1&&(result.sofewareFlag=BleDataProcess.hex2string(v1),result.sofewareLen=v2,result.sofewareV=BleDataProcess.hexArr2Assic(v)),4==v1&&(result.pcbFlag=BleDataProcess.hex2string(v1),result.pcbLen=v2,result.pcbContent=BleDataProcess.hexArr2Assic(v))}return result},getDDA503Async=async deviceId=>{const hex=await BleCmdAnalysis.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]=BleDataProcess.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=BleDataProcess.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=BleDataProcess.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=BleDataProcess.decimalToHex(data[8])+BleDataProcess.decimalToHex(data[9]),surplusCapacity=Number((BleDataProcess.hexToDecimal(volumeHex)/n).toFixed(2)),normCapHex=BleDataProcess.decimalToHex(data[10])+BleDataProcess.decimalToHex(data[11]),normCap=Number((BleDataProcess.hexToDecimal(normCapHex)/n).toFixed(2)),cycleHex=BleDataProcess.decimalToHex(data[12])+BleDataProcess.decimalToHex(data[13]),cycleIndex=BleDataProcess.hexToDecimal(cycleHex),fccHex=BleDataProcess.decimalToHex(data[humidityIndex+3])+BleDataProcess.decimalToHex(data[humidityIndex+4]),fullChargeCapacity=Number((BleDataProcess.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=BleDataProcess.decimalToHex(data[20])+BleDataProcess.decimalToHex(data[21]),protVal=BleDataProcess.hexToDecimal(protectStateHex);let alarmIndex=2*data[26]+28,alarmStateHex=BleDataProcess.decimalToHex(data[alarmIndex])+BleDataProcess.decimalToHex(data[alarmIndex+1]),alarmsState=BleDataProcess.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:BleDataProcess.hex2string(data[2]),len:data[3],softwareV:BleDataProcess.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}},resolveDDA504=(data,dataScope)=>{if(console.log("data: ",data),!data)return null;const cmdResp04=BleDataProcess.hexArr2string(data),voltageList=[];for(let index=4;index<parseInt(data[3])+4;index+=2){let voltageHex=BleDataProcess.decimalToHex(data[index])+BleDataProcess.decimalToHex(data[index+1]),voltage=BleDataProcess.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}},resolveDDA500=data=>{if(!data)return null;return{dataStr:BleDataProcess.hexArr2string(data),status:BleDataProcess.hex2string(data[2]),len:data[3],type:data[5]}},getDDA505Async=async deviceId=>BleCmdAnalysis.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]=BleDataProcess.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:BleDataProcess.hexArr2string(data),status:BleDataProcess.hex2string(data[2]),len:data[3],hardwareV:BleDataProcess.hexArr2Assic(data.slice(4,data.length-3))}},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}};exports.enterFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A00025678FF3077"),exports.existFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A01022828ffad77"),exports.get3B3CAsync=get3B3CAsync,exports.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 BleCmdFFAA.getFFAA80Async(deviceId,"AT^VERSION?");_ffaa_80=BleCmdFFAA.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)}}),exports.getChipTypeAsync=async deviceId=>{const hex=await BleCmdAnalysis.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]=BleDataProcess.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},exports.getDD5A0AAsync=async(deviceId,value)=>{const _command=["0x0A","0x02",...BleDataProcess.stringToTwoHexArray(value)],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return console.log("command: ",command),BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&10==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},`DD5A_0A_${value}`)},exports.getDD5A0EAsync=async deviceId=>BleCmdAnalysis.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_复位"),exports.getDD5A17Async=async deviceId=>BleCmdAnalysis.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-清除电池循环次数"),exports.getDD5AAllAsync=async(deviceId,path,lengthHex,values,type)=>{const _command=[path,lengthHex,...values],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==path,pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},`DD5A_${path}_${type}`)},exports.getDD5AE0Async=async(deviceId,value)=>{const hex=100*value,hexStr=BleDataProcess.decimalToHex(hex,4),_values=[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`],_command=["0xE0","0x02",..._values],checks=BleDataProcess.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}),BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&224==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E0")},exports.getDD5AE1Async=async(deviceId,value)=>{const _command=["0xE1","0x02","0x00",value],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&225==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_E1")},exports.getDD5AE4Async=async deviceId=>BleCmdAnalysis.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"),exports.getDD5AFAAsync=async(deviceId,value)=>{const hex=100*value,hexStr=BleDataProcess.decimalToHex(hex,4),_command=["0xFA","0x05","0x00","0x70","0x01",...[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_FA")},exports.getDD5AFBAsync=async(deviceId,type,value)=>{const _command=["0xFB","0x02",type,value],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return console.log("command: ",command),BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&251==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DD5A_FB")},exports.getDDA503Async=getDDA503Async,exports.getDDA504Async=async(deviceId,dataScope)=>{const hex=await BleCmdAnalysis.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]=BleDataProcess.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},exports.getDDA505Async=getDDA505Async,exports.getDDA507Async=async deviceId=>BleCmdAnalysis.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]=BleDataProcess.generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_07历史运行履历总数"),exports.getDDA508Async=async(deviceId,i=0)=>{const _command=["0x08",`0x${i.toString(16).padStart(2,0)}`],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0xA5",..._command,...checks,"0x77"];return BleCmdAnalysis.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]=BleDataProcess.generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_08读取履历详情")},exports.getDDA5FAAsync=async(deviceId,paramNo,length)=>{const _values=[...paramNo,length],_command=["0xFA",BleDataProcess.decimalToHex(_values.length),..._values],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0xA5",..._command,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"READ_DDA5_FA")},exports.getDDA5OldAsync=async(deviceId,path)=>{const values=[path,"0x00"],checks=BleDataProcess.generateCrcCheckSum(values),command=["0xDD","0xa5",...values,...checks,"0x77"];return BleCmdAnalysis.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]=BleDataProcess.generateCrcCheckSum(pkg.slice(2,len-3)),[_c1,_c2]=[pkg[len-3],pkg[len-2]];return{verified:c1==_c1&&c2==_c2}}},"DDA5_读旧协议读参")},exports.getProtectCountCmd=async deviceId=>{const data=await BleCmdAnalysis.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},exports.readExistFactory=async deviceId=>set_PlanCMD_DD(deviceId,"DD5A01020000FFFD77"),exports.resolve3B3C=resolve3B3C,exports.resolveBMSCmd=data=>{if(!data)return null;return{dataStr:BleDataProcess.hexArr2string(data),status:BleDataProcess.hex2string(data[2]),len:data[3]}},exports.resolveBaseDD=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),content=data.slice(4,data.length-3);return{dataStr:dataStr,status:BleDataProcess.hex2string(data[2]),len:data[3],content:content}},exports.resolveDDA500=resolveDDA500,exports.resolveDDA503=resolveDDA503,exports.resolveDDA504=resolveDDA504,exports.resolveDDA505=resolveDDA505,exports.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:BleDataProcess.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("")}},exports.resolveDDA5FA=data=>{if(!data)return null;return{dataStr:BleDataProcess.hexArr2string(data),status:BleDataProcess.hex2string(data[2]),len:data[3],type:data[5],value:data.slice(7,-3)}},exports.resolveProtections=resolveProtections,exports.sendBMSAsync=async(deviceId,values)=>{const command=values.match(/[0-9a-fA-F]{2}/g)?.map(item=>`0x${item}`)||[];return BleCmdAnalysis.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]}`)},exports.setDDA5FAAsync=async(deviceId,paramNo,valueLength,content)=>{const _values=[...paramNo,valueLength,...content],_command=["0xFA",BleDataProcess.decimalToHex(_values.length),..._values],checks=BleDataProcess.generateCrcCheckSum(_command),command=["0xDD","0x5A",..._command,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&250==hexArr[1],pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"SET_DDA5_FA")},exports.setDDA5OldAsync=async(deviceId,path,value,type="")=>{const values=[path,"0x02",...value],checks=BleDataProcess.generateCrcCheckSum(values),command=["0xDD","0x5A",...values,...checks,"0x77"];return BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:221==hexArr[0]&&hexArr[1]==path,pkgLen:hexArr[3]+7}),pkgVerifyHandler:pkg=>({verified:!0})},"DDA5_写旧协议读参"+type)},exports.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 BleCmdAnalysis.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=BleDataProcess.hexArr2string(data),content=data.slice(12,data.length-3);result={dataStr:dataStr,status:128==data[10]?1:0,addr:BleDataProcess.hexArr2string(data.slice(2,10)),content:content}}}catch(error){console.error(error)}return result},exports.set_PlanCMD_DD=set_PlanCMD_DD;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleCmdAnalysis=require("./BleCmdAnalysis.js"),BleDataProcess=require("../BleDataProcess.js");const getFFAAKeyAsync=async(deviceId,code,content,type)=>{const commandCode=[code],data=[...content],dataLength=[`0x${BleDataProcess.decimalToHex(data.length,2)}`],check=BleDataProcess.generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return console.log("command: ---------------",command),BleCmdAnalysis.getData(deviceId,{command:command,commandVerifyHandler:hexArr=>({verified:255==hexArr[0]&&170==hexArr[1]&&hexArr[2]==BleDataProcess.hexToDecimal(code),pkgLen:hexArr[3]+5}),pkgVerifyHandler:pkg=>{const _pkg=pkg.map(o=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},`FFAA_${code}(${type})`)},resolveFFAAKey=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),response=data[data.length-2];return{data:data,dataStr:dataStr,response:response,status:response}},getFFAA80Async=async(deviceId,ATStr)=>{const commandCode=["0x80"],data=BleDataProcess.string2hexArr(ATStr).map(o=>`0x${o}`),dataLength=[`0x${BleDataProcess.decimalToHex(data.length,2)}`],check=BleDataProcess.generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check],hex=await BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.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=BleDataProcess.hexArr2string(data),status=data[data.length-2],response=BleDataProcess.hexArr2Assic(data.slice(4,-1)),moduleVersion=response.replace(/\r|\n|\s+|\OK/g,"").split(":")[1]??"";return{dataStr:dataStr,status:status,response:response,moduleVersion:moduleVersion}},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},setWiFi=async(deviceId,rssi,pwd)=>{let data=null;try{data=await setWiFiSta(deviceId,rssi,pwd)}catch(error){}return data};exports.clearPrimaryKey=async deviceId=>getFFAAKeyAsync(deviceId,"0x23",["0x01"],"清除一级密码"),exports.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},exports.getBroadcastDataCmd=async deviceId=>getFFAAKeyAsync(deviceId,"0x19",["0x01"],"广播数据"),exports.getFFAA03Async=async deviceId=>BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_03(模块复位)"),exports.getFFAA17Async=async deviceId=>BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_17(获取随机数)"),exports.getFFAA25Async=async deviceId=>{const commandCode=["0x25"],data=[],dataLength=[`0x${BleDataProcess.decimalToHex(data.length,2)}`],check=BleDataProcess.generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_25(LCD屏查询配对mac)")},exports.getFFAA26Async=async(deviceId,macAddrArr)=>{const commandCode=["0x26"],data=[...macAddrArr],dataLength=[`0x${BleDataProcess.decimalToHex(data.length,2)}`],check=BleDataProcess.generateCheckSum([...commandCode,...dataLength,...data]),command=["0xff","0xaa",...commandCode,...dataLength,...data,...check];return BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.generateCheckSum(_pkg.slice(2,len-1));return{verified:c1==pkg[len-1]}}},"FFAA_26(LCD屏设置配对mac)")},exports.getFFAA80Async=getFFAA80Async,exports.getFFAAKeyAsync=getFFAAKeyAsync,exports.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)}}),exports.resetFactoryData=async deviceId=>getFFAAKeyAsync(deviceId,"0x20",["0x01"],"恢复出厂设置"),exports.resetSecondaryKey=async deviceId=>getFFAAKeyAsync(deviceId,"0x1F",["0x01"],"恢复二级密码"),exports.resolveFFAA25=data=>{if(!data)return null;const dataStr=BleDataProcess.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}},exports.resolveFFAA26=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),response=dataStr.slice(6,-2);return{dataStr:dataStr,response:response,result:0==response}},exports.resolveFFAA80=resolveFFAA80,exports.resolveFFAAKey=resolveFFAAKey,exports.setBluetoothName=async(deviceId,value)=>{const content=BleDataProcess.string2hexArr(value).map(o=>`0x${o}`),hex=await getFFAAKeyAsync(deviceId,"0x07",content,"蓝牙名称");if(hex&&7==hex[2])return!0;throw new Error("设置蓝牙名称失败")},exports.setWiFi=setWiFi,exports.setWiFiSta=setWiFiSta,exports.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 BleCmdAnalysis.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=>BleDataProcess.hex2string(o)),len=pkg.length,[c1]=BleDataProcess.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},exports.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};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleCmdAnalysis=require("./BleCmdAnalysis.js"),BleDataProcess=require("../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=BleDataProcess.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=>BleDataProcess.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])=>BleDataProcess.extractBits(v,s,e)).join("-")},formatAssicString=value=>{const v=format2HexString(value);return BleDataProcess.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},resolveHVESMonoVolInfo=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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",BleDataProcess.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",BleDataProcess.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",BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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}};exports.getCMDESInfoAsync=async(deviceId,command)=>{"string"==typeof command&&(command=command.match(/(.{2})/g).map(o=>`0x${o}`));const data=await BleCmdAnalysis.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]=BleDataProcess.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=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16);result={data:data,dataStr:dataStr,header:header}}return result},exports.getHVESInfoAsync=async(deviceId,codes)=>{const[addr,code]=codes,checks=BleDataProcess.generateCrc16modbusCheck(codes,!0),command=[...codes,...checks];return BleCmdAnalysis.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]=BleDataProcess.generateCrc16modbusCheck(pkg.slice(0,len-2),!0),[_c1,_c2]=[pkg[len-2],pkg[len-1]];return{verified:c1==_c1&&c2==_c2}}},`HVES_${addr}_${code}`)},exports.resolveHVESBMUInfo=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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:BleDataProcess.extractBits(v,0,12),equState:BleDataProcess.extractBits(v,13,14),onlioeState:BleDataProcess.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:BleDataProcess.extractBits(v,0,14),onlioeState:BleDataProcess.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}},exports.resolveHVESBaseInfo=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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=>BleDataProcess.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",BleDataProcess.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=BleDataProcess.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}},exports.resolveHVESCalibrationC1Info=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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}},exports.resolveHVESCalibrationC2Info=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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}},exports.resolveHVESCalibrationConfigInfo=resolveHVESCalibrationConfigInfo,exports.resolveHVESCalibrationInfo=resolveHVESCalibrationInfo,exports.resolveHVESCtInfo=resolveHVESCtInfo,exports.resolveHVESDisCtInfo=resolveHVESDisCtInfo,exports.resolveHVESElectrodeHTInfo=resolveHVESElectrodeHTInfo,exports.resolveHVESEtInfo=resolveHVESEtInfo,exports.resolveHVESInsulationLRInfo=resolveHVESInsulationLRInfo,exports.resolveHVESLSocInfo=resolveHVESLSocInfo,exports.resolveHVESMonoVolInfo=resolveHVESMonoVolInfo,exports.resolveHVESOeInfo=resolveHVESOeInfo,exports.resolveHVESOtRisingInfo=resolveHVESOtRisingInfo,exports.resolveHVESOtrInfo=resolveHVESOtrInfo,exports.resolveHVESOvrInfo=resolveHVESOvrInfo,exports.resolveHVESPackInfo=resolveHVESPackInfo,exports.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},exports.resolveHVESSumInfo=async data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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}},exports.resolveHVESSumVolInfo=resolveHVESSumVolInfo,exports.resolveHVESVersionInfo=data=>{if(!data)return null;const dataStr=BleDataProcess.hexArr2string(data),header=dataStr.slice(0,16),c=data.slice(8,data.length-2).map(o=>BleDataProcess.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}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleDataProcess=require("../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=BleDataProcess.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,"")}exports.HostProtocol=class{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=BleDataProcess.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}}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleDataProcess=require("../BleDataProcess.js"),BleCmdDD=require("./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=BleDataProcess.decimalToTwoByteHexArray(address),hexLength=BleDataProcess.decimalToHex(length),handleRead=async(readFunction,index)=>{try{const hex=await readFunction();if(4==index&&needFactoryMode&&await BleCmdDD.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 BleCmdDD.getDDA5FAAsync(deviceId,hexAddress,hexLength),7);else{if(!oldAddress)return resolve(null);needFactoryMode&&await BleCmdDD.enterFactory(deviceId),await handleRead(async()=>await BleCmdDD.getDDA5OldAsync(deviceId,oldAddress),4)}}catch(error){console.error("读取参数出错---: ",error),reject(error)}})),setParamCmd=(chipType,deviceId,paramInfoArray)=>{console.log("chipType: 芯片",chipType);const paramsToProcess=Array.isArray(paramInfoArray)?paramInfoArray:[paramInfoArray];return new Promise(async(resolve,reject)=>{try{await BleCmdDD.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=BleDataProcess.decimalToTwoByteHexArray(address),hexLength=BleDataProcess.decimalToHex(length);let hex;if(hex=chipType?await BleCmdDD.setDDA5FAAsync(deviceId,hexAddress,hexLength,values):await BleCmdDD.setDDA5OldAsync(deviceId,oldAddress,values),console.log(`data: 写入第${i+1}个参数结果`,hex),!hex)throw new Error(`设置第${i+1}个参数失败`);results.push(hex)}await BleCmdDD.existFactory(deviceId),resolve(results)}catch(error){console.error("设置参数出错: ",error);try{await BleCmdDD.existFactory(deviceId)}catch(exitError){console.error("退出工厂模式失败: ",exitError)}reject(error)}})};exports.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}},exports.readParamCmd=readParamCmd,exports.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=BleDataProcess.decimalToTwoByteHexArray(100*Number(paramObj.values)),hexAddress=BleDataProcess.decimalToTwoByteHexArray(address),hexLength=BleDataProcess.decimalToHex(length);return chipType?await handleSet(()=>BleCmdDD.setDDA5FAAsync(deviceId,hexAddress,hexLength,hexValues)):await handleSet(()=>BleCmdDD.setDDA5OldAsync(deviceId,oldAddress,hexValues))};try{await BleCmdDD.enterFactory(deviceId);const paramInfoHex=await handleParam(paramInfo);await handleParam(circular);if(chipType){await handleParam(full)}await BleCmdDD.existFactory(deviceId),paramInfoHex&&resolve(paramInfoHex)}catch(error){reject(error)}})),exports.setParamCmd=setParamCmd,exports.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=BleDataProcess.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}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleDataProcess=require("./BleDataProcess.js"),commonfun=require("./commonfun.js");class BleCmdAnalysis extends BleDataProcess.default{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}=commonfun.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),commonfun.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),commonfun.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")}}exports.BleCmdAnalysis=BleCmdAnalysis,exports.default=BleCmdAnalysis;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});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},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},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)}`]},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}),decimalToHex=(decimal,padding=2)=>Number(decimal).toString(16).padStart(padding,"0"),hex2string=hex=>("00"+hex.toString(16)).slice(-2).toUpperCase(),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,"")};exports.ab2decimalArr=buffer=>Array.prototype.map.call(new Uint8Array(buffer),bit=>bit),exports.ab2hex=buffer=>Array.prototype.map.call(new Uint8Array(buffer),function(bit){return("00"+bit.toString(16)).slice(-2)}).join(""),exports.arrayBufferToHexArray=arrayBufferToHexArray,exports.base64ToHexArray=(base64,withPrefix=!0)=>{const arrayBuffer=uni.base64ToArrayBuffer(base64);return arrayBufferToHexArray(arrayBuffer,withPrefix)},exports.checkSum=checkSum,exports.crc16modbus=crc16modbus,exports.crcCheckSum=crcCheckSum,exports.decimalToHex=decimalToHex,exports.decimalToHex0x=(decimal,padding=2)=>"0x"+Number(decimal).toString(16).padStart(padding,"0"),exports.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)}`]},exports.extractBits=(number,start,end)=>number>>start&(1<<end-start+1)-1,exports.generateCheckSum=generateCheckSum,exports.generateCrc16modbusCheck=(data,swapNeed=!1)=>{const hex=crc16modbus(data,swapNeed),hexStr=decimalToHex(hex,4);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]},exports.generateCrcCheckSum=data=>{const hex=crcCheckSum(data),hexStr=decimalToHex(hex,4);return[`0x${hexStr.slice(0,2)}`,`0x${hexStr.slice(2,4)}`]},exports.getParamBaseValue=arr=>{const hexString=arr.map(el=>decimalToHex(el)).join("");return parseInt(hexString,16)},exports.hex2Ascii=(value=[])=>{const hexString=value.join("");return hexStrAscii(hexString)},exports.hex2Binary=(hex,len=0)=>parseInt(hex,16).toString(2).padStart(len,"0"),exports.hex2string=hex2string,exports.hexArr2Assic=(hexArr=[])=>String.fromCharCode(...hexArr).replace(/\u0000/g,""),exports.hexArr2ab=hexArr=>{const buffer=new ArrayBuffer(hexArr.length),dataView=new DataView(buffer);return hexArr.forEach((hex,i)=>dataView.setUint8(i,hex)),buffer},exports.hexArr2string=(hexArr=[],connector="")=>hexArr.map(o=>hex2string(o)).join(connector),exports.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},exports.hexStrAscii=hexStrAscii,exports.hexStringToBinary=hexString=>parseInt(hexString,16).toString(2),exports.hexToDecimal=hex=>parseInt(hex,16),exports.sleep=(n=500)=>new Promise(r=>setTimeout(()=>r(!0),n)),exports.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},exports.stringToTwoHexArray=str=>{const paddedStr=str.padStart(4,"0");return[`0x${paddedStr.slice(0,2)}`,`0x${paddedStr.slice(2,4)}`]};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var commonfun=require("./commonfun.js"),TelinkApi=require("./TelinkApi.js"),Transfer=require("./Transfer.js");const max=Transfer.BLE.PACKAGE_MAX_LENGTH,delayDefault=Transfer.BLE.WRITE_DELAY,{isIOS:isIOS,isAndroid:isAndroid}=commonfun.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.TelinkApi.isTeLink&&TelinkApi.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.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.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(()=>{Transfer.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.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.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.TelinkApi.genCheck([...pkgValue]),pkg=[...pkgValue,...crc];this.write(pkg,5)}addBLECharValueChangeListener(){const that=this;uni.notifyBLECharacteristicValueChange({deviceId:that.deviceId,serviceId:Transfer.BLE.serviceId,characteristicId:Transfer.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==Transfer.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];Transfer.BLE.transferFirmwareFileCmd(this.deviceId,pkg,!0,this.fail.bind(this))}else{const pkg=this.fileHexArray.slice(this.finishedTimes*max,nextTime*max),index=Transfer.Transfer.decimalToTwoByteHexArray(nextTime);Transfer.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(){Transfer.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))}}exports.OTAUpgrade=OTAUpgrade,exports.default=OTAUpgrade;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleCmdDD=require("./BleCmdAnalysis/BleCmdDD.js");exports.TelinkApi=class{static async checkOTAAvailable({deviceId:deviceId,macAddr:macAddr}){const prefix=macAddr.slice(0,8).toUpperCase();try{if("A5:C2:37"==prefix){const socRes=await BleCmdDD.getChipTypeAsync(deviceId);if(console.warn("芯片类型",socRes),socRes&&5==socRes?.type){const versionHex=await BleCmdDD.getDDA503Async(deviceId),versionRes=BleCmdDD.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)}`]}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var commonfun=require("./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){commonfun.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}};exports.BLE=BLE,exports.Logger=class{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}},exports.Observer=class{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)}}},exports.Transfer=Transfer,exports.default=Transfer;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const commonfun={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)=>Number(decimal).toString(16).padStart(padding,"0"),hexToDecimal:hex=>parseInt(hex,16),ab2hex:buffer=>Array.prototype.map.call(new Uint8Array(buffer),function(bit){return("00"+bit.toString(16)).slice(-2)}).join(""),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];let check1="",check2="";return sum?(sum^=65535,sum+=1,sum=this.decimalToHex(sum),check1=sum.substr(0,2),check2=sum.substr(2,2)):(check1="00",check2="00"),{check1:"0x"+check1,check2:"0x"+check2}},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)},decimalToHexConcat:(num1,num2)=>"0x"+num1.toString(16).padStart(2,"0")+num2.toString(16).padStart(2,"0"),decimalToTwoByteHexArray(decimal){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)}`]},base64ToHexArray(base64,withPrefix=!0){if("undefined"!=typeof uni&&uni.base64ToArrayBuffer){const arrayBuffer=uni.base64ToArrayBuffer(base64);return Array.prototype.map.call(new Uint8Array(arrayBuffer),x=>{let hex=("00"+x.toString(16)).slice(-2);return withPrefix?`0x${hex}`:hex})}return["0x41","0x42","0x43"].slice(0,3)},handleDelay:ms=>new Promise(resolve=>setTimeout(resolve,ms)),formatTime(hours){const hour=Math.floor(hours),minute=Math.floor(60*(hours-hour));return console.log("H5环境"),`${hour}H:${minute}m`}};exports.commonfun=commonfun,exports.default=commonfun;
1
+ "use strict";function isEmpty(v){return null==v||""===v}Object.defineProperty(exports,"__esModule",{value:!0});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))}};exports.eventBus=eventBus,exports.formatTimeHHmm=function(hours){const hour=Math.floor(hours),minute=Math.floor(60*(hours-hour));return console.log("H5环境"),`${hour}H:${minute}m`},exports.getOS=function(){const os=uni.getSystemInfoSync()?.osName;return{isIOS:"ios"==os,isAndroid:"android"==os}},exports.inArray=function(arr,key,val){for(let i=0;i<arr.length;i++)if(arr[i][key]===val)return i;return-1},exports.isEmpty=isEmpty,exports.isNotEmpty=function(v){return!isEmpty(v)};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const tempFuncJson=Array.from({length:8},(_,index)=>({name:""+(0===index?"保护板温度":`电池温度${index}`),value:"",newValue:"",checked:!1,unit:"",key:`tempera${index}`}));exports.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}],exports.capInfoJson=[{key:"normCap",paramNo:0,oldParamNo:"0x10",paramLength:2},{key:"cycleCap",paramNo:1,oldParamNo:"0x11",paramLength:2},{key:"fullCap",paramNo:112,oldParamNo:"",paramLength:2}],exports.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"}],exports.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}],exports.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"}],exports.funcAndTempFuncJson=[{paramNo:29,oldParamNo:"0x2D",paramLength:2,key:"func"},{paramNo:30,oldParamNo:"0x2E",paramLength:2,key:"tempFunc"}],exports.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"}],exports.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"}],exports.tempFuncJson=tempFuncJson,exports.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"}],exports.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}];
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BleCmdFFAA=require("./BleCmdAnalysis/BleCmdFFAA.js"),BleDataProcess=require("./BleDataProcess.js");const 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=BleDataProcess.string2hexArr(key);return macArr.forEach((el,index)=>{let macDec="0x"+el,psdDec=psdHex[index],codeDec=(parseInt(macDec,16)^parseInt(psdDec,16))+randomNum,codeHex=BleDataProcess.decimalToHex0x(codeDec);codeHex=255&parseInt(codeHex,16),psdCode.push(BleDataProcess.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(BleDataProcess.decimalToHex0x(randomNum));return await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,code,psdCode,`验证或启用key${code}`)},sendOldAppKey=async(deviceData,key)=>{let psdHex=BleDataProcess.string2hexArr(key);return await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,"0x15",psdHex,"验证旧appkey")},getRandomNum=async deviceData=>{if(deviceData.isNewAppKey)return Math.floor(99*Math.random())+1;{const hex=await BleCmdFFAA.getFFAA17Async(deviceData.deviceId),data=BleCmdFFAA.resolveFFAAKey(hex);return data?.response}},extractModuleInfo=hexString=>({moduleType:hexString.slice(8,12),productType:hexString.slice(12,14),protocolVersion:hexString.slice(14,16),appkeyStatus:hexString.slice(16,18)}),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}}};exports.ALLOWED_MAC_PREFIX="A5:C2",exports.APP_KEY_STATUS=APP_KEY_STATUS,exports.extractModuleInfo=extractModuleInfo,exports.getRandomNum=getRandomNum,exports.getTypeBuyCmd=async deviceData=>{const hex=await BleCmdFFAA.getBroadcastDataCmd(deviceData.deviceId),data=BleCmdFFAA.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},exports.handleNewAppKey=handleNewAppKey,exports.handleOldAppKey=handleOldAppKey,exports.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}},exports.sendEnableOrVerifyKey=sendEnableOrVerifyKey,exports.sendOldAppKey=sendOldAppKey,exports.sendVerifyPwd=async(deviceData,pwd,code)=>{console.warn("deviceData: -----------",deviceData);const randomNum=await getRandomNum(deviceData),psdCode=verifyMacAddrAndKey(deviceData.macAddr,pwd,randomNum);deviceData.isNewAppKey&&psdCode.push(BleDataProcess.decimalToHex0x(randomNum));const hex=await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,code,psdCode,"验证密码");return console.log("hex: 验证密码",hex),hex},exports.sendWrite1LevelPwd=async(deviceData,pwd)=>{if(deviceData.isNewAppKey){const randomNum=await getRandomNum(deviceData),psdCode=verifyMacAddrAndKey(deviceData.macAddr,pwd,randomNum);psdCode.push(BleDataProcess.decimalToHex0x(randomNum));const hex=await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,"0x16",psdCode,"写入一级密码");return console.log("hex:写入一级密码 ",hex),hex}let psdHex=BleDataProcess.string2hexArr(pwd);return await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,"0x16",psdHex,"写入一级密码")},exports.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(BleDataProcess.decimalToHex0x(randomNum)),code="0x24"):code="0x1D";resolve(await BleCmdFFAA.getFFAAKeyAsync(deviceData.deviceId,code,psdCode,"验证三级密码"))}),exports.verifyMacAddrAndKey=verifyMacAddrAndKey;
package/dist/cjs/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var array=require("./core/array.js"),BleApiManager=require("./core/BleApiManager.js"),commonfun=require("./core/commonfun.js");exports.chunk=array.chunk,exports.unique=array.unique,exports.BleApiManager=BleApiManager.BleApiManager,exports.commonfun=commonfun.commonfun;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var array=require("./core/array.js"),BleApiManager=require("./core/BleApiManager.js"),commonfun=require("./core/commonfun.js"),keyAndPwdManager=require("./core/keyAndPwdManager.js"),OtaUpgrade=require("./core/OtaUpgrade.js"),TelinkApi=require("./core/TelinkApi.js"),Transfer=require("./core/Transfer.js"),BleDataProcess=require("./core/BleDataProcess.js"),BleCmdAnalysis=require("./core/BleCmdAnalysis/BleCmdAnalysis.js"),BleCmdFFAA=require("./core/BleCmdAnalysis/BleCmdFFAA.js"),BleCmdDD=require("./core/BleCmdAnalysis/BleCmdDD.js"),readAndSetParam=require("./core/BleCmdAnalysis/readAndSetParam.js"),BaseParamProtocol=require("./core/BleCmdAnalysis/BaseParamProtocol.js"),BleCmdHVES=require("./core/BleCmdAnalysis/BleCmdHVES.js"),ESHostProtocol=require("./core/BleCmdAnalysis/ESHostProtocol.js"),baseParamsJson=require("./core/dataJson/baseParamsJson.js");exports.chunk=array.chunk,exports.unique=array.unique,exports.connectAsync=BleApiManager.connectAsync,exports.createBLEConnection=BleApiManager.createBLEConnection,exports.disConnect=BleApiManager.disConnect,exports.foundScanDevice=BleApiManager.foundScanDevice,exports.getBLEDeviceCharacteristics=BleApiManager.getBLEDeviceCharacteristics,exports.getBLEDeviceServices=BleApiManager.getBLEDeviceServices,exports.getBluetoothAdapterState=BleApiManager.getBluetoothAdapterState,exports.initBle=BleApiManager.initBle,exports.notify=BleApiManager.notify,exports.onBLECharacteristicValueChange=BleApiManager.onBLECharacteristicValueChange,exports.onBLEConnectionStateChange=BleApiManager.onBLEConnectionStateChange,exports.onBleChangedConnectionState=BleApiManager.onBleChangedConnectionState,exports.onBluetoothAdapterStateChange=BleApiManager.onBluetoothAdapterStateChange,exports.onBluetoothDeviceFound=BleApiManager.onBluetoothDeviceFound,exports.onFoundDevice=BleApiManager.onFoundDevice,exports.scanHandle=BleApiManager.scanHandle,exports.startDevicesDiscovery=BleApiManager.startDevicesDiscovery,exports.stopBluetoothDevicesDiscovery=BleApiManager.stopBluetoothDevicesDiscovery,exports.eventBus=commonfun.eventBus,exports.formatTimeHHmm=commonfun.formatTimeHHmm,exports.getOS=commonfun.getOS,exports.inArray=commonfun.inArray,exports.isEmpty=commonfun.isEmpty,exports.isNotEmpty=commonfun.isNotEmpty,exports.ALLOWED_MAC_PREFIX=keyAndPwdManager.ALLOWED_MAC_PREFIX,exports.APP_KEY_STATUS=keyAndPwdManager.APP_KEY_STATUS,exports.extractModuleInfo=keyAndPwdManager.extractModuleInfo,exports.getRandomNum=keyAndPwdManager.getRandomNum,exports.getTypeBuyCmd=keyAndPwdManager.getTypeBuyCmd,exports.handleNewAppKey=keyAndPwdManager.handleNewAppKey,exports.handleOldAppKey=keyAndPwdManager.handleOldAppKey,exports.sendAppKey=keyAndPwdManager.sendAppKey,exports.sendEnableOrVerifyKey=keyAndPwdManager.sendEnableOrVerifyKey,exports.sendOldAppKey=keyAndPwdManager.sendOldAppKey,exports.sendVerifyPwd=keyAndPwdManager.sendVerifyPwd,exports.sendWrite1LevelPwd=keyAndPwdManager.sendWrite1LevelPwd,exports.verify3LevelPassword=keyAndPwdManager.verify3LevelPassword,exports.verifyMacAddrAndKey=keyAndPwdManager.verifyMacAddrAndKey,exports.OTAUpgrade=OtaUpgrade.OTAUpgrade,exports.TelinkApi=TelinkApi.TelinkApi,exports.BLE=Transfer.BLE,exports.Logger=Transfer.Logger,exports.Observer=Transfer.Observer,exports.Transfer=Transfer.Transfer,exports.ab2decimalArr=BleDataProcess.ab2decimalArr,exports.ab2hex=BleDataProcess.ab2hex,exports.arrayBufferToHexArray=BleDataProcess.arrayBufferToHexArray,exports.base64ToHexArray=BleDataProcess.base64ToHexArray,exports.checkSum=BleDataProcess.checkSum,exports.crc16modbus=BleDataProcess.crc16modbus,exports.crcCheckSum=BleDataProcess.crcCheckSum,exports.decimalToHex=BleDataProcess.decimalToHex,exports.decimalToHex0x=BleDataProcess.decimalToHex0x,exports.decimalToTwoByteHexArray=BleDataProcess.decimalToTwoByteHexArray,exports.extractBits=BleDataProcess.extractBits,exports.generateCheckSum=BleDataProcess.generateCheckSum,exports.generateCrc16modbusCheck=BleDataProcess.generateCrc16modbusCheck,exports.generateCrcCheckSum=BleDataProcess.generateCrcCheckSum,exports.getParamBaseValue=BleDataProcess.getParamBaseValue,exports.hex2Ascii=BleDataProcess.hex2Ascii,exports.hex2Binary=BleDataProcess.hex2Binary,exports.hex2string=BleDataProcess.hex2string,exports.hexArr2Assic=BleDataProcess.hexArr2Assic,exports.hexArr2ab=BleDataProcess.hexArr2ab,exports.hexArr2string=BleDataProcess.hexArr2string,exports.hexArrayToModuleArrayBuffer=BleDataProcess.hexArrayToModuleArrayBuffer,exports.hexStrAscii=BleDataProcess.hexStrAscii,exports.hexStringToBinary=BleDataProcess.hexStringToBinary,exports.hexToDecimal=BleDataProcess.hexToDecimal,exports.sleep=BleDataProcess.sleep,exports.string2hexArr=BleDataProcess.string2hexArr,exports.stringToTwoHexArray=BleDataProcess.stringToTwoHexArray,exports.getData=BleCmdAnalysis.getData,exports.setMTUAsync=BleCmdAnalysis.setMTUAsync,exports.clearPrimaryKey=BleCmdFFAA.clearPrimaryKey,exports.getBluetoothName=BleCmdFFAA.getBluetoothName,exports.getBroadcastDataCmd=BleCmdFFAA.getBroadcastDataCmd,exports.getFFAA03Async=BleCmdFFAA.getFFAA03Async,exports.getFFAA17Async=BleCmdFFAA.getFFAA17Async,exports.getFFAA25Async=BleCmdFFAA.getFFAA25Async,exports.getFFAA26Async=BleCmdFFAA.getFFAA26Async,exports.getFFAA80Async=BleCmdFFAA.getFFAA80Async,exports.getFFAAKeyAsync=BleCmdFFAA.getFFAAKeyAsync,exports.getWiFiIP=BleCmdFFAA.getWiFiIP,exports.resetFactoryData=BleCmdFFAA.resetFactoryData,exports.resetSecondaryKey=BleCmdFFAA.resetSecondaryKey,exports.resolveFFAA25=BleCmdFFAA.resolveFFAA25,exports.resolveFFAA26=BleCmdFFAA.resolveFFAA26,exports.resolveFFAA80=BleCmdFFAA.resolveFFAA80,exports.resolveFFAAKey=BleCmdFFAA.resolveFFAAKey,exports.setBluetoothName=BleCmdFFAA.setBluetoothName,exports.setWiFi=BleCmdFFAA.setWiFi,exports.setWiFiSta=BleCmdFFAA.setWiFiSta,exports.set_PlanCMD_FFAA=BleCmdFFAA.set_PlanCMD_FFAA,exports.set_PlanCMD_FFAA80=BleCmdFFAA.set_PlanCMD_FFAA80,exports.enterFactory=BleCmdDD.enterFactory,exports.existFactory=BleCmdDD.existFactory,exports.get3B3CAsync=BleCmdDD.get3B3CAsync,exports.get3B3CInfo=BleCmdDD.get3B3CInfo,exports.getChipTypeAsync=BleCmdDD.getChipTypeAsync,exports.getDD5A0AAsync=BleCmdDD.getDD5A0AAsync,exports.getDD5A0EAsync=BleCmdDD.getDD5A0EAsync,exports.getDD5A17Async=BleCmdDD.getDD5A17Async,exports.getDD5AAllAsync=BleCmdDD.getDD5AAllAsync,exports.getDD5AE0Async=BleCmdDD.getDD5AE0Async,exports.getDD5AE1Async=BleCmdDD.getDD5AE1Async,exports.getDD5AE4Async=BleCmdDD.getDD5AE4Async,exports.getDD5AFAAsync=BleCmdDD.getDD5AFAAsync,exports.getDD5AFBAsync=BleCmdDD.getDD5AFBAsync,exports.getDDA503Async=BleCmdDD.getDDA503Async,exports.getDDA504Async=BleCmdDD.getDDA504Async,exports.getDDA505Async=BleCmdDD.getDDA505Async,exports.getDDA507Async=BleCmdDD.getDDA507Async,exports.getDDA508Async=BleCmdDD.getDDA508Async,exports.getDDA5FAAsync=BleCmdDD.getDDA5FAAsync,exports.getDDA5OldAsync=BleCmdDD.getDDA5OldAsync,exports.getProtectCountCmd=BleCmdDD.getProtectCountCmd,exports.readExistFactory=BleCmdDD.readExistFactory,exports.resolve3B3C=BleCmdDD.resolve3B3C,exports.resolveBMSCmd=BleCmdDD.resolveBMSCmd,exports.resolveBaseDD=BleCmdDD.resolveBaseDD,exports.resolveDDA500=BleCmdDD.resolveDDA500,exports.resolveDDA503=BleCmdDD.resolveDDA503,exports.resolveDDA504=BleCmdDD.resolveDDA504,exports.resolveDDA505=BleCmdDD.resolveDDA505,exports.resolveDDA508=BleCmdDD.resolveDDA508,exports.resolveDDA5FA=BleCmdDD.resolveDDA5FA,exports.resolveProtections=BleCmdDD.resolveProtections,exports.sendBMSAsync=BleCmdDD.sendBMSAsync,exports.setDDA5FAAsync=BleCmdDD.setDDA5FAAsync,exports.setDDA5OldAsync=BleCmdDD.setDDA5OldAsync,exports.set_PlanCMD_3B3C=BleCmdDD.set_PlanCMD_3B3C,exports.set_PlanCMD_DD=BleCmdDD.set_PlanCMD_DD,exports.getSysParamCmd=readAndSetParam.getSysParamCmd,exports.readParamCmd=readAndSetParam.readParamCmd,exports.setCapacityParamCmd=readAndSetParam.setCapacityParamCmd,exports.setParamCmd=readAndSetParam.setParamCmd,exports.setSysParamCmd=readAndSetParam.setSysParamCmd,exports.getBaseInfo=BaseParamProtocol.getBaseInfo,exports.getBaseParams=BaseParamProtocol.getBaseParams,exports.getResistance=BaseParamProtocol.getResistance,exports.getCMDESInfoAsync=BleCmdHVES.getCMDESInfoAsync,exports.getHVESInfoAsync=BleCmdHVES.getHVESInfoAsync,exports.resolveHVESBMUInfo=BleCmdHVES.resolveHVESBMUInfo,exports.resolveHVESBaseInfo=BleCmdHVES.resolveHVESBaseInfo,exports.resolveHVESCalibrationC1Info=BleCmdHVES.resolveHVESCalibrationC1Info,exports.resolveHVESCalibrationC2Info=BleCmdHVES.resolveHVESCalibrationC2Info,exports.resolveHVESCalibrationConfigInfo=BleCmdHVES.resolveHVESCalibrationConfigInfo,exports.resolveHVESCalibrationInfo=BleCmdHVES.resolveHVESCalibrationInfo,exports.resolveHVESCtInfo=BleCmdHVES.resolveHVESCtInfo,exports.resolveHVESDisCtInfo=BleCmdHVES.resolveHVESDisCtInfo,exports.resolveHVESElectrodeHTInfo=BleCmdHVES.resolveHVESElectrodeHTInfo,exports.resolveHVESEtInfo=BleCmdHVES.resolveHVESEtInfo,exports.resolveHVESInsulationLRInfo=BleCmdHVES.resolveHVESInsulationLRInfo,exports.resolveHVESLSocInfo=BleCmdHVES.resolveHVESLSocInfo,exports.resolveHVESMonoVolInfo=BleCmdHVES.resolveHVESMonoVolInfo,exports.resolveHVESOeInfo=BleCmdHVES.resolveHVESOeInfo,exports.resolveHVESOtRisingInfo=BleCmdHVES.resolveHVESOtRisingInfo,exports.resolveHVESOtrInfo=BleCmdHVES.resolveHVESOtrInfo,exports.resolveHVESOvrInfo=BleCmdHVES.resolveHVESOvrInfo,exports.resolveHVESPackInfo=BleCmdHVES.resolveHVESPackInfo,exports.resolveHVESParamsInfo=BleCmdHVES.resolveHVESParamsInfo,exports.resolveHVESSumInfo=BleCmdHVES.resolveHVESSumInfo,exports.resolveHVESSumVolInfo=BleCmdHVES.resolveHVESSumVolInfo,exports.resolveHVESVersionInfo=BleCmdHVES.resolveHVESVersionInfo,exports.HostProtocol=ESHostProtocol.HostProtocol,exports.batteryInfoJson=baseParamsJson.batteryInfoJson,exports.capInfoJson=baseParamsJson.capInfoJson,exports.capVolInfoJson=baseParamsJson.capVolInfoJson,exports.currentInfoJson=baseParamsJson.currentInfoJson,exports.equalizerFunJson=baseParamsJson.equalizerFunJson,exports.funcAndTempFuncJson=baseParamsJson.funcAndTempFuncJson,exports.funcJson=baseParamsJson.funcJson,exports.systemJson=baseParamsJson.systemJson,exports.tempFuncJson=baseParamsJson.tempFuncJson,exports.tempInfoJson=baseParamsJson.tempInfoJson,exports.voltageInfoJson=baseParamsJson.voltageInfoJson;
@@ -1 +1 @@
1
- const BleApiManager={version:"1.0.0"};export{BleApiManager,BleApiManager as default};
1
+ import{getOS,eventBus}from"./commonfun.js";import{ab2decimalArr}from"./BleDataProcess.js";import{ref}from"vue";const serviceId="0000FF00-0000-1000-8000-00805F9B34FB",bluetoothAdapterState=ref({available:!1,discovering:!1}),initBle=async()=>{const checkBluetoothStatus=async()=>new Promise((resolve,reject)=>{uni.openBluetoothAdapter({success:async res=>{console.log("openBluetoothAdapter success",res),resolve(res);try{onBluetoothDeviceFound(),onBLECharacteristicValueChange(),onBLEConnectionStateChange(),onBluetoothAdapterStateChange()}catch(error){console.log("error: ",error),reject(error)}},fail:err=>{console.log("openBluetoothAdapter fail",err),reject(err)}})});try{const{isAndroid:isAndroid}=getOS();isAndroid?(async()=>{const timeoutPromise=new Promise((resolve,reject)=>{setTimeout(()=>{reject(new Error("网络信号差或连接异常,请检查网络情况"))},1e4)}),locationPromise=new Promise((resolve,reject)=>{uni.getLocation({type:"wgs84",success:res=>{console.log("位置信息-----------",res),resolve(res)},fail:err=>{console.log("位置信息err",err),reject(err)}})});Promise.race([locationPromise,timeoutPromise]).then(res=>{checkBluetoothStatus()}).catch(err=>{console.log("位置获取失败或超时:",err),Promise.reject({code:1})})})():checkBluetoothStatus()}catch(error){console.error("初始化蓝牙失败:",error),Promise.reject({code:error.code||error.errCode||-1})}},getBluetoothAdapterState=async()=>new Promise((resolve,reject)=>{uni.getBluetoothAdapterState({success:res=>{console.log("getBluetoothAdapterState success",res),resolve(res)},fail:err=>{console.log("getBluetoothAdapterState fail",err),reject(err)}})}),startDevicesDiscovery=async(allowDuplicatesKey=!0)=>new Promise((resolve,reject)=>{bluetoothAdapterState.value.discovering?reject(new Error("蓝牙设备搜索已在进行中")):uni.startBluetoothDevicesDiscovery({services:[serviceId],allowDuplicatesKey:allowDuplicatesKey,success:async res=>{console.log("广播设备 success",res),resolve(res)},fail:err=>{console.log("广播设备 fail",err),reject(err)}})}),stopBluetoothDevicesDiscovery=async()=>new Promise((resolve,reject)=>{uni.stopBluetoothDevicesDiscovery({success:res=>{console.log("停止广播设备 success",res),resolve(res)},fail:err=>{console.log("停止广播设备 fail",err),reject(err)},complete:res=>{console.log("停止广播设备 取消订阅"),eventBus.off("setBluetoothDeviceFound")}})}),onBluetoothDeviceFound=async()=>{uni.onBluetoothDeviceFound(characteristic=>{console.log("setBluetoothDeviceFound",characteristic);const device=(device=>{const adv=device?.advertisData;if(!adv)return null;if(adv){const advHex=Array.prototype.map.call(new Uint8Array(adv),o=>("00"+o.toString(16)).slice(-2)).join("").toUpperCase();let macAddr=advHex.slice(0,12).toUpperCase(),arr=macAddr.match(/(.{2})/g);const flag=macAddr.slice(-4);"C1A4"!=flag&&"C2A5"!=flag&&"C2A8"!=flag||arr.reverse(),macAddr=arr.join(":"),device.hasFound=!0;const moduleType=advHex.slice(12,16),soc=advHex.slice(16,18),productType=advHex.slice(18,20),protocolVersion=advHex.slice(20,22),appkeyStatus=advHex.slice(22,24),broadcastLen=advHex.length/2,isNewAppKey=advHex.length>=24;device={...device,macAddr:macAddr,moduleType:moduleType,soc:soc,productType:productType,advHex:advHex,protocolVersion:protocolVersion,appkeyStatus:appkeyStatus,broadcastLen:broadcastLen,isNewAppKey:isNewAppKey}}return device})(characteristic.devices[0]);device&&eventBus.emit("setBluetoothDeviceFound",device)})},onFoundDevice=callback=>{eventBus.on("setBluetoothDeviceFound",callback)},onBluetoothAdapterStateChange=async()=>{uni.onBluetoothAdapterStateChange(res=>{console.log("onBluetoothAdapterStateChange监听蓝牙适配器变化",res),bluetoothAdapterState.value=res})},onBLECharacteristicValueChange=async()=>{uni.onBLECharacteristicValueChange(characteristic=>{const decimalArr=ab2decimalArr(characteristic.value);console.warn("decimalArr: 监听到的回复-------------------",decimalArr),eventBus.emit("setBleChangedCharacteristicValue",characteristic)})},onBLEConnectionStateChange=async()=>{uni.onBLEConnectionStateChange(characteristic=>{console.log("onBLEConnectionStateChange",characteristic),eventBus.emit("setBleChangedConnectionState",characteristic)})},onBleChangedConnectionState=callback=>{eventBus.on("setBleChangedConnectionState",callback)},createBLEConnection=async(deviceId,timeout=1e4)=>new Promise((resolve,reject)=>{console.log(deviceId,"点击的设备信息"),uni.createBLEConnection({deviceId:deviceId,timeout:timeout,success:res=>{console.log(res,"连接成功"),resolve(!0)},fail:err=>{console.log(err,"Connection"),-1==(err.code||err.errCode)?resolve(!0):reject(err)}})}),withRetry=async(asyncOperation,maxRetries=20,retryInterval=100,type)=>new Promise((resolve,reject)=>{let retryCount=0;const attempt=async()=>{try{const result=await asyncOperation();resolve(result)}catch(error){if(retryCount>=maxRetries)return void reject(new Error(`${type}失败,${error.message} (已重试${maxRetries}次)`));retryCount++,console.warn(`${type}失败,第${retryCount}次重试:`,error.message),setTimeout(attempt,retryInterval)}};attempt()}),getBLEDeviceServices=deviceId=>withRetry(async()=>{const res=await new Promise((resolve,reject)=>{uni.getBLEDeviceServices({deviceId:deviceId,success:resolve,fail:reject})});if(console.log("获取蓝牙服务成功:",res),0===res.services.length)throw new Error("未找到蓝牙服务");return await getBLEDeviceCharacteristics(deviceId),res.services},20,100,"获取蓝牙服务"),getBLEDeviceCharacteristics=async deviceId=>withRetry(async()=>{const res=await new Promise((resolve,reject)=>{uni.getBLEDeviceCharacteristics({deviceId:deviceId,serviceId:serviceId,success:resolve,fail:reject})});return console.log("获取特征值成功:",res),res.characteristics},20,100,"获取蓝牙特征值"),notify=async deviceId=>new Promise((resolve,reject)=>{uni.notifyBLECharacteristicValueChange({deviceId:deviceId,serviceId:serviceId,characteristicId:"0000FF01-0000-1000-8000-00805F9B34FB",state:!0,success:res=>{console.log("订阅===========",res),resolve(res)},fail:reject})}),disConnect=deviceId=>new Promise((resolve,reject)=>{uni.closeBLEConnection({deviceId:deviceId,success:res=>{resolve(res),console.log(res,"断开连接成功")},fail:err=>{reject(err),console.log(err,"err 断开连接")}})}),connectAsync=async(deviceId,timeout=1e4)=>new Promise(async(resolve,reject)=>{try{await createBLEConnection(deviceId,timeout),await getBLEDeviceServices(deviceId),await notify(deviceId),resolve(!0)}catch(error){console.log("error: ",error),reject(error)}}),scanHandle=(historyConnectedList=[],connectFn=device=>{})=>{uni.scanCode({scanType:["barCode","qrCode"],success:async({result:result})=>{console.log("扫描内容: "+result);let searchKey=result;try{const formatMacAddress=mac=>mac.replace(/(.{2})/g,"$1:").slice(0,-1).toUpperCase();let isMac=!1;result.includes("?qrCodeInfo=")?(searchKey=result.split("?qrCodeInfo=")[1],searchKey.includes(":")?(searchKey=searchKey.slice(-17).toUpperCase(),isMac=!0):(searchKey=searchKey.slice(-12),searchKey=formatMacAddress(searchKey),isMac=!0)):17===result.length&&result.includes(":")?(searchKey=result.toUpperCase(),isMac=!0):12===result.length&&(searchKey=formatMacAddress(result),isMac=!0);const{isAndroid:isAndroid}=getOS(),matchedHistoryDevice=historyConnectedList.find(item=>item.macAddr==searchKey);if(matchedHistoryDevice)return void connectFn(matchedHistoryDevice);isAndroid&&isMac?connectFn({deviceId:searchKey,macAddr:searchKey,name:searchKey}):foundScanDevice(searchKey,connectFn)}catch(error){console.log(error)}}})},foundScanDevice=async(result,connectFn)=>{const deviceList=[];await startDevicesDiscovery(),onFoundDevice(device=>{deviceList.push(device);const findDevice=device.macAddr===result||device.name===result;findDevice?(scanTimeout&&(clearTimeout(scanTimeout),scanTimeout=null),uni.stopBluetoothDevicesDiscovery(),connectFn(findDevice)):console.log("未找到设备,继续搜索中...")});let scanTimeout=setTimeout(async()=>{try{console.log("stopBluetoothDevicesDiscovery",deviceList),clearInterval(scanTimer),scanTimer=null,uni.stopBluetoothDevicesDiscovery();const findDevice=deviceList.find(device=>device.macAddr===result||device.name===result);connectFn(findDevice)}finally{}},5e3)};export{connectAsync,createBLEConnection,disConnect,foundScanDevice,getBLEDeviceCharacteristics,getBLEDeviceServices,getBluetoothAdapterState,initBle,notify,onBLECharacteristicValueChange,onBLEConnectionStateChange,onBleChangedConnectionState,onBluetoothAdapterStateChange,onBluetoothDeviceFound,onFoundDevice,scanHandle,startDevicesDiscovery,stopBluetoothDevicesDiscovery};