| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.dao.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * |
| | | * @TableName remote_update_file |
| | | */ |
| | | @TableName(value ="remote_update_file") |
| | | @Data |
| | | public class RemoteUpdateFile implements Serializable { |
| | | /** |
| | | * |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | /** |
| | | * å级æä»¶å |
| | | */ |
| | | private String filename; |
| | | |
| | | /** |
| | | * è½¯ä»¶çæ¬ |
| | | */ |
| | | private BigDecimal softwareVersion; |
| | | |
| | | /** |
| | | * ç¡¬ä»¶çæ¬ |
| | | */ |
| | | private BigDecimal hardwareVersion; |
| | | |
| | | /** |
| | | * é¿éæä»¶åå¨å°å |
| | | */ |
| | | private String aliAddress; |
| | | |
| | | /** |
| | | * æä»¶ç±»å |
| | | */ |
| | | private String fileType; |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | private LocalDateTime createTime; |
| | | |
| | | /** |
| | | * æä»¶é¿åº¦ |
| | | */ |
| | | private String fileLength; |
| | | |
| | | @TableField(exist = false) |
| | | private static final long serialVersionUID = 1L; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.dao.mapper; |
| | | |
| | | import com.sandu.ximon.dao.domain.RemoteUpdateFile; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * @Entity com.sandu.ximon.dao.domain.RemoteUpdateFile |
| | | */ |
| | | @Mapper |
| | | public interface RemoteUpdateFileMapper extends BaseMapper<RemoteUpdateFile> { |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.sandu.ximon.dao.mapper.RemoteUpdateFileMapper"> |
| | | |
| | | <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.RemoteUpdateFile"> |
| | | <id property="id" column="id" jdbcType="INTEGER"/> |
| | | <result property="filename" column="filename" jdbcType="VARCHAR"/> |
| | | <result property="softwareVersion" column="software_version" jdbcType="DECIMAL"/> |
| | | <result property="hardwareVersion" column="hardware_version" jdbcType="DECIMAL"/> |
| | | <result property="aliAddress" column="ali_address" jdbcType="VARCHAR"/> |
| | | <result property="fileType" column="file_type" jdbcType="VARCHAR"/> |
| | | <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> |
| | | <result property="fileLength" column="file_length" jdbcType="VARCHAR"/> |
| | | </resultMap> |
| | | |
| | | <sql id="Base_Column_List"> |
| | | id,filename,software_version, |
| | | hardware_version,ali_address,file_type, |
| | | create_time,file_length |
| | | </sql> |
| | | </mapper> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.controller; |
| | | |
| | | import com.sandu.common.domain.ResponseVO; |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.common.security.annotation.AnonymousAccess; |
| | | import com.sandu.common.util.ResponseUtil; |
| | | import com.sandu.ximon.admin.dto.RemoteFileDto; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum; |
| | | import com.sandu.ximon.admin.param.RemotePrarm; |
| | | import com.sandu.ximon.admin.param.RemoteUpdateParam; |
| | | import com.sandu.ximon.admin.service.RemoteUpdateService; |
| | | import com.sandu.ximon.admin.utils.HexUtils; |
| | | import com.sandu.ximon.admin.utils.StringUtil; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åºä»¶å级Controller |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/4/11 17:06 |
| | | */ |
| | | @AllArgsConstructor |
| | | @RestController |
| | | @RequestMapping("/v1/remoteupdate") |
| | | public class RemoteUpdateController { |
| | | private RemoteUpdateService remoteUpdateService; |
| | | |
| | | @AnonymousAccess |
| | | @PostMapping("/add") |
| | | public ResponseVO<Object> addRemoteUpdateFile(@RequestBody @Validated RemoteUpdateParam param) { |
| | | boolean flag = remoteUpdateService.addRemoteUpdateFile(param.getFilename(), param.getFileType() |
| | | , param.getSoftwareVersion(), param.getHardwareVersion(), param.getAliAddress(), param.getFileLength()); |
| | | return ResponseUtil.success(flag); |
| | | } |
| | | |
| | | @AnonymousAccess |
| | | @GetMapping("/getRemoteFileList") |
| | | public ResponseVO<Object> getRemoteFileList() { |
| | | return ResponseUtil.success(remoteUpdateService.getRemoteFileList()); |
| | | } |
| | | |
| | | @GetMapping("/getRemoteUpdateTypeList") |
| | | public ResponseVO<Object> getRemoteUpdateTypeList() { |
| | | return ResponseUtil.success(remoteUpdateService.getRemoteUpdateTypeList()); |
| | | } |
| | | |
| | | /** |
| | | * å¯å¨è¿ç¨å级å½ä»¤ |
| | | * |
| | | * @return |
| | | */ |
| | | //TODO |
| | | @AnonymousAccess |
| | | @PostMapping("/StartRemoteUpdate") |
| | | public ResponseVO<Object> startRemoteUpdate(@RequestBody @Validated RemotePrarm remotePrarm) { |
| | | String orderType; |
| | | boolean UpdateFlag = false; |
| | | |
| | | switch (remotePrarm.getDeviceType()) { |
| | | case "MQTT串å£": |
| | | case "CAT1": |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | break; |
| | | case "大æ°": |
| | | orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode(); |
| | | break; |
| | | case "C3å
çµæ¡©": |
| | | orderType = A5OrderEnum.REQUEST_C3_DATA.getCode(); |
| | | break; |
| | | case "æä½å¾æ": |
| | | orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(); |
| | | break; |
| | | default: |
| | | throw new BusinessException("å级硬件设å¤ç±»åæä»¤æè¯¯ï¼è¯·ç¡®è®¤ï¼"); |
| | | } |
| | | |
| | | //å¯å¨è¿ç¨å级å½ä»¤ |
| | | boolean startRemoteUpdateFlag = remoteUpdateService.StartRemoteUpdate(orderType, remotePrarm.getMac(), remotePrarm.getHardwareVersion() |
| | | , remotePrarm.getSoftwareVersion(), remotePrarm.getUpdateFlag()); |
| | | if (startRemoteUpdateFlag) { |
| | | //æå¡å¨ä¸åå级æä»¶ä¿¡æ¯ |
| | | //"C:\\Users\\Administrator\\Desktop\\test\\MQTT-è¿æ»¤å¤§æ°çæ¬1-09-20220310.bin" |
| | | RemoteFileDto remoteFileDto = remoteUpdateService.UpdateFileInfo(orderType, remotePrarm.getMac(), remotePrarm.getAliAddress()); |
| | | |
| | | if (remoteFileDto != null) { |
| | | System.out.println(remoteFileDto.getList().size()); |
| | | for (int i = 0; i < remoteFileDto.getList().size(); i++) { |
| | | //å级å
æ°æ® |
| | | remoteUpdateService.UpdateData(orderType, remotePrarm.getMac(), i, remoteFileDto.getList().get(i)); |
| | | } |
| | | |
| | | //æå¡å¨ä¸åæ¥è¯¢æ¼å
帧 |
| | | boolean searchLoseDataFlag = remoteUpdateService.SearchLoseData(orderType, remotePrarm.getMac(), remoteFileDto, 0); |
| | | if (searchLoseDataFlag) { |
| | | //æå¡å¨ä¸åç»æå级帧 |
| | | boolean finishUpdateFlag = remoteUpdateService.FinishUpdate(orderType, remotePrarm.getMac()); |
| | | UpdateFlag = finishUpdateFlag; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (UpdateFlag) { |
| | | return ResponseUtil.success("å级æåï¼"); |
| | | } else { |
| | | return ResponseUtil.fail("å级失败ï¼"); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ¥è¯¢åºä»¶çæ¬å· |
| | | * |
| | | * @param remotePrarm |
| | | * @return |
| | | */ |
| | | @AnonymousAccess |
| | | @PostMapping("/searchUpdateResult") |
| | | public ResponseVO<Object> searchUpdateResult(@RequestBody RemotePrarm remotePrarm) { |
| | | if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) { |
| | | throw new BusinessException("缺å°ç¸å
³åæ°ï¼"); |
| | | } |
| | | String orderType; |
| | | switch (remotePrarm.getDeviceType()) { |
| | | case "MQTT串å£": |
| | | case "CAT1": |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | break; |
| | | case "大æ°": |
| | | orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode(); |
| | | break; |
| | | case "C3å
çµæ¡©": |
| | | orderType = A5OrderEnum.REQUEST_C3_DATA.getCode(); |
| | | break; |
| | | case "æä½å¾æ": |
| | | orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(); |
| | | break; |
| | | default: |
| | | throw new BusinessException("å级硬件设å¤ç±»åæä»¤æè¯¯ï¼è¯·ç¡®è®¤ï¼"); |
| | | } |
| | | |
| | | //æå¡å¨ä¸ååçº§ç»ææ¥è¯¢ |
| | | String result = remoteUpdateService.SearchUpdateResult(orderType, remotePrarm.getMac()); |
| | | return ResponseUtil.success(result); |
| | | } |
| | | |
| | | /** |
| | | * ç´§æ¥ä¸æå级æ§å¶å¸§ |
| | | * |
| | | * @param remotePrarm |
| | | * @return |
| | | */ |
| | | @AnonymousAccess |
| | | @PostMapping("/stopUpdate") |
| | | public ResponseVO<Object> stopUpdate(@RequestBody RemotePrarm remotePrarm) { |
| | | if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) { |
| | | throw new BusinessException("缺å°ç¸å
³åæ°ï¼"); |
| | | } |
| | | String orderType; |
| | | switch (remotePrarm.getDeviceType()) { |
| | | case "MQTT串å£": |
| | | case "CAT1": |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | break; |
| | | case "大æ°": |
| | | orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode(); |
| | | break; |
| | | case "C3å
çµæ¡©": |
| | | orderType = A5OrderEnum.REQUEST_C3_DATA.getCode(); |
| | | break; |
| | | case "æä½å¾æ": |
| | | orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(); |
| | | break; |
| | | default: |
| | | throw new BusinessException("å级硬件设å¤ç±»åæä»¤æè¯¯ï¼è¯·ç¡®è®¤ï¼"); |
| | | } |
| | | |
| | | //æå¡å¨ä¸ååçº§ç»ææ¥è¯¢ |
| | | boolean flag = remoteUpdateService.stopUpdate(orderType, remotePrarm.getMac()); |
| | | if (flag) { |
| | | return ResponseUtil.success("ç´§æ¥ç»æå级æå"); |
| | | } else { |
| | | return ResponseUtil.success("ç´§æ¥ç»æå级失败"); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:40 |
| | | */ |
| | | @Data |
| | | public class RemoteFileDto { |
| | | private List<String> list; |
| | | private int listSize = 0; |
| | | private String fileHexStr; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/4/12 11:38 |
| | | */ |
| | | @Data |
| | | public class RemoteUpdateTypeDto { |
| | | |
| | | private String fileTypeName; |
| | | |
| | | private String val; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åç»æå级帧 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/7 13:47 |
| | | */ |
| | | @Data |
| | | public class RemoteFinishUpdateReportInnerFrame extends BaseResponseInnerFrame<RemoteFinishUpdateReportInnerFrame> { |
| | | |
| | | //æ ¡éªç¶æ |
| | | private boolean responseState; |
| | | |
| | | @Override |
| | | public RemoteFinishUpdateReportInnerFrame transformFrame(String hex) { |
| | | //FE B4 0001 01 DD480706 |
| | | |
| | | if (hex.length() != 18) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | //æ ¡éªç¶æ |
| | | if ("01".equals(hex.substring(8, 10))) { |
| | | setResponseState(true); |
| | | } else { |
| | | setResponseState(false); |
| | | } |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åæ¥è¯¢æ¼å
帧 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/7 10:38 |
| | | */ |
| | | @Data |
| | | public class RemoteSearchLoseDataReportInnerFrame extends BaseResponseInnerFrame<RemoteSearchLoseDataReportInnerFrame> { |
| | | //FE |
| | | //B3 |
| | | //003F |
| | | //001E |
| | | //00 |
| | | //0035 0036 0037 0038 0039 003A 003B |
| | | //003C 003D 003E 003F 0040 0041 0042 |
| | | //0043 0044 0045 0046 0047 0048 0049 |
| | | //004A 004B 004C 004D 004E 004F 0050 |
| | | //0051 0052 |
| | | //36E57602 |
| | | |
| | | //æ¼å
æ»å¸§æ° |
| | | private int loseCount; |
| | | //æ ¡éªç¶æ |
| | | private boolean checkState; |
| | | |
| | | private List<Integer> list; |
| | | |
| | | @Override |
| | | public RemoteSearchLoseDataReportInnerFrame transformFrame(String hex) { |
| | | if (hex.length() < 16) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | //æ¼å
æ»å¸§æ° |
| | | setLoseCount(parseVal(hex, 8, 12)); |
| | | //æ ¡éªç¶æ |
| | | if ("01".equals(hex.substring(12, 14))) { |
| | | setCheckState(true); |
| | | } else { |
| | | setCheckState(false); |
| | | } |
| | | |
| | | //丢帧å·åºå· |
| | | LoseFrameData loseFrameData = new LoseFrameData(); |
| | | loseFrameData.transformFrame(hex.substring(14, hex.length() - 8)); |
| | | //ä¿åä¸¢å¸§æ°æ®å·å· |
| | | setList(loseFrameData.getList()); |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal(String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start, end), 16); |
| | | } |
| | | |
| | | @Data |
| | | public static class LoseFrameData implements IResponseInnerFrame<LoseFrameData> { |
| | | private List<Integer> list = new ArrayList<>(); |
| | | |
| | | @Override |
| | | public LoseFrameData transformFrame(String hex) { |
| | | for (int i = 0; i < hex.length() / 4; i++) { |
| | | list.add(parseVal(hex, i * 4, i * 4 + 4)); |
| | | } |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal(String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start, end), 16); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/7 14:43 |
| | | */ |
| | | @Data |
| | | public class RemoteSearchUpdateResultReportInnerFrame extends BaseResponseInnerFrame<RemoteSearchUpdateResultReportInnerFrame> { |
| | | //ç¡¬ä»¶çæ¬ |
| | | private String hardwareVersion; |
| | | //è½¯ä»¶çæ¬ |
| | | private String softwareVersion; |
| | | |
| | | @Override |
| | | public RemoteSearchUpdateResultReportInnerFrame transformFrame(String hex) { |
| | | if (hex.length() < 16) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | |
| | | //ç¡¬ä»¶çæ¬ |
| | | setHardwareVersion(parseVal(hex, 8, 10) + "." + parseVal(hex, 10, 12)); |
| | | //è½¯ä»¶çæ¬ |
| | | setSoftwareVersion(parseVal(hex, 12, 14) + "." + parseVal(hex, 14, 16)); |
| | | |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal(String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start, end), 16); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * å¯å¨è¿ç¨å级å½ä»¤ååºå
帧 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/6 14:13 |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class RemoteStartUpdateReportInnerFrame extends BaseResponseInnerFrame<RemoteStartUpdateReportInnerFrame> { |
| | | //ç¡¬ä»¶çæ¬ |
| | | private String hardwareVersion; |
| | | //è½¯ä»¶çæ¬ |
| | | private String softwareVersion; |
| | | //åå®¶æ å¿ |
| | | private String factoryFlag; |
| | | //æä»¤æ å¿ |
| | | private String orderFlag; |
| | | //å级æ å¿ |
| | | private String updateFlag; |
| | | |
| | | //FE B0 0007 0108 0109 786D 01 90431921 |
| | | @Override |
| | | public RemoteStartUpdateReportInnerFrame transformFrame(String hex) { |
| | | if (hex.length() != 30) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | //ç¡¬ä»¶çæ¬ |
| | | setHardwareVersion(parseVal(hex, 8, 10) + "." + parseVal(hex, 10, 12)); |
| | | //è½¯ä»¶çæ¬ |
| | | setSoftwareVersion(parseVal(hex, 12, 14) + "." + parseVal(hex, 14, 16)); |
| | | //åå®¶æ å¿ |
| | | setFactoryFlag(hex.substring(16, 20)); |
| | | //æä»¤æ å¿ |
| | | setOrderFlag(hex.substring(20, 21)); |
| | | //å级æ å¿ |
| | | setUpdateFlag(hex.substring(21, 22)); |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal(String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start, end), 16); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/7 15:16 |
| | | */ |
| | | @Data |
| | | public class RemoteStopUpdateReportInnerFrame extends BaseResponseInnerFrame<RemoteStopUpdateReportInnerFrame> { |
| | | private boolean responseState; |
| | | |
| | | @Override |
| | | public RemoteStopUpdateReportInnerFrame transformFrame(String hex) { |
| | | if (hex.length() != 18) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | //æ ¡éªç¶æ |
| | | if ("01".equals(hex.substring(8, 10))) { |
| | | setResponseState(true); |
| | | } else { |
| | | setResponseState(false); |
| | | } |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åå级æä»¶ä¿¡æ¯ |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/6 15:08 |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class RemoteUpdateFileInfoReportInnerFrame extends BaseResponseInnerFrame<RemoteUpdateFileInfoReportInnerFrame> { |
| | | //确认æ è¯ 0x00ï¼ç¡®å®å¤±è´¥ 0x01ï¼ç¡®è®¤ok |
| | | private boolean flag; |
| | | |
| | | @Override |
| | | public RemoteUpdateFileInfoReportInnerFrame transformFrame(String hex) { |
| | | if (hex.length() != 18) { |
| | | throw new BusinessException("ååºå¸§åºéï¼è¯·éæ°åéæä»¤ï¼"); |
| | | } |
| | | //FE B1 0001 01 EA96F734 |
| | | // MQTTéä¿¡æ¹å¼(1) |
| | | setConnectType(hex.substring(0, 2)); |
| | | // åè½ç (1) |
| | | setFunctionCode(hex.substring(2, 4)); |
| | | // è´è·é¿åº¦(2) |
| | | setPayloadLength(hex.substring(4, 8)); |
| | | //确认æ è¯ |
| | | if ("01".equals(hex.substring(8, 10))) { |
| | | setFlag(true); |
| | | } else { |
| | | setFlag(false); |
| | | } |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // æ ¡éªCRC32 |
| | | String frame = hex.substring(2, hex.length() - 8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | } |
| | |
| | | } else if (lightLevel > 100) { |
| | | lightLevel = 100; |
| | | } |
| | | payload = destinationAddress + SupplementUtils.suppleZero(Integer.toHexString(lightLevel), 2); |
| | | payload = destinationAddress + SupplementUtils.suppleZero(Integer.toHexString(lightLevel).toUpperCase(), 2); |
| | | } |
| | | |
| | | @Override |
| | |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | |
| | | public String getEncodeFrame() { |
| | | String functionCode = C3ChargingEnum.QR_CODE_REQUEST.getCode(); |
| | | //é¿åº¦å¯åï¼ä¸å®é¿ |
| | | String payloadLength = payload.length() + ""; |
| | | String payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åç»æå级帧 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:03 |
| | | */ |
| | | public class RemoteFinishUpdateReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.FinishUpdate.getCode(); |
| | | String payloadLength = "0000"; |
| | | String frame = functionCode + payloadLength; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åæ¥è¯¢æ¼å
帧 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:03 |
| | | */ |
| | | public class RemoteSearchLoseDataReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.SearchLoseData.getCode(); |
| | | String payloadLength = "0000"; |
| | | String frame = functionCode + payloadLength; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸ååçº§ç»ææ¥è¯¢ |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:03 |
| | | */ |
| | | public class RemoteSearchUpdateResultReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.SearchUpdateResult.getCode(); |
| | | String payloadLength = "0004"; |
| | | String payload = "00000000"; |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/5 11:28 |
| | | */ |
| | | public class RemoteSendFileReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | |
| | | private String payload; |
| | | |
| | | /** |
| | | * @param fileTotalSize å级æä»¶æ»å¤§å° |
| | | * @param frameTotalSize æ»å¸§æ° |
| | | * @param frameSize åå¸§æ°æ® |
| | | */ |
| | | public RemoteSendFileReqInnerFrame(int fileTotalSize, int frameTotalSize, int frameSize, String fileHexStr) { |
| | | payload = SupplementUtils.suppleZero(Integer.toHexString(fileTotalSize).toUpperCase(), 8) |
| | | + SupplementUtils.suppleZero(Integer.toHexString(frameTotalSize).toUpperCase(), 4) |
| | | + SupplementUtils.suppleZero(Integer.toHexString(frameSize).toUpperCase(), 4) + |
| | | CRC32Utils.getCRC32(fileHexStr.toUpperCase()); |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.UpdateFileInfo.getCode(); |
| | | String payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * å¯å¨è¿ç¨å级 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 10:55 |
| | | */ |
| | | |
| | | public class RemoteStartUpdateReqInnerFrame implements IRequestInnerFrame { |
| | | //åå®¶æ å¿ï¼å¾
å®ï¼ |
| | | private String factoryFlag = "0001"; |
| | | |
| | | private String payload; |
| | | |
| | | /** |
| | | * @param hardwareVersion 硬件æ¬ç |
| | | * @param softwareVersion è½¯ä»¶çæ¬ |
| | | * @param updateFlag å级æ å¿ |
| | | */ |
| | | public RemoteStartUpdateReqInnerFrame(String hardwareVersion, String softwareVersion, String updateFlag) { |
| | | String[] split = new BigDecimal(hardwareVersion).setScale(2, BigDecimal.ROUND_DOWN).toString().split("\\."); |
| | | hardwareVersion = SupplementUtils.suppleZero(Integer.toHexString(Integer.valueOf(split[0])).toUpperCase(), 2) |
| | | + SupplementUtils.suppleZero(Integer.toHexString(Integer.valueOf(split[1])).toUpperCase(), 2); |
| | | |
| | | String[] split1 = new BigDecimal(softwareVersion).setScale(2, BigDecimal.ROUND_DOWN).toString().split("\\."); |
| | | softwareVersion = SupplementUtils.suppleZero(Integer.toHexString(Integer.valueOf(split1[0])).toUpperCase(), 2) |
| | | + SupplementUtils.suppleZero(Integer.toHexString(Integer.valueOf(split1[1])).toUpperCase(), 2); |
| | | |
| | | payload = hardwareVersion + softwareVersion + factoryFlag + updateFlag; |
| | | } |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.StartRemoteUpdate.getCode(); |
| | | //计ç®é¿åº¦ |
| | | String payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | } |
| | | |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åç´§æ¥ä¸æå级æ§å¶å¸§ |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:03 |
| | | */ |
| | | public class RemoteStopUpdateReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.StopUpdate.getCode(); |
| | | String payloadLength = "0000"; |
| | | String frame = functionCode + payloadLength; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils; |
| | | |
| | | /** |
| | | * å级å
æ°æ® |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/5 13:58 |
| | | */ |
| | | public class RemoteUpdateDataReqInnerFrame implements IRequestInnerFrame { |
| | | |
| | | private String payload; |
| | | |
| | | /** |
| | | * @param volumeOrder å·åº |
| | | * @param datas å级å
åå·æ°æ® |
| | | */ |
| | | public RemoteUpdateDataReqInnerFrame(int volumeOrder, String datas) { |
| | | payload = SupplementUtils.suppleZero(Integer.toHexString(volumeOrder).toUpperCase(), 4) + datas; |
| | | } |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String functionCode = RemoteUpdateEnum.UpdateData.getCode(); |
| | | String payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4); |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.enums; |
| | | |
| | | /** |
| | | * è¿ç¨å级帧-åè½ç |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/4/11 14:48 |
| | | */ |
| | | public enum RemoteUpdateEnum { |
| | | // å¯å¨è¿ç¨å级å½ä»¤ |
| | | StartRemoteUpdate("B0"), |
| | | // æå¡å¨ä¸åå级æä»¶ä¿¡æ¯ |
| | | UpdateFileInfo("B1"), |
| | | // å级å
æ°æ® |
| | | UpdateData("B2"), |
| | | // æ¥è¯¢æ¼å
帧 |
| | | SearchLoseData("B3"), |
| | | // ç»æå级帧 |
| | | FinishUpdate("B4"), |
| | | // åçº§ç»ææ¥è¯¢ |
| | | SearchUpdateResult("B5"), |
| | | // 䏿å级æ§å¶å¸§ |
| | | StopUpdate("B6"); |
| | | |
| | | private String code; |
| | | |
| | | RemoteUpdateEnum(String code) { |
| | | this.code = code; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.enums; |
| | | |
| | | import com.sandu.ximon.admin.dto.RemoteUpdateTypeDto; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/4/12 11:39 |
| | | */ |
| | | public enum RemoteUpdateTypeEnum { |
| | | // MQTTä¸»æ¿ |
| | | MQTT_MAIN("0"), |
| | | // MQTTæ ¸å¿æ¿ |
| | | MQTT_CORE("1"), |
| | | // åç¯æ¨¡å |
| | | LIGHT("2"), |
| | | // C3å
çµæ¡©æ¨¡å |
| | | C3_CHARGING("3"); |
| | | |
| | | private String code; |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | |
| | | RemoteUpdateTypeEnum(String code) { |
| | | this.code = code; |
| | | } |
| | | |
| | | public static List<RemoteUpdateTypeDto> getAllType() { |
| | | |
| | | List<RemoteUpdateTypeDto> list = new ArrayList<>(); |
| | | for (RemoteUpdateTypeEnum r : RemoteUpdateTypeEnum.values()) { |
| | | RemoteUpdateTypeDto remoteUpdateTypeEntity = new RemoteUpdateTypeDto(); |
| | | remoteUpdateTypeEntity.setVal(r.getCode()); |
| | | remoteUpdateTypeEntity.setFileTypeName(map.get(r.getCode())); |
| | | list.add(remoteUpdateTypeEntity); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | private static ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>() { |
| | | { |
| | | put("0", "MQTTæ ¸å¿æ¿"); |
| | | put("1", "Cat.1主æ¿"); |
| | | put("2", "C3å
çµæ¡©æ¨¡å"); |
| | | put("3", "大æ°è®¾å¤æ¨¡å"); |
| | | put("4", "æä½å¾ææ¨¡å"); |
| | | } |
| | | }; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.rrpc.util; |
| | | |
| | | import com.sandu.ximon.admin.dto.RemoteFileDto; |
| | | import com.sandu.ximon.admin.utils.HexUtils; |
| | | import org.apache.catalina.LifecycleState; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/5 14:26 |
| | | */ |
| | | public class FileProcessingUtils { |
| | | |
| | | // public static void main(String[] args) { |
| | | // try { |
| | | // RemoteFileDto remoteFileDto = read("C:\\Users\\Administrator\\Desktop\\test\\H01_v3.0.12.min.dhcp.bin"); |
| | | // System.out.println(remoteFileDto.getListSize()); |
| | | // System.out.println(remoteFileDto.getList().size()); |
| | | // System.out.println(Arrays.toString(remoteFileDto.getList().get(0))); |
| | | // } catch (IOException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | |
| | | public static RemoteFileDto read(String filePath) throws IOException { |
| | | List<String> data = new ArrayList<>(); |
| | | int dataSize = 0; |
| | | StringBuffer fileHexStr=new StringBuffer(); |
| | | |
| | | File file = new File(filePath); |
| | | |
| | | InputStream in = new FileInputStream(file); |
| | | |
| | | // 䏿¬¡æ§åå¤å°ä¸ªåè |
| | | byte[] bytes = new byte[512]; |
| | | // 读åå°çåèæ°ç»é¿åº¦ï¼ä¸º-1æ¶è¡¨ç¤ºæ²¡ææ°æ® |
| | | int length = 0; |
| | | // 循ç¯åæ°æ® |
| | | while ((length = in.read(bytes)) != -1) { |
| | | String temp=HexUtils.encodeHexStr(Arrays.copyOf(bytes, length)); |
| | | data.add(temp); |
| | | fileHexStr.append(temp); |
| | | dataSize += length; |
| | | } |
| | | |
| | | in.close(); |
| | | |
| | | RemoteFileDto remoteFileDto = new RemoteFileDto(); |
| | | remoteFileDto.setList(data); |
| | | remoteFileDto.setListSize(dataSize); |
| | | remoteFileDto.setFileHexStr(fileHexStr.toString()); |
| | | return remoteFileDto; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotEmpty; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * åºä»¶å级 |
| | | * |
| | | * @author ZZQ |
| | | * @date 2022/5/7 9:40 |
| | | */ |
| | | @Data |
| | | public class RemotePrarm { |
| | | |
| | | /** |
| | | * 设å¤MACå°å |
| | | */ |
| | | @NotEmpty |
| | | private String mac; |
| | | |
| | | /** |
| | | * 设å¤ç±»åï¼åç¯/大æ°/C3å
çµæ¡©/æä½å¾æ |
| | | */ |
| | | @NotEmpty |
| | | private String deviceType; |
| | | |
| | | /** |
| | | * ç¡¬ä»¶çæ¬ |
| | | */ |
| | | @NotEmpty |
| | | private String hardwareVersion; |
| | | |
| | | /** |
| | | * è½¯ä»¶çæ¬ |
| | | */ |
| | | @NotEmpty |
| | | private String softwareVersion; |
| | | |
| | | /** |
| | | * å级æ å¿ |
| | | */ |
| | | @NotEmpty |
| | | private String updateFlag; |
| | | |
| | | /** |
| | | * æä»¶å°å |
| | | */ |
| | | @NotEmpty |
| | | private String aliAddress; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotEmpty; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/4/12 11:07 |
| | | */ |
| | | @Data |
| | | public class RemoteUpdateParam { |
| | | |
| | | /** |
| | | * å级æä»¶å |
| | | */ |
| | | @NotEmpty |
| | | private String filename; |
| | | |
| | | /** |
| | | * è½¯ä»¶çæ¬ |
| | | */ |
| | | @NotEmpty |
| | | private String softwareVersion; |
| | | |
| | | /** |
| | | * ç¡¬ä»¶çæ¬ |
| | | */ |
| | | @NotEmpty |
| | | private String hardwareVersion; |
| | | |
| | | /** |
| | | * é¿éæä»¶åå¨å°å |
| | | */ |
| | | @NotEmpty |
| | | private String aliAddress; |
| | | |
| | | /** |
| | | * æä»¶ç±»å |
| | | */ |
| | | @NotEmpty |
| | | private String fileType; |
| | | |
| | | /** |
| | | * æä»¶é¿åº¦ |
| | | */ |
| | | private String fileLength; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.service; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.common.service.impl.BaseServiceImpl; |
| | | import com.sandu.ximon.admin.dto.RemoteFileDto; |
| | | import com.sandu.ximon.admin.dto.RemoteUpdateTypeDto; |
| | | import com.sandu.ximon.admin.manager.iot.frame.A5Frame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.report.*; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.request.*; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.FileProcessingUtils; |
| | | import com.sandu.ximon.dao.domain.RemoteUpdateFile; |
| | | import com.sandu.ximon.dao.mapper.RemoteUpdateFileMapper; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/4/12 11:09 |
| | | */ |
| | | @Service |
| | | public class RemoteUpdateService extends BaseServiceImpl<RemoteUpdateFileMapper, RemoteUpdateFile> { |
| | | /** |
| | | * æ·»å æä»¶æ´æ°å
容 |
| | | * |
| | | * @param filename |
| | | * @param fileType |
| | | * @param softwareVersion |
| | | * @param hardwareVersion |
| | | * @param aliAddress |
| | | */ |
| | | public boolean addRemoteUpdateFile(String filename, String fileType, String softwareVersion |
| | | , String hardwareVersion, String aliAddress, String fileLength) { |
| | | RemoteUpdateFile remoteUpdateFile = new RemoteUpdateFile(); |
| | | remoteUpdateFile.setAliAddress(aliAddress); |
| | | remoteUpdateFile.setFileType(fileType); |
| | | remoteUpdateFile.setSoftwareVersion(new BigDecimal(softwareVersion).setScale(2, BigDecimal.ROUND_DOWN)); |
| | | remoteUpdateFile.setHardwareVersion(new BigDecimal(hardwareVersion).setScale(2, BigDecimal.ROUND_DOWN)); |
| | | remoteUpdateFile.setFilename(filename); |
| | | remoteUpdateFile.setFileLength(fileLength); |
| | | return save(remoteUpdateFile); |
| | | } |
| | | |
| | | /** |
| | | * åºä»¶å级æä»¶ |
| | | * |
| | | * @return |
| | | */ |
| | | public List<RemoteUpdateFile> getRemoteFileList() { |
| | | return list(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è¿ç¨å级类å |
| | | */ |
| | | public List<RemoteUpdateTypeDto> getRemoteUpdateTypeList() { |
| | | return RemoteUpdateTypeEnum.getAllType(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å¯å¨è¿ç¨å级å½ä»¤ |
| | | * |
| | | * @param mac 设å¤MACå°å |
| | | * @param hardwareVersion ç¡¬ä»¶çæ¬ |
| | | * @param softwareVersion è½¯ä»¶çæ¬ |
| | | * @param updateFlag å级æ å¿ |
| | | */ |
| | | public boolean StartRemoteUpdate(String orderType, String mac, String hardwareVersion, String softwareVersion, String updateFlag) { |
| | | |
| | | RemoteStartUpdateReqInnerFrame remoteStartUpdateReqInnerFrame = new RemoteStartUpdateReqInnerFrame(hardwareVersion, softwareVersion, updateFlag); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteStartUpdateReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | |
| | | RemoteStartUpdateReportInnerFrame remoteStartUpdateReportInnerFrame |
| | | = new RemoteStartUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | boolean flag; |
| | | if (remoteStartUpdateReportInnerFrame.isValidate()) { |
| | | switch (remoteStartUpdateReportInnerFrame.getOrderFlag()) { |
| | | case "0": |
| | | if ("1".equals(remoteStartUpdateReportInnerFrame.getUpdateFlag())) { |
| | | System.out.println("å¼å§å级ç¸å
³æ¥éª¤"); |
| | | //æå¡å¨ä¸åå级æä»¶ä¿¡æ¯ |
| | | flag = true; |
| | | } else { |
| | | System.out.println("ä¸è¿è¡å级"); |
| | | flag = false; |
| | | } |
| | | break; |
| | | case "1": |
| | | System.out.println("ç»ç«¯ä¸å¨ç©ºé²ç¶æ"); |
| | | flag = false; |
| | | break; |
| | | case "8": |
| | | System.out.println("æä»¤æè¯¯"); |
| | | flag = false; |
| | | break; |
| | | default: |
| | | flag = false; |
| | | } |
| | | } else { |
| | | throw new BusinessException("æ°æ®æ ¡éªé误ï¼è¯·éæ°è¯·æ±"); |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åå级æä»¶ä¿¡æ¯ |
| | | * |
| | | * @param filePath æä»¶è·¯å¾å°å |
| | | */ |
| | | public RemoteFileDto UpdateFileInfo(String orderType, String mac, String filePath) { |
| | | try { |
| | | RemoteFileDto remoteFileDto = FileProcessingUtils.read(filePath); |
| | | |
| | | RemoteSendFileReqInnerFrame remoteSendFileReqInnerFrame |
| | | = new RemoteSendFileReqInnerFrame(remoteFileDto.getListSize(), remoteFileDto.getList().size(), 512, remoteFileDto.getFileHexStr()); |
| | | |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteSendFileReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | |
| | | RemoteUpdateFileInfoReportInnerFrame remoteUpdateFileInfoReportInnerFrame |
| | | = new RemoteUpdateFileInfoReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | //确认OK |
| | | if (remoteUpdateFileInfoReportInnerFrame != null && remoteUpdateFileInfoReportInnerFrame.isFlag()) { |
| | | return remoteFileDto; |
| | | } else { |
| | | return null; |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å级å
æ°æ® |
| | | * |
| | | * @param volumeOrder å·åº |
| | | * @param datas å级å
åå·æ°æ® |
| | | */ |
| | | public void UpdateData(String orderType, String mac, int volumeOrder, String datas) { |
| | | RemoteUpdateDataReqInnerFrame remoteUpdateDataReqInnerFrame = new RemoteUpdateDataReqInnerFrame(volumeOrder, datas); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteUpdateDataReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = null; |
| | | try { |
| | | commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | } catch (Exception e) { |
| | | System.out.println("åéæ°æ®è¶
æ¶æå¤±è´¥"); |
| | | } |
| | | //FE B2 0004 0056 01 00 AE2C4474 |
| | | } |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åæ¥è¯¢æ¼å
帧 |
| | | */ |
| | | public boolean SearchLoseData(String orderType, String mac, RemoteFileDto remoteFileDto, int resendTime) { |
| | | RemoteSearchLoseDataReqInnerFrame remoteSearchLoseDataReqInnerFrame = new RemoteSearchLoseDataReqInnerFrame(); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteSearchLoseDataReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | |
| | | RemoteSearchLoseDataReportInnerFrame remoteSearchLoseDataReportInnerFrame = new RemoteSearchLoseDataReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | |
| | | //æ ¡éªä¸éè¿ï¼ææ¼å
|
| | | if (!remoteSearchLoseDataReportInnerFrame.isCheckState()) { |
| | | if (resendTime == 3) { |
| | | throw new BusinessException("éåä¸¢å¸§æ°æ®è¶
次æ°ï¼æ´æ°å¤±è´¥ï¼"); |
| | | } |
| | | for (Integer integer : remoteSearchLoseDataReportInnerFrame.getList()) { |
| | | UpdateData(orderType, mac, integer, remoteFileDto.getList().get(integer)); |
| | | } |
| | | SearchLoseData(orderType, mac, remoteFileDto, resendTime + 1); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åç»æå级帧 |
| | | */ |
| | | public boolean FinishUpdate(String orderType, String mac) { |
| | | RemoteFinishUpdateReqInnerFrame remoteFinishUpdateReqInnerFrame = new RemoteFinishUpdateReqInnerFrame(); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteFinishUpdateReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | |
| | | RemoteFinishUpdateReportInnerFrame remoteFinishUpdateReportInnerFrame = new RemoteFinishUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | |
| | | //è¿ååçº§ç»æ |
| | | return remoteFinishUpdateReportInnerFrame.isResponseState(); |
| | | } |
| | | |
| | | /** |
| | | * æå¡å¨ä¸ååçº§ç»ææ¥è¯¢ |
| | | */ |
| | | public String SearchUpdateResult(String orderType, String mac) { |
| | | RemoteSearchUpdateResultReqInnerFrame remoteSearchUpdateResultReqInnerFrame = new RemoteSearchUpdateResultReqInnerFrame(); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteSearchUpdateResultReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | |
| | | RemoteSearchUpdateResultReportInnerFrame innerFrame = new RemoteSearchUpdateResultReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | String result = "ç¡¬ä»¶çæ¬ï¼" + innerFrame.getHardwareVersion() + " è½¯ä»¶ä»¶çæ¬ï¼" + innerFrame.getSoftwareVersion(); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æå¡å¨ä¸åç´§æ¥ä¸æå级æ§å¶å¸§ |
| | | */ |
| | | public boolean stopUpdate(String orderType, String mac) { |
| | | RemoteStopUpdateReqInnerFrame remoteStopUpdateReqInnerFrame = new RemoteStopUpdateReqInnerFrame(); |
| | | A5Frame a5Frame = new A5Frame(orderType, remoteStopUpdateReqInnerFrame); |
| | | System.out.println(a5Frame + " a5Frame"); |
| | | CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); |
| | | System.out.println(commonFrame + " -----commonFrame"); |
| | | RemoteStopUpdateReportInnerFrame innerFrame = new RemoteStopUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); |
| | | |
| | | return innerFrame.isResponseState(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.utils; |
| | | |
| | | /** |
| | | * @author ZZQ |
| | | * @date 2022/5/6 18:18 |
| | | */ |
| | | public class HexUtils { |
| | | /** |
| | | * ç¨äºå»ºç«åå
è¿å¶å符çè¾åºçå°åå符æ°ç» |
| | | */ |
| | | private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', |
| | | '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; |
| | | |
| | | /** |
| | | * ç¨äºå»ºç«åå
è¿å¶å符çè¾åºç大åå符æ°ç» |
| | | */ |
| | | private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', |
| | | '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符æ°ç» |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @return åå
è¿å¶char[] |
| | | */ |
| | | public static char[] encodeHex(byte[] data) { |
| | | return encodeHex(data, true); |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符æ°ç» |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @param toLowerCase |
| | | * <code>true</code> ä¼ æ¢æå°åæ ¼å¼ ï¼ <code>false</code> ä¼ æ¢æå¤§åæ ¼å¼ |
| | | * @return åå
è¿å¶char[] |
| | | */ |
| | | public static char[] encodeHex(byte[] data, boolean toLowerCase) { |
| | | return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符æ°ç» |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @param toDigits |
| | | * ç¨äºæ§å¶è¾åºçchar[] |
| | | * @return åå
è¿å¶char[] |
| | | */ |
| | | protected static char[] encodeHex(byte[] data, char[] toDigits) { |
| | | int l = data.length; |
| | | char[] out = new char[l << 1]; |
| | | // two characters form the hex value. |
| | | for (int i = 0, j = 0; i < l; i++) { |
| | | out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; |
| | | out[j++] = toDigits[0x0F & data[i]]; |
| | | } |
| | | return out; |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符串 |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @return åå
è¿å¶String |
| | | */ |
| | | public static String encodeHexStr(byte[] data) { |
| | | return encodeHexStr(data, true); |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符串 |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @param toLowerCase |
| | | * <code>true</code> ä¼ æ¢æå°åæ ¼å¼ ï¼ <code>false</code> ä¼ æ¢æå¤§åæ ¼å¼ |
| | | * @return åå
è¿å¶String |
| | | */ |
| | | public static String encodeHexStr(byte[] data, boolean toLowerCase) { |
| | | return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); |
| | | } |
| | | |
| | | /** |
| | | * å°åèæ°ç»è½¬æ¢ä¸ºåå
è¿å¶å符串 |
| | | * |
| | | * @param data |
| | | * byte[] |
| | | * @param toDigits |
| | | * ç¨äºæ§å¶è¾åºçchar[] |
| | | * @return åå
è¿å¶String |
| | | */ |
| | | protected static String encodeHexStr(byte[] data, char[] toDigits) { |
| | | return new String(encodeHex(data, toDigits)); |
| | | } |
| | | |
| | | /** |
| | | * å°åå
è¿å¶å符æ°ç»è½¬æ¢ä¸ºåèæ°ç» |
| | | * |
| | | * @param data |
| | | * åå
è¿å¶char[] |
| | | * @return byte[] |
| | | * @throws RuntimeException |
| | | * 妿æºåå
è¿å¶å符æ°ç»æ¯ä¸ä¸ªå¥æªçé¿åº¦ï¼å°æåºè¿è¡æ¶å¼å¸¸ |
| | | */ |
| | | public static byte[] decodeHex(char[] data) { |
| | | |
| | | int len = data.length; |
| | | |
| | | if ((len & 0x01) != 0) { |
| | | throw new RuntimeException("Odd number of characters."); |
| | | } |
| | | |
| | | byte[] out = new byte[len >> 1]; |
| | | |
| | | // two characters form the hex value. |
| | | for (int i = 0, j = 0; j < len; i++) { |
| | | int f = toDigit(data[j], j) << 4; |
| | | j++; |
| | | f = f | toDigit(data[j], j); |
| | | j++; |
| | | out[i] = (byte) (f & 0xFF); |
| | | } |
| | | |
| | | return out; |
| | | } |
| | | |
| | | /** |
| | | * å°åå
è¿å¶åç¬¦è½¬æ¢æä¸ä¸ªæ´æ° |
| | | * |
| | | * @param ch |
| | | * åå
è¿å¶char |
| | | * @param index |
| | | * åå
è¿å¶å符å¨å符æ°ç»ä¸çä½ç½® |
| | | * @return ä¸ä¸ªæ´æ° |
| | | * @throws RuntimeException |
| | | * å½ch䏿¯ä¸ä¸ªåæ³çåå
è¿å¶å符æ¶ï¼æåºè¿è¡æ¶å¼å¸¸ |
| | | */ |
| | | protected static int toDigit(char ch, int index) { |
| | | int digit = Character.digit(ch, 16); |
| | | if (digit == -1) { |
| | | throw new RuntimeException("Illegal hexadecimal character " + ch |
| | | + " at index " + index); |
| | | } |
| | | return digit; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | String srcStr = "å¾
转æ¢å符串"; |
| | | String encodeStr = encodeHexStr(srcStr.getBytes()); |
| | | String decodeStr = new String(decodeHex(encodeStr.toCharArray())); |
| | | System.out.println("转æ¢åï¼" + srcStr); |
| | | System.out.println("转æ¢åï¼" + encodeStr); |
| | | System.out.println("è¿ååï¼" + decodeStr); |
| | | } |
| | | |
| | | } |