package com.fzzy.protocol.youxian0.analysis; import com.fzzy.api.Constant; import com.fzzy.api.utils.BytesUtil; import com.fzzy.gateway.GatewayUtils; import com.fzzy.gateway.entity.GatewayDevice; import com.fzzy.protocol.ProtocolUtils; import com.fzzy.protocol.youxian0.ServiceUtils; import org.springframework.stereotype.Component; import java.net.InetAddress; /** * 游仙主库,返回报文解析 */ @Component(AnalysisService.BEAN_ID) public class AnalysisService { public static final String BEAN_ID = "youxian0.analysisService"; /** * 协议解析 *
* 7E 00 02 02 00 77 00 00 A0 FF FF 66 FF 04 BE 01 64 6A 6B 6A 68 CE 02 A4 BB BA BA B4 CE 03 E4 32 3D 32 3D CE 04 44 BC B3 BC B3 20 47 7E * * @param address * @param port * @param strMsg */ public void analysis(InetAddress address, int port, String strMsg) { //分机ID int start = 2 * 2; String deviceSn = strMsg.substring(start, start + 2); deviceSn = BytesUtil.hexToInt(deviceSn) + ""; //命令ID start = 5 * 2; String msgIdHex = strMsg.substring(start, start + 2); int msgId = BytesUtil.hexToInt(msgIdHex); //命令类型 start = 11 * 2; String funId = strMsg.substring(start, start + 2); GatewayDevice device = GatewayUtils.getCacheByDeviceSn(deviceSn); //粮情返回 if (ServiceUtils.FUNCTION_66.equalsIgnoreCase(funId)) { this.analysisGrain(device, msgId, strMsg); } } /** * 粮情解析 *
* 7E 00 02 02 00 77 00 00 A0 FF FF 66 FF 04 BE 01 64 6A 6B 6A 68 CE * 02 A4 BB BA BA B4 CE 03 E4 32 3D 32 3D CE 04 44 BC B3 BC B3 20 47 7E * * @param device * @param msgId 命令ID */ private void analysisGrain(GatewayDevice device, int msgId, String strMsg) { //只保留粮情信息 int start = 22 * 2; strMsg = strMsg.substring(start); //密钥和点数 String kyeNumHex = strMsg.substring(2, 4); String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt(kyeNumHex)); String key = kyeNumBin.substring(0, 3); int keyValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key)); key = kyeNumBin.substring(4); int numValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key)); //02 A4 BB BA BA B4 start = 2 * 2; String tempHex; for (int i = 0; i < numValue; i++) { start = start + i * 2; tempHex = strMsg.substring(start, start + 2); //实际温度=密钥*密钥*37(溢出为无符号字节)再异或加密后的温度/2。 } } }