ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java
@@ -82,7 +82,7 @@ */ @PostMapping("/EndOfTheSynchronization") public ResponseVO<Object> EndOfTheSynchronization(@RequestBody C3ChargingParam c3ChargingParam) { String result = c3ChargingService.EndOfTheSynchronization(c3ChargingParam.getC3Mac()); String result = c3ChargingService.EndOfTheSynchronization(c3ChargingParam.getC3Mac(), false); if ("操作成功".equals(result)) { return ResponseUtil.success(result); @@ -159,7 +159,7 @@ */ @PostMapping("/ReadTheHeartbeatPackage") public ResponseVO<Object> ReadTheHeartbeatPackage(@RequestBody C3ChargingParam c3ChargingParam) { return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac())); return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac(), false)); } /** @@ -168,7 +168,7 @@ @PostMapping("/SetHeartbeatPacketTimeCharging") public ResponseVO<Object> SetHeartbeatPacketTimeCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) { return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true)); return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true, false)); } /** @@ -177,7 +177,7 @@ @PostMapping("/SetHeartbeatPacketTimeNotCharging") public ResponseVO<Object> SetHeartbeatPacketTimeNotCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) { return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false)); return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false, false)); } /** @@ -205,7 +205,8 @@ public ResponseVO<Object> SetCalendar(@RequestBody @Validated C3ChargingParam c3ChargingParam) { return ResponseUtil.success(c3ChargingService.SetCalendar(c3ChargingParam.getC3Mac() , c3ChargingParam.getYear(), c3ChargingParam.getMonth(), c3ChargingParam.getDay(), c3ChargingParam.getHour(), c3ChargingParam.getMin(), c3ChargingParam.getSec())); , c3ChargingParam.getYear(), c3ChargingParam.getMonth(), c3ChargingParam.getDay() , c3ChargingParam.getHour(), c3ChargingParam.getMin(), c3ChargingParam.getSec(), false)); } /** ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java
@@ -59,10 +59,10 @@ //保存充电桩硬件信息 boolean b = SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress()); //检查是否有正在进行的订单,有的话继续充电 SpringContextHolder.getBean(C3mOrderService.class).recoverContinueCharing(netRequestFrame.getDestinationAddress(), netRequestFrame.getMcuUdid()); if (!b) { return; } // SpringContextHolder.getBean(C3mOrderService.class).recoverContinueCharing(netRequestFrame.getDestinationAddress(), netRequestFrame.getMcuUdid()); // if (!b) { // return; // } } } else if (C3ChargingEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) { // 网页操作二维码请求(41) @@ -112,7 +112,7 @@ /** * 读取心跳包,判断剩余金额和已充电量,统计到缓存中正在进行的订单。 */ A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress()); A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = c3ChargingService.ReadTheHeartbeatPackage(completeRequestFrame.getDestinationAddress(), true); if (aPackage == null) { LogUtils.error("{ 充电桩(" + completeRequestFrame.getDestinationAddress() + ")充电结束上报读取心跳包失败,请检查充电桩是否出现故障! }"); return; ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
@@ -35,7 +35,7 @@ * @param clz 内部帧响应实体类 如果不想自己解析 可带上 * @return 返回的解码帧实体类 同时把内部帧解码之后也携带上 */ public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz){ public <T extends BaseResponseInnerFrame<T>> WrapResponseCommonFrame<T> sendRRPC(String deviceName, IRequestFrame iRequestFrame, Class<T> clz) { CommonFrame commonFrame = sendRRPC(deviceName, iRequestFrame); if (commonFrame == null) { return null; @@ -55,7 +55,23 @@ InvokeParam param = new InvokeParam(); param.setOperate("1001"); param.setFrame(iRequestFrame.getEncodeFrame()); InvokeThingServiceResponse.Data data = invokeThing(deviceName, param); InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, false); if (data == null) { return null; } String result = data.getResult(); result = result.replace("\\", ""); Map map = JSON.parseObject(result, Map.class); result = (String) map.get("msg"); return FrameUtils.transformMessageToFrame(result); } @Override public CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame, boolean resendFlag) { InvokeParam param = new InvokeParam(); param.setOperate("1001"); param.setFrame(iRequestFrame.getEncodeFrame()); InvokeThingServiceResponse.Data data = invokeThing(deviceName, param, true); if (data == null) { return null; } @@ -152,7 +168,7 @@ return null; } /** /** * 调用自定义topic * https://help.aliyun.com/document_detail/69584.htm?spm=a2c4g.11186623.0.0.25b33982bSQSom#reference-snk-mrz-wdb * @@ -160,36 +176,84 @@ * @param param 参数 * @return 设备返回的结果 */ protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param) { protected InvokeThingServiceResponse.Data invokeThing(String deviceName, InvokeParam param, boolean resendFlag) { // 填充服务调用的参数 InvokeThingServiceRequest request = new InvokeThingServiceRequest(); // 设备证书之productKey request.setProductKey(getProductKey()); // 设备证书之deviceName request.setDeviceName(deviceName); request.setSysReadTimeout(5000); // 要调用的服务标识符,取决于服务端定义 目前rrpc标识代表同步调用 request.setIdentifier("rrpc"); request.setArgs(JSON.toJSONString(param)); // 获得服务调用响应 InvokeThingServiceResponse response = null; try { response = getClient().getAcsResponse(request); } catch (ClientException e) { e.printStackTrace(); throw new BusinessException("硬件请求失败,请检查硬件设备!"); if (resendFlag) { return getAcsResponse(request, true, 1); } else { return getAcsResponse(request, false, null); } if (response == null) { throw new BusinessException("调用rrpc失败,响应为空!"); } /** * 获得服务调用响应 * * @param request * @return */ private InvokeThingServiceResponse.Data getAcsResponse(InvokeThingServiceRequest request, boolean resendFlag, Integer time) { if (resendFlag) { //需要重发 if (time <= 2) { InvokeThingServiceResponse response = null; try { response = getClient().getAcsResponse(request); if (response == null) { log.error("调用rrpc失败,响应为空!"); return getAcsResponse(request, true, time + 1); } if (!response.getSuccess()) { log.error("调用rrpc失败," + response.getErrorMessage()); return getAcsResponse(request, true, time + 1); } else { // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功 return response.getData(); } } catch (Exception e) { return getAcsResponse(request, true, time + 1); // throw new BusinessException("错误信息:" + e.getMessage()); } } else { throw new BusinessException("硬件请求失败,请检查硬件设备!"); } } else { //不需要重发 InvokeThingServiceResponse response = null; try { response = getClient().getAcsResponse(request); } catch (ClientException e) { e.printStackTrace(); throw new BusinessException("硬件请求失败,请检查硬件设备!"); } if (response == null) { throw new BusinessException("调用rrpc失败,响应为空!"); } if (!response.getSuccess()) { throw new BusinessException("调用rrpc失败," + response.getErrorMessage()); } // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功 if (response.getSuccess()) { // 仅同步服务有result return response.getData(); } return null; } if (!response.getSuccess()) { throw new BusinessException("调用rrpc失败," + response.getErrorMessage()); } // 服务调用成功,仅代表发送服务指令的成功,不代表执行服务本身是否成功 if (response.getSuccess()) { // 仅同步服务有result return response.getData(); } return null; } } ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/topic/ICustomizeTopic.java
@@ -30,4 +30,14 @@ */ CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame); /** * 发送rrpc 请求 * * @param deviceName 设备名 * @param iRequestFrame 编码帧 * @param resendFlag 重发标志 * @return 返回的解码帧实体类 */ CommonFrame sendRRPC(String deviceName, IRequestFrame iRequestFrame, boolean resendFlag); } ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -29,6 +29,7 @@ import com.sandu.ximon.dao.enums.OrderStatus; import com.sandu.ximon.dao.mapper.C3mChargingMapper; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -73,6 +74,7 @@ * * @return 是否成功 */ @SneakyThrows public boolean saveReporEquipment(String deviceName, String mcuUdid, String c3Mac) { C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid)); boolean flag; @@ -95,12 +97,14 @@ String date = new SimpleDateFormat("yyMMddHHmmss").format(new Date()); String s = SetCalendar(c3Mac, Integer.parseInt(date.substring(0, 2)), Integer.parseInt(date.substring(2, 4)), Integer.parseInt(date.substring(4, 6)), Integer.parseInt(date.substring(6, 8)), Integer.parseInt(date.substring(8, 10)), Integer.parseInt(date.substring(10, 12))); Integer.parseInt(date.substring(8, 10)), Integer.parseInt(date.substring(10, 12)), true); if (!"操作成功".equals(s)) { LogUtils.error("发送设置C3时间同步失败!"); return false; } System.out.println("同步时间戳结束"); Thread.sleep(1000); //设置费率 System.out.println("设置费率开始"); @@ -109,9 +113,12 @@ if (list.size() == 0) {//费率表中没有此充电桩数据时 添加默认费率 c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue()); } String rateState = setRate(c3Mac, list); String rateState = setRate(c3Mac, list, true); System.out.println("设置费率结果:" + rateState); System.out.println("设置费率结束"); Thread.sleep(1000); /** 跳包时间同步 * 设置时间规则:充电时为1倍,非充电状态为1.5倍时间 @@ -120,18 +127,19 @@ Set<String> keys = RedisUtils.getBean().keys(C3mRedisConstant.C3_STATUS.getCode() + "*"); C3mRedisConfig.reFlushTime(keys.size()); String time1 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME) * 2, false); String time1 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME) * 2, false, true); LogUtils.error("C3空闲心跳包时间同步响应结果:" + time1); String time2 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME), true); String time2 = SetHeartbeatPacketTimeCharging(c3Mac, C3mRedisConfig.parseInt(C3mRedisConfig.HEART_BEAT_TIME), true, true); LogUtils.error("C3充电时心跳包时间同步响应结果:" + time2); System.out.println("设置心跳包间隔时间结束"); Thread.sleep(1000); /** * 获取心跳包,判断在线 */ System.out.println("获取心跳包开始"); A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = ReadTheHeartbeatPackage(c3Mac); A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage aPackage = ReadTheHeartbeatPackage(c3Mac, true); if (aPackage == null) { LogUtils.error("读取心跳包为空"); return false; @@ -143,12 +151,13 @@ C3mRedisConfig.OUTLINE_TIME ); System.out.println("获取心跳包结束"); Thread.sleep(1000); /** * finally、同步结束 */ System.out.println("同步结束 开始"); String end = EndOfTheSynchronization(c3Mac); String end = EndOfTheSynchronization(c3Mac, true); if (!"操作成功".equals(end)) { LogUtils.error("C3同步结束响应结果" + end); return false; @@ -314,7 +323,7 @@ if (one == null) { throw new BusinessException("充电桩信息不存在!"); } A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage beatDataPackage = ReadTheHeartbeatPackage(one.getC3Mac()); A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage beatDataPackage = ReadTheHeartbeatPackage(one.getC3Mac(), false); if (beatDataPackage != null) { //充电桩ID chargingDto.setC3Id(one.getC3Id()); @@ -498,8 +507,9 @@ * 同步结束 * * @param c3Mac * @param resendFlag 重发标志 */ public String EndOfTheSynchronization(String c3Mac) { public String EndOfTheSynchronization(String c3Mac, boolean resendFlag) { C3EndOfTheSynchronizationReqInnerFrame c3EndOfTheSynchronizationReqInnerFrame = new C3EndOfTheSynchronizationReqInnerFrame(c3Mac); @@ -510,7 +520,12 @@ if (c3mCharging == null) { throw new BusinessException("C3充电桩硬件mcu_udid不存在"); } CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); CommonFrame commonFrame; if (resendFlag) { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true); } else { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); } StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-同步结束", a5Frame, commonFrame); @@ -713,8 +728,9 @@ * 读心跳包 * * @param c3Mac * @param resendFlag 重发标志 */ public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac) { public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac, boolean resendFlag) { C3ReadTheHeartbeatPackageReqInnerFrame readTheHeartbeatPackageReqInnerFrame = new C3ReadTheHeartbeatPackageReqInnerFrame(c3Mac); @@ -725,7 +741,12 @@ if (c3mCharging == null) { throw new BusinessException("C3充电桩硬件mcu_udid不存在"); } CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); CommonFrame commonFrame; if (resendFlag) { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true); } else { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); } StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-读取心跳包", a5Frame, commonFrame); @@ -744,9 +765,10 @@ * * @param c3Mac * @param setTime * @param resndFlag 重发标志 * @return */ public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag) { public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag, boolean resndFlag) { if (setTime <= 0) { throw new BusinessException("设置的心跳包间隔时间错误!"); } @@ -760,7 +782,12 @@ if (c3mCharging == null) { throw new BusinessException("C3充电桩硬件mcu_udid不存在"); } CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); CommonFrame commonFrame; if (resndFlag) { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true); } else { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); } StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置心跳包间隔时间", a5Frame, commonFrame); @@ -860,9 +887,10 @@ * 设置日历(同心跳包中的6字节日期时间) * * @param c3Mac * @param resendFlag 是否需要重发标志 * @return */ public String SetCalendar(String c3Mac, int year, int month, int day, int hour, int min, int sec) { public String SetCalendar(String c3Mac, int year, int month, int day, int hour, int min, int sec, boolean resendFlag) { C3SetCalendarReqInnerFrame setCalendarReqInnerFrame = @@ -875,7 +903,14 @@ if (c3mCharging == null) { throw new BusinessException("C3充电桩硬件mcu_udid不存在"); } CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); CommonFrame commonFrame; if (resendFlag) { //需要重发 commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true); } else { //不需要重发 commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); } StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置日历", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); @@ -895,7 +930,7 @@ * @param list * @return */ public String setRate(String c3Mac, List<C3mChargingCharge> list) { public String setRate(String c3Mac, List<C3mChargingCharge> list, boolean resendFlag) { if (StringUtil.strIsNullOrEmpty(c3Mac)) { throw new BusinessException("C3Mac地址不能为空!"); } @@ -910,7 +945,12 @@ if (c3mCharging == null) { throw new BusinessException("C3充电桩硬件mcu_udid不存在"); } CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); CommonFrame commonFrame; if (resendFlag) { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame, true); } else { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame); } StoreOperationRecordsUtils.storeInnerFrameData(c3Mac, "C3帧-设置费率", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
@@ -59,7 +59,7 @@ if (byId == null) { throw new BusinessException("c3Id不存在"); } String s = chargingService.setRate(byId.getC3Mac(), chargeEntities); String s = chargingService.setRate(byId.getC3Mac(), chargeEntities,false); if (!"操作成功".equals(s)) { throw new BusinessException("设置失败,失败原因: " + s); }