package com.ruoyi.sim.service.impl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.sim.constant.CommConst; import com.ruoyi.sim.domain.SimMsg; import com.ruoyi.sim.util.CRC16Modbus; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import static com.ruoyi.sim.constant.CommConst.*; /** * 万能询问报文 * AA000103B100000000E0BE55 */ @Service public class CommBuildService { private static final Logger l = LoggerFactory.getLogger(CommBuildService.class); /** * CRC-16(Modbus) *

* https://www.23bei.com/tool/59.html */ public static boolean CRC_16_MODBUS = true; @Autowired private SnowflakeIdService idService; /** * 读取设备序列号 * * @param simNum sim.sim_num */ public SimMsg buildSendMsgReadSimType(final String simNum) { return buildSendMsg(simNum, CMD_READ_TYPE, CMD_ID_GET_SN); } /** * 询问设备类型和序列号 * * @return */ public SimMsg buildSendMsgWhichSim() { return buildSendMsg(CommConst.BLANK_SIM_NUM, CMD_READ_TYPE, CMD_ID_GET_SN); } /** * 故障下发 * * @param simNum sim.sim_num * @param bindHardwareMsg fault.bind_hardware_msg */ public SimMsg buildSendMsgWriteFault(final String simNum, final String bindHardwareMsg) { return buildSendMsg(simNum, CommConst.CMD_SET_FAULT, bindHardwareMsg); } /** * 读取故障 * * @param simNum sim.sim_num * @param bindHardwareMsg fault.bind_hardware_msg */ public SimMsg buildSendMsgReadFaultResistance(final String simNum, final String bindHardwareMsg) { return buildSendMsg(simNum, CMD_READ_FAULT_RESISTANCE, bindHardwareMsg); } /** * 清除故障 * * @param simNum sim.sim_num * @param bindHardwareMsg fault.bind_hardware_msg */ public SimMsg buildSendMsgClearFault(final String simNum, final String bindHardwareMsg) { return buildSendMsg(simNum, CMD_CLEAR_FAULT, bindHardwareMsg); } /** * 填充内容为空。 * * @param simNum * @param cmd * @param cmdId * @return */ public SimMsg buildSendMsg(final String simNum, final String cmd, final String cmdId) { return buildSendMsg(simNum, ORN_SEND, cmd, cmdId, CommConst.CMD_DATA_PLACE_HOLDER); } /** * 生成发送指令基本方法。 * * @param simNum * @param orn * @param cmd * @param cmdId * @param data * @return */ public SimMsg buildSendMsg(final String simNum, final String orn, final String cmd, final String cmdId, final String data) { SimMsg smS = new SimMsg(); smS.setSimMsgId(idService.nextId()); if (StringUtils.isEmpty(simNum) || StringUtils.isEmpty(cmd) || StringUtils.isEmpty(cmdId) || StringUtils.isEmpty(data)) { throw new IllegalArgumentException("buildSendMsg error 01"); } if (simNum.length() != LENGTH_2) { throw new IllegalArgumentException("buildSendMsg error 02"); } if (cmd.length() != LENGTH_2) { throw new IllegalArgumentException("buildSendMsg error 03"); } if (cmdId.length() != LENGTH_2) { throw new IllegalArgumentException("buildSendMsg error 04"); } if (data.length() != LENGTH_8) { throw new IllegalArgumentException("buildSendMsg error 05"); } StringBuffer m = new StringBuffer(); m.append(PREFIX); m.append(simNum); m.append(orn); m.append(cmd); m.append(cmdId); m.append(data); // 追加CRC校验 if (CRC_16_MODBUS) { String crcContent = m.toString(); byte[] sendByteContent = CommSendService.hexStrToByteArrs(crcContent); // l.info("sendByteContent = {}", CommSendService.bytesToHexV2(sendByteContent)); byte[] sendByteCrc = CRC16Modbus.calculateCRC(sendByteContent); // l.info("sendByteCrc = {}", CommSendService.bytesToHexV2(sendByteCrc)); String crc = CommSendService.bytesToHexV2(sendByteCrc); // l.debug("crc: {}", crc.toUpperCase()); m.append(crc.toUpperCase()); } m.append(SUFFIX); final String mFinal = m.toString(); if (mFinal.length() != LENGTH_24) { throw new IllegalArgumentException("buildSendMsg error 06"); } smS.setSendMsg(mFinal); return smS; } public AjaxResult buildSendMsgAR(final String simNum, final String orn, final String cmd, final String cmdId, final String data) { final SimMsg sm = buildSendMsg(simNum, orn, cmd, cmdId, data); return AjaxResult.success(sm); } }