Socket
Socket
Sign inDemoInstall

qcloud-iotexplorer-bluetooth-adapter-llsync

Package Overview
Dependencies
9
Maintainers
6
Versions
127
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.3.31 to 2.3.32

2

lib/base/LLSync/LLSyncOtaProcessor.js

@@ -1,2 +0,2 @@

"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LLSyncOtaProcessor=void 0;var tslib_1=require("tslib"),qcloud_iotexplorer_appdev_sdk_1=require("qcloud-iotexplorer-appdev-sdk"),constants=tslib_1.__importStar(require("../../constants")),libs_1=require("../../libs"),LLSyncProtocol_1=require("./LLSyncProtocol"),_a=qcloud_iotexplorer_appdev_sdk_1.AppDevSdk.utils,delay=_a.delay,byteUtil=_a.byteUtil,createLLSyncOTACancelToken=function(){var e,t={isCancelled:!1,cancelRejectionPromise:new Promise((function(t,r){e=r})),cancelReason:{code:"USER_CANCEL_OTA_UPDATE"},cancel:function(r){t.isCancelled=!0,t.cancelReason=r,e(r)},checkCancelled:function(){if(t.isCancelled)throw t.cancelReason}};return t},getLLOTADataPackage=function(e,t,r,n){var s=Math.min(n-3,t.fileSize-r);if(!(s<=0)){var o=new ArrayBuffer(3+s),a=new Uint8Array(o),i=parseInt(constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA],16);a.set([i,1+s,e]);var c=new Uint8Array(t.fileBuffer,r,s);return a.set(c,3),{package:o,payloadLength:s}}},LLSyncOtaProcessor=function(){function e(e){this.otaInProgress=!1,this.deviceAdapter=e}return Object.defineProperty(e.prototype,"otaVersion",{get:function(){return this.deviceAdapter.otaVersion},enumerable:!1,configurable:!0}),e.prototype.onProgress=function(e,t){void 0===t&&(t={});var r=constants.OTA_UPDATE_STEPS_MESSAGE[e];"function"==typeof this._onProgressCb&&this._onProgressCb({code:e,msg:r,detail:t})},e.prototype.cancelOta=function(){this.otaInProgress&&this.cancelToken&&this.cancelToken.cancel({code:"USER_CANCEL_OTA_UPDATE"})},e.prototype.startOta=function(e){var t=e.onProgress;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,r,n,s,o,a,i,c,_,l,d;return tslib_1.__generator(this,(function(u){switch(u.label){case 0:if(this.otaInProgress)throw{code:"OTA_UPDATE_IN_PROGRESS",msg:"OTA升级进行中,请勿重复操作"};this.flowLogger=this.deviceAdapter.llsyncLogger.flow("ota","固件升级",!0),this.otaInProgress=!0,e=createLLSyncOTACancelToken(),this.cancelToken=e,this._onProgressCb=t,u.label=1;case 1:if(u.trys.push([1,8,9,10]),!this.otaVersion)throw this.flowLogger.warn("deviceFirmwareVersionUnknown","设备未上报当前固件版本,或不支持固件升级"),{code:"MODULE_DONNOT_SUPPORT"};return this.onProgress(constants.OTA_UPDATE_STEPS.GET_OTA_UPDATE_INFO),[4,this.flowLogger.step("getOtaUpdateInfo","获取固件升级信息",!0).wrap(this.getOtaUpdateInfo())];case 2:if(r=u.sent(),e.checkCancelled(),this.onProgress(constants.OTA_UPDATE_STEPS.GET_OTA_UPDATE_INFO_SUCCESS,{otaUpdateInfo:r}),!r.needUpdate)throw this.flowLogger.warn("otaVersionIsLatest","设备当前已是最新固件版本"),{code:"MODULE_VERSION_IS_UPDATED"};return this.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOADING_OTA_FILE),[4,this.flowLogger.step("downloadOtaFile","下载固件文件",!0).wrap(this.downloadOtaFile(r),(function(e,t){return t.success(null,{fileSize:e.fileSize,fileCrc:e.fileCrc}),e}))];case 3:return n=u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOAD_OTA_FILE_SUCCESS,{fileInfo:tslib_1.__assign(tslib_1.__assign({},n),{fileBuffer:void 0})}),this.onProgress(constants.OTA_UPDATE_STEPS.REQUEST_MODULE_UPDATE_START),[4,this.flowLogger.step("sendOTARequest","发送升级请求",!0).wrap(this.sendOTARequest({fileInfo:n,otaUpdateInfo:r}),(function(e,t){return t.success(null,{supportUploadFromBreak:e.supportUploadFromBreak,otaUpdateProgressInfo:tslib_1.__assign({},e.otaUpdateProgressInfo)}),e}))];case 4:return s=u.sent(),o=s.supportUploadFromBreak,a=s.otaUpdateProgressInfo,this.onProgress(constants.OTA_UPDATE_STEPS.REQUEST_MODULE_UPDATE_SUCCESS,{supportUploadFromBreak:o,otaUpdateProgressInfo:a}),this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_START),i=Date.now(),(c=this.flowLogger.step(0===a.alreadyReceiveSize?"sendOtaFile":"sendOtaFileFromBreak","发送升级数据")).start([c.defaultMessage+"开始","maxSeq="+a.maxSeqPerBatch,"packageLength="+a.maxLengthPerPackage,a.alreadyReceiveSize>0?"从断点 "+a.alreadyReceiveSize+" 开始传输":null],{fileSize:n.fileSize,alreadyReceiveSize:a.alreadyReceiveSize,maxSeq:a.maxSeqPerBatch,packageLength:a.maxLengthPerPackage}),[4,c.wrapWithoutRetValue(this.sendOtaFile({fileInfo:n,otaUpdateProgressInfo:a,cancelToken:e}))];case 5:return u.sent(),[4,this.flowLogger.step("notifyOtaDataEnd","发送升级数据结束通知",!0).wrapWithoutRetValue(this.reportAndConfirmUpdateStatus({otaUpdateProgressInfo:a}))];case 6:return _=u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_SUCCESS,{timeCost:Date.now()-i,response:_}),this.onProgress(constants.OTA_UPDATE_STEPS.WAITING_MODULE_UPDATE),l=Date.now(),[4,this.flowLogger.step("checkRebootStatus","等待设备重启",!0).wrapWithoutRetValue(this.checkRebootStatus({otaUpdateInfo:r,rebootMaxTime:a.rebootMaxTime,cancelToken:e}))];case 7:return u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS,{timeCost:Date.now()-l}),this.flowLogger.success("固件升级成功,升级后版本号="+r.targetVersion,{version:r.targetVersion}),[2,{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS,msg:constants.OTA_UPDATE_STEPS_MESSAGE[constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS]}];case 8:throw(d=u.sent())||(d={}),d=d instanceof Error?{code:"OTA_INTERNAL_ERROR",msg:constants.OTA_UPDATE_ERRORS.OTA_INTERNAL_ERROR+": "+String(d)}:d.code?tslib_1.__assign({msg:constants.OTA_UPDATE_ERRORS[d.code]||d.msg},d):tslib_1.__assign({code:"OTA_INTERNAL_ERROR"},d),this.flowLogger.fail(null,d),d;case 9:return this.otaInProgress=!1,[7];case 10:return[2]}}))}))},e.prototype.reportAndConfirmUpdateStatus=function(e){var t=e.otaUpdateProgressInfo;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e;return tslib_1.__generator(this,(function(r){return e=""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA_END],this.deviceAdapter.isEncrypted&&(e=this.deviceAdapter.encrypt(e,this.deviceAdapter.sessionKey,{contentType:"hex"})),[2,this.deviceAdapter.writeAndWait4Response(e,constants.UPDATE_DATA_CHECK_REPLY,(function(e){var t,r=e.data;if(!r.length)throw{code:constants.UPDATE_REPLY_INVALID};var n=parseInt(r.slice(2).join(""),16),s=(n<<1&255)>>1;if(!!(n>>7))return{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_CHECK_FILE_SUCCESS};throw{code:"MODULE_UPDATE_CHECK_FILE_FAIL",msg:null!==(t=constants.MODULE_UPDATE_REPLAY_DATA_CODE_MAP[s])&&void 0!==t?t:"错误码="+s,deviceErrCode:s}}),{timeout:t.retryTimeGap*t.retryTimes,timeoutCode:"UPDATE_DATA_REPLAY_TIMEOUT",writeId:constants.LL_OTA_WRITE_ID,shouldWrapSplitDataFn:!1})]}))}))},e.prototype.getOtaUpdateInfo=function(){return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,t,r,n,s;return tslib_1.__generator(this,(function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,this.deviceAdapter.models.getDeviceOTAInfo({DeviceId:this.deviceAdapter.explorerDeviceId})];case 1:return e=o.sent(),t=e.FirmwareURL,r=e.TargetVersion,n={needUpdate:!1,targetVersion:r,otaUrl:t},this.otaVersion&&r!==this.otaVersion&&(n.needUpdate=!0),[2,n];case 2:return"FailedOperation.DeviceFirmwareIsUpdated"===(null==(s=o.sent())?void 0:s.code)?(this.flowLogger.warn("otaVersionIsLatestFromCgi","云端无该设备的升级任务"),[2,Promise.reject({code:"MODULE_VERSION_IS_UPDATED"})]):[2,Promise.reject({code:"GET_OTA_INFO_FAIL"})];case 3:return[2]}}))}))},e.prototype.sendOTARequest=function(e){var t=this,r=e.fileInfo,n=e.otaUpdateInfo,s=byteUtil.hexString2hexArray(libs_1.str2hexStr(n.targetVersion)),o=byteUtil.hexString2hexArray(libs_1.U32ToHexString(r.fileSize)+""+libs_1.U32ToHexString(r.fileCrc)+libs_1.U8ToHexString(s.length)+s.join("")),a=this.deviceAdapter.sliceData(tslib_1.__spread([""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_REQUEST],libs_1.U16ToHexString(o.length)],o),[o],constants.UPDATE_REPLY);return this.deviceAdapter.isEncrypted&&(a=this.deviceAdapter.encrypt(a,this.deviceAdapter.sessionKey,{contentType:"hex"})),this.deviceAdapter.writeAndWait4Response(a,constants.UPDATE_REPLY,(function(e){if(!e.length)throw{code:constants.UPDATE_REPLY_INVALID};var r=parseInt(e.slice(2,3).join(""),16),n=!!(1&r),s=!!(r>>1&1),o=e.slice(3);if(!n){var a=parseInt(o.slice(0,1),16);switch(t.flowLogger.error("recvOTARequestReject","[收到设备回复] 设备拒绝进行固件升级",{deviceErrCode:a}),a){case 2:throw{code:constants.DEVICE_REJECT_OTA_LOW_POWER};case 3:throw{code:constants.DEVICE_REJECT_OTA_INVALID_VERSION};default:throw{code:constants.MODULE_DONNOT_ALLOW}}}var i={maxSeqPerBatch:parseInt(o.slice(0,1).join(""),16),maxLengthPerPackage:parseInt(o.slice(1,2).join(""),16),retryTimeGap:1e3*parseInt(o.slice(2,3).join(""),16),retryTimes:5,rebootMaxTime:1e3*parseInt(o.slice(3,4).join(""),16),alreadyReceiveSize:parseInt(o.slice(4,8).join(""),16),sendWaitGap:parseInt(o.slice(8,9).join("")||0,16)};if(t.flowLogger.info("recvOTARequestResp","收到升级请求应答",tslib_1.__assign({},i)),i.maxLengthPerPackage=Math.min(i.maxLengthPerPackage,t.deviceAdapter.mtu),t.deviceAdapter.isEncrypted){var c=libs_1.getMtuEncrypted(i.maxLengthPerPackage);i.maxLengthPerPackage=Math.min(i.maxLengthPerPackage,c)}return{supportUploadFromBreak:s,otaUpdateProgressInfo:i}}),{timeout:LLSyncProtocol_1.LLSyncConfig.waitUpdateReplyInt,timeoutCode:constants.WAIT_GET_UPDATE_INFO_TIMEOUT,writeId:constants.LL_OTA_WRITE_ID})},e.prototype.reportSendOtaDataSuccess=function(){var e=""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA_END];return this.deviceAdapter.isEncrypted&&(e=this.deviceAdapter.encrypt(e,this.deviceAdapter.sessionKey,{contentType:"hex"})),this.deviceAdapter.write(e,{writeId:constants.LL_OTA_WRITE_ID})},e.prototype.sendOtaFile=function(e){var t=e.fileInfo,r=e.otaUpdateProgressInfo,n=e.cancelToken,s=e.nextSeq,o=void 0===s?0:s,a=e.retryCounter,i=void 0===a?0:a;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,s,a,c,_,l=this;return tslib_1.__generator(this,(function(d){switch(d.label){case 0:this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_DETAIL,{progress:Math.floor(r.alreadyReceiveSize/t.fileSize*100)}),e=function(){n.cancel({code:"BLE_CONNECTION_BREAK"}),l.flowLogger.error("sendOtaFile.disconnect","发送升级数据时蓝牙连接断开")},this.deviceAdapter.once("disconnect",e),s={current:null},c=function(e){var n=e.data;if(n.length){var o=parseInt(n.slice(2,3).join(""),16),i=parseInt(n.slice(3,7).join(""),16),c=o===r.maxSeqPerBatch||i>=t.fileSize;c||l.flowLogger.warn("sendOtaFile.recvDataIncompleteAck","[收到设备应答] 设备要求重传部分数据, nextSeq="+o+", fileSizeReceived="+i,{nextSeq:o,fileSizeReceived:i}),s.current={nextSeq:o,fileSizeReceived:i,currentBatchCompleted:c},null==a||a()}else l.flowLogger.error("dataAckInvalid","设备升级数据应答格式有误",{code:constants.UPDATE_REPLY_INVALID})},this.deviceAdapter.on(constants.UPDATE_DATA_REPLY,c),d.label=1;case 1:return d.trys.push([1,5,6,7]),0===i&&0===o||this.flowLogger.warn("sendOtaFile.breakpoint",["续传升级数据, startByte="+r.alreadyReceiveSize,"[seq: "+o+" / "+r.maxSeqPerBatch+"]",0!==i?"[第 "+i+" 次重传]":null],{seq:o,otaUpdateProgressInfo:tslib_1.__assign({},r),retryCounter:i}),[4,Promise.race([n.cancelRejectionPromise,this.sendFileChunks({fileInfo:t,otaUpdateProgressInfo:r,cancelToken:n,startSeq:o,ackRef:s})])];case 2:return d.sent(),s.current?[3,4]:[4,Promise.race([n.cancelRejectionPromise,new Promise((function(e){a=e})),new Promise((function(e,t){setTimeout((function(){t({code:"UPDATE_DATA_REPLAY_TIMEOUT"})}),r.retryTimeGap*r.retryTimes)}))])];case 3:d.sent(),d.label=4;case 4:return[3,7];case 5:return _=d.sent(),this.flowLogger.warn("sendOtaFile.errorPos","发送升级数据中止位点 seq="+o+", fileSizeReceived="+r.alreadyReceiveSize,{nextSeq:o,fileSizeReceived:r.alreadyReceiveSize}),[2,Promise.reject(_)];case 6:return this.deviceAdapter.off("disconnect",e),this.deviceAdapter.off(constants.UPDATE_DATA_REPLY,c),[7];case 7:return r.alreadyReceiveSize=s.current.fileSizeReceived,!s.current.currentBatchCompleted&&i>=r.retryTimes?[2,Promise.reject({code:"UPDATE_DATA_RETRY_EXCEEDED"})]:r.alreadyReceiveSize<t.fileSize?[2,this.sendOtaFile({fileInfo:t,otaUpdateProgressInfo:r,cancelToken:n,nextSeq:s.current.currentBatchCompleted?0:s.current.nextSeq,retryCounter:s.current.currentBatchCompleted?0:i+1})]:[2]}}))}))},e.prototype.sendFileChunks=function(e){var t=e.fileInfo,r=e.otaUpdateProgressInfo,n=e.startSeq,s=void 0===n?0:n,o=e.cancelToken,a=e.ackRef;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,n,i,c,_,l,d,u,T,A,E;return tslib_1.__generator(this,(function(f){switch(f.label){case 0:e=r.alreadyReceiveSize,n=s,i=!0,c=constants.UPDATE_WRITE_ERROR_TIMES_PER_CIRCLE,f.label=1;case 1:f.trys.push([1,13,,14]),f.label=2;case 2:return e<t.fileSize&&n<r.maxSeqPerBatch?this.deviceAdapter.isConnected?a.current?[2]:o.isCancelled?[2,o.cancelRejectionPromise]:(_=null,i?i=!1:_=delay(r.sendWaitGap||10),l=getLLOTADataPackage(n,t,e,r.maxLengthPerPackage),d=l.payloadLength,u=l.package,T=u,this.deviceAdapter.isEncrypted&&(T=this.deviceAdapter.encrypt(u,this.deviceAdapter.sessionKey)),null===_?[3,4]:[4,_]):(o.cancel({code:"BLE_CONNECTION_BREAK"}),[2,o.cancelRejectionPromise]):[3,12];case 3:if(f.sent(),o.isCancelled)return[2,o.cancelRejectionPromise];f.label=4;case 4:if(a.current)return[2];f.label=5;case 5:if(!(c>0))return[3,11];f.label=6;case 6:return f.trys.push([6,8,,10]),[4,this.deviceAdapter.writeData(T,{writeId:constants.LL_OTA_WRITE_ID,retryTime:0})];case 7:return f.sent(),o.isCancelled?[2,o.cancelRejectionPromise]:(n+=1,e+=d,[3,11]);case 8:if(A=f.sent(),o.isCancelled)return[2,o.cancelRejectionPromise];if(this.flowLogger.error("sendOtaFile.writeRetry","升级数据 seq="+n+", startByte="+e+", length="+d+" 写入失败,剩余重试次数 "+c,A),!--c)throw{code:"BLE_WRITE_ERROR",cause:A};return[4,delay(r.sendWaitGap||10)];case 9:return f.sent(),[3,10];case 10:return[3,5];case 11:return[3,2];case 12:return[3,14];case 13:return E=f.sent(),o.isCancelled?[2,o.cancelRejectionPromise]:E instanceof Error||!(null==E?void 0:E.code)?[2,Promise.reject({code:"OTA_INTERNAL_ERROR",cause:E})]:[2,Promise.reject(E)];case 14:return[2]}}))}))},e.prototype.checkRebootStatus=function(e){var t=e.otaUpdateInfo,r=e.rebootMaxTime,n=e.cancelToken;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,s,o,a,i,c=this;return tslib_1.__generator(this,(function(_){switch(_.label){case 0:return e=function(){return c.otaVersion!==t.targetVersion?(c.flowLogger.error("checkRebootStatus.unexpectedVersion",["设备上报固件版本 ["+c.otaVersion+"]","与 OTA 的目标版本 ["+t.targetVersion+"] 不一致"]),Promise.reject({code:"MODULE_UPDATE_FAIL"})):{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS}},a=function(){return new Promise((function(e){if(c.flowLogger.info("checkRebootStatus.disconnect","等待设备断开蓝牙连接"),c.deviceAdapter.isConnected){var t=function(){e()};s=function(){c.deviceAdapter.off("disconnect",t)},c.deviceAdapter.once("disconnect",t)}else e()}))},i=function(){return new Promise((function(e,t){tslib_1.__awaiter(c,void 0,void 0,(function(){var r,s,a,i,c,_=this;return tslib_1.__generator(this,(function(l){switch(l.label){case 0:if(this.deviceAdapter.authorized)return e(),[2];r=!1,s=function(){r=!0,e()},o=function(){_.deviceAdapter.off("authorized",s)},this.deviceAdapter.once("authorized",s),a=this.deviceAdapter.deviceName,i=0,l.label=1;case 1:if(!(i<=constants.WAIT_MODULE_UPDATE_CONNECT_TIMES)||n.isCancelled||r)return[3,8];n.checkCancelled(),this.flowLogger.info("checkRebootStatus.reconnect","第 "+(i+1)+" 次尝试回连设备"),l.label=2;case 2:return l.trys.push([2,5,,7]),[4,this.deviceAdapter.connectDevice()];case 3:return l.sent(),n.checkCancelled(),[4,this.deviceAdapter.authenticateConnection({deviceName:a})];case 4:return l.sent(),o(),e(),[3,8];case 5:return c=l.sent(),this.flowLogger.error("checkRebootStatus.reconnect","第 "+(i+1)+" 次尝试回连设备失败",c),i+=1,[4,delay(constants.WAIT_MODULE_UPDATE_CONNECT_TIME_GAP)];case 6:return l.sent(),[3,7];case 7:return[3,1];case 8:return t({code:"MODULE_UPDATE_CONNECT_TIMEOUT"}),[2]}}))}))}))},[4,Promise.race([a().then((function(){return i()})).then((function(){return e()})),new Promise((function(e,t){setTimeout((function(){n.isCancelled||(n.cancel({code:constants.WAIT_MODULE_UPDATE_TIMEOUT}),t({code:constants.WAIT_MODULE_UPDATE_TIMEOUT}))}),Math.max(3e4,r))})),n.cancelRejectionPromise]).then((function(e){return null==s||s(),null==o||o(),e})).catch((function(e){return null==s||s(),null==o||o(),Promise.reject(e)}))];case 1:return[2,_.sent()]}}))}))},e.prototype.downloadOtaFile=function(e){return tslib_1.__awaiter(this,void 0,void 0,(function(){var t,r,n,s,o,a,i=this;return tslib_1.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),[4,libs_1.downloadFile(e.otaUrl,{onProgress:function(e){i.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOADING_OTA_FILE_DETAIL,e)}})];case 1:return t=c.sent(),r=t.fileSize,n=t.fileBuffer,(s=new libs_1.CRC32).update(new Int8Array(n)),o=s.getValue(),[2,{fileSize:r,fileCrc:o,fileBuffer:n}];case 2:return a=c.sent(),[2,Promise.reject({code:constants.DOWNLOAD_OTA_FILE_FAIL,detail:a})];case 3:return[2]}}))}))},e}();exports.LLSyncOtaProcessor=LLSyncOtaProcessor;
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LLSyncOtaProcessor=void 0;var tslib_1=require("tslib"),qcloud_iotexplorer_appdev_sdk_1=require("qcloud-iotexplorer-appdev-sdk"),constants=tslib_1.__importStar(require("../../constants")),libs_1=require("../../libs"),LLSyncProtocol_1=require("./LLSyncProtocol"),_a=qcloud_iotexplorer_appdev_sdk_1.AppDevSdk.utils,delay=_a.delay,byteUtil=_a.byteUtil,createLLSyncOTACancelToken=function(){var e,t={isCancelled:!1,cancelRejectionPromise:new Promise((function(t,r){e=r})),cancelReason:{code:"USER_CANCEL_OTA_UPDATE"},cancel:function(r){t.isCancelled=!0,t.cancelReason=r,e(r)},checkCancelled:function(){if(t.isCancelled)throw t.cancelReason}};return t},normalizeFirmwareUrl=function(e){return String(e).replace(/^http:/i,"https:")},getLLOTADataPackage=function(e,t,r,n){var s=Math.min(n-3,t.fileSize-r);if(!(s<=0)){var o=new ArrayBuffer(3+s),i=new Uint8Array(o),a=parseInt(constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA],16);i.set([a,1+s,e]);var c=new Uint8Array(t.fileBuffer,r,s);return i.set(c,3),{package:o,payloadLength:s}}},LLSyncOtaProcessor=function(){function e(e){this.otaInProgress=!1,this.deviceAdapter=e}return Object.defineProperty(e.prototype,"otaVersion",{get:function(){return this.deviceAdapter.otaVersion},enumerable:!1,configurable:!0}),e.prototype.onProgress=function(e,t){void 0===t&&(t={});var r=constants.OTA_UPDATE_STEPS_MESSAGE[e];"function"==typeof this._onProgressCb&&this._onProgressCb({code:e,msg:r,detail:t})},e.prototype.cancelOta=function(){this.otaInProgress&&this.cancelToken&&this.cancelToken.cancel({code:"USER_CANCEL_OTA_UPDATE"})},e.prototype.startOta=function(e){var t=e.onProgress;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,r,n,s,o,i,a,c,l,_,d;return tslib_1.__generator(this,(function(u){switch(u.label){case 0:if(this.otaInProgress)throw{code:"OTA_UPDATE_IN_PROGRESS",msg:"OTA升级进行中,请勿重复操作"};this.flowLogger=this.deviceAdapter.llsyncLogger.flow("ota","固件升级",!0),this.otaInProgress=!0,e=createLLSyncOTACancelToken(),this.cancelToken=e,this._onProgressCb=t,u.label=1;case 1:if(u.trys.push([1,8,9,10]),!this.otaVersion)throw this.flowLogger.warn("deviceFirmwareVersionUnknown","设备未上报当前固件版本,或不支持固件升级"),{code:"MODULE_DONNOT_SUPPORT"};return this.onProgress(constants.OTA_UPDATE_STEPS.GET_OTA_UPDATE_INFO),[4,this.flowLogger.step("getOtaUpdateInfo","获取固件升级信息",!0).wrap(this.getOtaUpdateInfo())];case 2:if(r=u.sent(),e.checkCancelled(),this.onProgress(constants.OTA_UPDATE_STEPS.GET_OTA_UPDATE_INFO_SUCCESS,{otaUpdateInfo:r}),!r.needUpdate)throw this.flowLogger.warn("otaVersionIsLatest","设备当前已是最新固件版本"),{code:"MODULE_VERSION_IS_UPDATED"};return this.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOADING_OTA_FILE),[4,this.flowLogger.step("downloadOtaFile","下载固件文件",!0).wrap(this.downloadOtaFile(r),(function(e,t){return t.success(null,{fileSize:e.fileSize,fileCrc:e.fileCrc}),e}))];case 3:return n=u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOAD_OTA_FILE_SUCCESS,{fileInfo:tslib_1.__assign(tslib_1.__assign({},n),{fileBuffer:void 0})}),this.onProgress(constants.OTA_UPDATE_STEPS.REQUEST_MODULE_UPDATE_START),[4,this.flowLogger.step("sendOTARequest","发送升级请求",!0).wrap(this.sendOTARequest({fileInfo:n,otaUpdateInfo:r}),(function(e,t){return t.success(null,{supportUploadFromBreak:e.supportUploadFromBreak,otaUpdateProgressInfo:tslib_1.__assign({},e.otaUpdateProgressInfo)}),e}))];case 4:return s=u.sent(),o=s.supportUploadFromBreak,i=s.otaUpdateProgressInfo,this.onProgress(constants.OTA_UPDATE_STEPS.REQUEST_MODULE_UPDATE_SUCCESS,{supportUploadFromBreak:o,otaUpdateProgressInfo:i}),this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_START),a=Date.now(),(c=this.flowLogger.step(0===i.alreadyReceiveSize?"sendOtaFile":"sendOtaFileFromBreak","发送升级数据")).start([c.defaultMessage+"开始","maxSeq="+i.maxSeqPerBatch,"packageLength="+i.maxLengthPerPackage,i.alreadyReceiveSize>0?"从断点 "+i.alreadyReceiveSize+" 开始传输":null],{fileSize:n.fileSize,alreadyReceiveSize:i.alreadyReceiveSize,maxSeq:i.maxSeqPerBatch,packageLength:i.maxLengthPerPackage}),[4,c.wrapWithoutRetValue(this.sendOtaFile({fileInfo:n,otaUpdateProgressInfo:i,cancelToken:e}))];case 5:return u.sent(),[4,this.flowLogger.step("notifyOtaDataEnd","发送升级数据结束通知",!0).wrapWithoutRetValue(this.reportAndConfirmUpdateStatus({otaUpdateProgressInfo:i}))];case 6:return l=u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_SUCCESS,{timeCost:Date.now()-a,response:l}),this.onProgress(constants.OTA_UPDATE_STEPS.WAITING_MODULE_UPDATE),_=Date.now(),[4,this.flowLogger.step("checkRebootStatus","等待设备重启",!0).wrapWithoutRetValue(this.checkRebootStatus({otaUpdateInfo:r,rebootMaxTime:i.rebootMaxTime,cancelToken:e}))];case 7:return u.sent(),this.onProgress(constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS,{timeCost:Date.now()-_}),this.flowLogger.success("固件升级成功,升级后版本号="+r.targetVersion,{version:r.targetVersion}),[2,{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS,msg:constants.OTA_UPDATE_STEPS_MESSAGE[constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS]}];case 8:throw(d=u.sent())||(d={}),d=d instanceof Error?{code:"OTA_INTERNAL_ERROR",msg:constants.OTA_UPDATE_ERRORS.OTA_INTERNAL_ERROR+": "+String(d)}:d.code?tslib_1.__assign({msg:constants.OTA_UPDATE_ERRORS[d.code]||d.msg},d):tslib_1.__assign({code:"OTA_INTERNAL_ERROR"},d),this.flowLogger.fail(null,d),d;case 9:return this.otaInProgress=!1,[7];case 10:return[2]}}))}))},e.prototype.reportAndConfirmUpdateStatus=function(e){var t=e.otaUpdateProgressInfo;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e;return tslib_1.__generator(this,(function(r){return e=""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA_END],this.deviceAdapter.isEncrypted&&(e=this.deviceAdapter.encrypt(e,this.deviceAdapter.sessionKey,{contentType:"hex"})),[2,this.deviceAdapter.writeAndWait4Response(e,constants.UPDATE_DATA_CHECK_REPLY,(function(e){var t,r=e.data;if(!r.length)throw{code:constants.UPDATE_REPLY_INVALID};var n=parseInt(r.slice(2).join(""),16),s=(n<<1&255)>>1;if(!!(n>>7))return{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_CHECK_FILE_SUCCESS};throw{code:"MODULE_UPDATE_CHECK_FILE_FAIL",msg:null!==(t=constants.MODULE_UPDATE_REPLAY_DATA_CODE_MAP[s])&&void 0!==t?t:"错误码="+s,deviceErrCode:s}}),{timeout:t.retryTimeGap*t.retryTimes,timeoutCode:"UPDATE_DATA_REPLAY_TIMEOUT",writeId:constants.LL_OTA_WRITE_ID,shouldWrapSplitDataFn:!1})]}))}))},e.prototype.getOtaUpdateInfo=function(){return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,t,r,n,s;return tslib_1.__generator(this,(function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,this.deviceAdapter.models.getDeviceOTAInfo({DeviceId:this.deviceAdapter.explorerDeviceId})];case 1:return e=o.sent(),t=e.FirmwareURL,r=e.TargetVersion,n={needUpdate:!1,targetVersion:r,otaUrl:normalizeFirmwareUrl(t)},this.otaVersion&&r!==this.otaVersion&&(n.needUpdate=!0),[2,n];case 2:return"FailedOperation.DeviceFirmwareIsUpdated"===(null==(s=o.sent())?void 0:s.code)?(this.flowLogger.warn("otaVersionIsLatestFromCgi","云端无该设备的升级任务"),[2,Promise.reject({code:"MODULE_VERSION_IS_UPDATED"})]):[2,Promise.reject({code:"GET_OTA_INFO_FAIL"})];case 3:return[2]}}))}))},e.prototype.sendOTARequest=function(e){var t=this,r=e.fileInfo,n=e.otaUpdateInfo,s=byteUtil.hexString2hexArray(libs_1.str2hexStr(n.targetVersion)),o=byteUtil.hexString2hexArray(libs_1.U32ToHexString(r.fileSize)+""+libs_1.U32ToHexString(r.fileCrc)+libs_1.U8ToHexString(s.length)+s.join("")),i=this.deviceAdapter.sliceData(tslib_1.__spread([""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_REQUEST],libs_1.U16ToHexString(o.length)],o),[o],constants.UPDATE_REPLY);return this.deviceAdapter.isEncrypted&&(i=this.deviceAdapter.encrypt(i,this.deviceAdapter.sessionKey,{contentType:"hex"})),this.deviceAdapter.writeAndWait4Response(i,constants.UPDATE_REPLY,(function(e){if(!e.length)throw{code:constants.UPDATE_REPLY_INVALID};var r=parseInt(e.slice(2,3).join(""),16),n=!!(1&r),s=!!(r>>1&1),o=e.slice(3);if(!n){var i=parseInt(o.slice(0,1),16);switch(t.flowLogger.error("recvOTARequestReject","[收到设备回复] 设备拒绝进行固件升级",{deviceErrCode:i}),i){case 2:throw{code:constants.DEVICE_REJECT_OTA_LOW_POWER};case 3:throw{code:constants.DEVICE_REJECT_OTA_INVALID_VERSION};default:throw{code:constants.MODULE_DONNOT_ALLOW}}}var a={maxSeqPerBatch:parseInt(o.slice(0,1).join(""),16),maxLengthPerPackage:parseInt(o.slice(1,2).join(""),16),retryTimeGap:1e3*parseInt(o.slice(2,3).join(""),16),retryTimes:5,rebootMaxTime:1e3*parseInt(o.slice(3,4).join(""),16),alreadyReceiveSize:parseInt(o.slice(4,8).join(""),16),sendWaitGap:parseInt(o.slice(8,9).join("")||0,16)};if(t.flowLogger.info("recvOTARequestResp","收到升级请求应答",tslib_1.__assign({},a)),a.maxLengthPerPackage=Math.min(a.maxLengthPerPackage,t.deviceAdapter.mtu),t.deviceAdapter.isEncrypted){var c=libs_1.getMtuEncrypted(a.maxLengthPerPackage);a.maxLengthPerPackage=Math.min(a.maxLengthPerPackage,c)}return{supportUploadFromBreak:s,otaUpdateProgressInfo:a}}),{timeout:LLSyncProtocol_1.LLSyncConfig.waitUpdateReplyInt,timeoutCode:constants.WAIT_GET_UPDATE_INFO_TIMEOUT,writeId:constants.LL_OTA_WRITE_ID})},e.prototype.reportSendOtaDataSuccess=function(){var e=""+constants.LL_OTA_WRITE_PREFIX[constants.OTA_UPDATE_DATA_END];return this.deviceAdapter.isEncrypted&&(e=this.deviceAdapter.encrypt(e,this.deviceAdapter.sessionKey,{contentType:"hex"})),this.deviceAdapter.write(e,{writeId:constants.LL_OTA_WRITE_ID})},e.prototype.sendOtaFile=function(e){var t=e.fileInfo,r=e.otaUpdateProgressInfo,n=e.cancelToken,s=e.nextSeq,o=void 0===s?0:s,i=e.retryCounter,a=void 0===i?0:i;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,s,i,c,l,_=this;return tslib_1.__generator(this,(function(d){switch(d.label){case 0:this.onProgress(constants.OTA_UPDATE_STEPS.SEND_UPDATE_DATA_DETAIL,{progress:Math.floor(r.alreadyReceiveSize/t.fileSize*100)}),e=function(){n.cancel({code:"BLE_CONNECTION_BREAK"}),_.flowLogger.error("sendOtaFile.disconnect","发送升级数据时蓝牙连接断开")},this.deviceAdapter.once("disconnect",e),s={current:null},c=function(e){var n=e.data;if(n.length){var o=parseInt(n.slice(2,3).join(""),16),a=parseInt(n.slice(3,7).join(""),16),c=o===r.maxSeqPerBatch||a>=t.fileSize;c||_.flowLogger.warn("sendOtaFile.recvDataIncompleteAck","[收到设备应答] 设备要求重传部分数据, nextSeq="+o+", fileSizeReceived="+a,{nextSeq:o,fileSizeReceived:a}),s.current={nextSeq:o,fileSizeReceived:a,currentBatchCompleted:c},null==i||i()}else _.flowLogger.error("dataAckInvalid","设备升级数据应答格式有误",{code:constants.UPDATE_REPLY_INVALID})},this.deviceAdapter.on(constants.UPDATE_DATA_REPLY,c),d.label=1;case 1:return d.trys.push([1,5,6,7]),0===a&&0===o||this.flowLogger.warn("sendOtaFile.breakpoint",["续传升级数据, startByte="+r.alreadyReceiveSize,"[seq: "+o+" / "+r.maxSeqPerBatch+"]",0!==a?"[第 "+a+" 次重传]":null],{seq:o,otaUpdateProgressInfo:tslib_1.__assign({},r),retryCounter:a}),[4,Promise.race([n.cancelRejectionPromise,this.sendFileChunks({fileInfo:t,otaUpdateProgressInfo:r,cancelToken:n,startSeq:o,ackRef:s})])];case 2:return d.sent(),s.current?[3,4]:[4,Promise.race([n.cancelRejectionPromise,new Promise((function(e){i=e})),new Promise((function(e,t){setTimeout((function(){t({code:"UPDATE_DATA_REPLAY_TIMEOUT"})}),r.retryTimeGap*r.retryTimes)}))])];case 3:d.sent(),d.label=4;case 4:return[3,7];case 5:return l=d.sent(),this.flowLogger.warn("sendOtaFile.errorPos","发送升级数据中止位点 seq="+o+", fileSizeReceived="+r.alreadyReceiveSize,{nextSeq:o,fileSizeReceived:r.alreadyReceiveSize}),[2,Promise.reject(l)];case 6:return this.deviceAdapter.off("disconnect",e),this.deviceAdapter.off(constants.UPDATE_DATA_REPLY,c),[7];case 7:return r.alreadyReceiveSize=s.current.fileSizeReceived,!s.current.currentBatchCompleted&&a>=r.retryTimes?[2,Promise.reject({code:"UPDATE_DATA_RETRY_EXCEEDED"})]:r.alreadyReceiveSize<t.fileSize?[2,this.sendOtaFile({fileInfo:t,otaUpdateProgressInfo:r,cancelToken:n,nextSeq:s.current.currentBatchCompleted?0:s.current.nextSeq,retryCounter:s.current.currentBatchCompleted?0:a+1})]:[2]}}))}))},e.prototype.sendFileChunks=function(e){var t=e.fileInfo,r=e.otaUpdateProgressInfo,n=e.startSeq,s=void 0===n?0:n,o=e.cancelToken,i=e.ackRef;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,n,a,c,l,_,d,u,T,A,E;return tslib_1.__generator(this,(function(f){switch(f.label){case 0:e=r.alreadyReceiveSize,n=s,a=!0,c=constants.UPDATE_WRITE_ERROR_TIMES_PER_CIRCLE,f.label=1;case 1:f.trys.push([1,13,,14]),f.label=2;case 2:return e<t.fileSize&&n<r.maxSeqPerBatch?this.deviceAdapter.isConnected?i.current?[2]:o.isCancelled?[2,o.cancelRejectionPromise]:(l=null,a?a=!1:l=delay(r.sendWaitGap||10),_=getLLOTADataPackage(n,t,e,r.maxLengthPerPackage),d=_.payloadLength,u=_.package,T=u,this.deviceAdapter.isEncrypted&&(T=this.deviceAdapter.encrypt(u,this.deviceAdapter.sessionKey)),null===l?[3,4]:[4,l]):(o.cancel({code:"BLE_CONNECTION_BREAK"}),[2,o.cancelRejectionPromise]):[3,12];case 3:if(f.sent(),o.isCancelled)return[2,o.cancelRejectionPromise];f.label=4;case 4:if(i.current)return[2];f.label=5;case 5:if(!(c>0))return[3,11];f.label=6;case 6:return f.trys.push([6,8,,10]),[4,this.deviceAdapter.writeData(T,{writeId:constants.LL_OTA_WRITE_ID,retryTime:0})];case 7:return f.sent(),o.isCancelled?[2,o.cancelRejectionPromise]:(n+=1,e+=d,[3,11]);case 8:if(A=f.sent(),o.isCancelled)return[2,o.cancelRejectionPromise];if(this.flowLogger.error("sendOtaFile.writeRetry","升级数据 seq="+n+", startByte="+e+", length="+d+" 写入失败,剩余重试次数 "+c,A),!--c)throw{code:"BLE_WRITE_ERROR",cause:A};return[4,delay(r.sendWaitGap||10)];case 9:return f.sent(),[3,10];case 10:return[3,5];case 11:return[3,2];case 12:return[3,14];case 13:return E=f.sent(),o.isCancelled?[2,o.cancelRejectionPromise]:E instanceof Error||!(null==E?void 0:E.code)?[2,Promise.reject({code:"OTA_INTERNAL_ERROR",cause:E})]:[2,Promise.reject(E)];case 14:return[2]}}))}))},e.prototype.checkRebootStatus=function(e){var t=e.otaUpdateInfo,r=e.rebootMaxTime,n=e.cancelToken;return tslib_1.__awaiter(this,void 0,void 0,(function(){var e,s,o,i,a,c=this;return tslib_1.__generator(this,(function(l){switch(l.label){case 0:return e=function(){return c.otaVersion!==t.targetVersion?(c.flowLogger.error("checkRebootStatus.unexpectedVersion",["设备上报固件版本 ["+c.otaVersion+"]","与 OTA 的目标版本 ["+t.targetVersion+"] 不一致"]),Promise.reject({code:"MODULE_UPDATE_FAIL"})):{code:constants.OTA_UPDATE_STEPS.MODULE_UPDATE_SUCCESS}},i=function(){return new Promise((function(e){if(c.flowLogger.info("checkRebootStatus.disconnect","等待设备断开蓝牙连接"),c.deviceAdapter.isConnected){var t=function(){e()};s=function(){c.deviceAdapter.off("disconnect",t)},c.deviceAdapter.once("disconnect",t)}else e()}))},a=function(){return new Promise((function(e,t){tslib_1.__awaiter(c,void 0,void 0,(function(){var r,s,i,a,c,l=this;return tslib_1.__generator(this,(function(_){switch(_.label){case 0:if(this.deviceAdapter.authorized)return e(),[2];r=!1,s=function(){r=!0,e()},o=function(){l.deviceAdapter.off("authorized",s)},this.deviceAdapter.once("authorized",s),i=this.deviceAdapter.deviceName,a=0,_.label=1;case 1:if(!(a<=constants.WAIT_MODULE_UPDATE_CONNECT_TIMES)||n.isCancelled||r)return[3,8];n.checkCancelled(),this.flowLogger.info("checkRebootStatus.reconnect","第 "+(a+1)+" 次尝试回连设备"),_.label=2;case 2:return _.trys.push([2,5,,7]),[4,this.deviceAdapter.connectDevice()];case 3:return _.sent(),n.checkCancelled(),[4,this.deviceAdapter.authenticateConnection({deviceName:i})];case 4:return _.sent(),o(),e(),[3,8];case 5:return c=_.sent(),this.flowLogger.error("checkRebootStatus.reconnect","第 "+(a+1)+" 次尝试回连设备失败",c),a+=1,[4,delay(constants.WAIT_MODULE_UPDATE_CONNECT_TIME_GAP)];case 6:return _.sent(),[3,7];case 7:return[3,1];case 8:return t({code:"MODULE_UPDATE_CONNECT_TIMEOUT"}),[2]}}))}))}))},[4,Promise.race([i().then((function(){return a()})).then((function(){return e()})),new Promise((function(e,t){setTimeout((function(){n.isCancelled||(n.cancel({code:constants.WAIT_MODULE_UPDATE_TIMEOUT}),t({code:constants.WAIT_MODULE_UPDATE_TIMEOUT}))}),Math.max(3e4,r))})),n.cancelRejectionPromise]).then((function(e){return null==s||s(),null==o||o(),e})).catch((function(e){return null==s||s(),null==o||o(),Promise.reject(e)}))];case 1:return[2,l.sent()]}}))}))},e.prototype.downloadOtaFile=function(e){return tslib_1.__awaiter(this,void 0,void 0,(function(){var t,r,n,s,o,i,a=this;return tslib_1.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),[4,libs_1.downloadFile(e.otaUrl,{onProgress:function(e){a.onProgress(constants.OTA_UPDATE_STEPS.DOWNLOADING_OTA_FILE_DETAIL,e)}})];case 1:return t=c.sent(),r=t.fileSize,n=t.fileBuffer,(s=new libs_1.CRC32).update(new Int8Array(n)),o=s.getValue(),[2,{fileSize:r,fileCrc:o,fileBuffer:n}];case 2:return i=c.sent(),[2,Promise.reject({code:constants.DOWNLOAD_OTA_FILE_FAIL,detail:i})];case 3:return[2]}}))}))},e}();exports.LLSyncOtaProcessor=LLSyncOtaProcessor;
//# sourceMappingURL=LLSyncOtaProcessor.js.map
{
"name": "qcloud-iotexplorer-bluetooth-adapter-llsync",
"version": "2.3.31",
"version": "2.3.32",
"description": "",

@@ -20,4 +20,4 @@ "main": "lib/index.js",

"qcloud-iotexplorer-appdev-sdk": "^2.3.14",
"qcloud-iotexplorer-bluetooth-adapter": "^0.12.24",
"qcloud-iotexplorer-common-libs": "^0.12.19",
"qcloud-iotexplorer-bluetooth-adapter": "^0.12.25",
"qcloud-iotexplorer-common-libs": "^0.12.20",
"qcloud-iotexplorer-logger": "^0.0.11",

@@ -31,3 +31,3 @@ "shortid-for-miniprogram": "^2.2.15",

},
"gitHead": "e1b02894801073047c2e678957d12e7c44959da2"
"gitHead": "d8da97347ee4788dbd29303b6466b149b093eacc"
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc