diff --git a/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java b/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java index abb1c72..8d8a4d0 100644 --- a/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java +++ b/src/main/java/com/example/mina/client/aeroflex/AeroflexClient.java @@ -1,11 +1,9 @@ package com.example.mina.client.aeroflex; import com.example.mina.client.base.AbstractClient; -import com.example.mina.client.base.AbstractVirtualBoxClientHandler; import com.example.mina.client.coder.ByteFactory; import com.example.mina.client.entity.AbstractClientMessage; import com.example.mina.server.entity.AeroflexDataBuffer; -import org.apache.mina.filter.codec.ProtocolCodecFactory; /** * @author dy @@ -16,7 +14,7 @@ public class AeroflexClient extends AbstractClient { @Override protected void init(AbstractClientMessage abstractClientMessage) { protocolCodecFactory = new ByteFactory(); - abstractVirtualBoxClientHandler = new AeroflexClientHandler(abstractClientMessage); + abstractVirtualBoxClientHandler = new AeroflexClientHandler(abstractClientMessage, hardwareDataBuffer); } @Override diff --git a/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java b/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java index 3a1e65a..6bbdf2d 100644 --- a/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java +++ b/src/main/java/com/example/mina/client/aeroflex/AeroflexClientHandler.java @@ -3,6 +3,7 @@ package com.example.mina.client.aeroflex; import com.example.mina.client.base.AbstractVirtualBoxClientHandler; import com.example.mina.client.entity.AbstractClientMessage; import com.example.mina.client.entity.Command; +import com.example.mina.server.base.AbstractHardwareDataBuffer; /** * @author dy @@ -10,8 +11,9 @@ import com.example.mina.client.entity.Command; */ public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler { - public AeroflexClientHandler(AbstractClientMessage clientMessage) { - super(clientMessage); + public AeroflexClientHandler(AbstractClientMessage clientMessage, + AbstractHardwareDataBuffer abstractHardwareDataBuffer) { + super(clientMessage, abstractHardwareDataBuffer); } @Override diff --git a/src/main/java/com/example/mina/client/base/AbstractClient.java b/src/main/java/com/example/mina/client/base/AbstractClient.java index 4149e7e..c3b63c7 100644 --- a/src/main/java/com/example/mina/client/base/AbstractClient.java +++ b/src/main/java/com/example/mina/client/base/AbstractClient.java @@ -1,7 +1,6 @@ package com.example.mina.client.base; import com.example.mina.client.entity.AbstractClientMessage; -import com.example.mina.client.entity.Command; import com.example.mina.server.base.AbstractHardwareDataBuffer; import org.apache.mina.core.service.IoConnector; import org.apache.mina.filter.codec.ProtocolCodecFactory; @@ -9,7 +8,6 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.transport.socket.nio.NioSocketConnector; import java.net.InetSocketAddress; -import java.util.List; /** * @author dy diff --git a/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java b/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java index 7dd80c5..85affe8 100644 --- a/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java +++ b/src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java @@ -3,29 +3,26 @@ package com.example.mina.client.base; import com.example.mina.client.entity.AbstractClientMessage; import com.example.mina.client.entity.Command; -import com.example.mina.server.util.LogUtils; -import com.example.mina.server.util.Lte3000CommandHelper; +import com.example.mina.server.base.AbstractHardwareDataBuffer; import lombok.Data; -import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolCodecFilter; -import org.apache.mina.filter.codec.textline.LineDelimiter; -import org.apache.mina.filter.codec.textline.TextLineCodecFactory; -import org.apache.mina.transport.socket.nio.NioSocketConnector; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.charset.Charset; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; @Data public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter { protected AbstractClientMessage clientMessage; - public AbstractVirtualBoxClientHandler(AbstractClientMessage clientMessage) { + protected AbstractHardwareDataBuffer hardwareDataBuffer; + + public AbstractVirtualBoxClientHandler(AbstractClientMessage clientMessage, + AbstractHardwareDataBuffer abstractHardwareDataBuffer) { this.clientMessage = clientMessage; + this.hardwareDataBuffer = abstractHardwareDataBuffer; } @Override @@ -38,13 +35,13 @@ public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) { handleCommandResponse(clientMessage.getCommands().get(1).getBytes(), (byte[]) message, ((byte[]) message).length); System.out.println("客户端messageReceived被调用!"); - System.out.println("client端接收信息:" + message.toString()); + System.out.println("client端接收信息:" + new String((byte[])message, StandardCharsets.UTF_8)); } @Override public void messageSent(IoSession session, Object message) { System.out.println("客户端messageSent被调用!"); - System.out.println("client端发送信息:" + message.toString()); + System.out.println("client端发送信息:" + new String((byte[])message, StandardCharsets.UTF_8)); } @Override diff --git a/src/main/java/com/example/mina/client/lte3000/Lte3000Client.java b/src/main/java/com/example/mina/client/lte3000/Lte3000Client.java index 05973db..a9c3e64 100644 --- a/src/main/java/com/example/mina/client/lte3000/Lte3000Client.java +++ b/src/main/java/com/example/mina/client/lte3000/Lte3000Client.java @@ -18,7 +18,7 @@ public class Lte3000Client extends AbstractClient { @Override protected void init(AbstractClientMessage abstractClientMessage) { protocolCodecFactory = new ByteFactory(); - abstractVirtualBoxClientHandler = new Lte3000ClientHandler(abstractClientMessage); + abstractVirtualBoxClientHandler = new Lte3000ClientHandler(abstractClientMessage, hardwareDataBuffer); } @Override diff --git a/src/main/java/com/example/mina/client/lte3000/Lte3000ClientHandler.java b/src/main/java/com/example/mina/client/lte3000/Lte3000ClientHandler.java index 59af2a3..0d79847 100644 --- a/src/main/java/com/example/mina/client/lte3000/Lte3000ClientHandler.java +++ b/src/main/java/com/example/mina/client/lte3000/Lte3000ClientHandler.java @@ -2,6 +2,8 @@ package com.example.mina.client.lte3000; import com.example.mina.client.base.AbstractVirtualBoxClientHandler; import com.example.mina.client.entity.AbstractClientMessage; +import com.example.mina.server.base.AbstractHardwareDataBuffer; +import com.example.mina.server.util.Lte3000CommandHelper; import lombok.extern.slf4j.Slf4j; import org.apache.mina.core.session.IoSession; @@ -12,8 +14,9 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class Lte3000ClientHandler extends AbstractVirtualBoxClientHandler { - public Lte3000ClientHandler(AbstractClientMessage clientMessage) { - super(clientMessage); + public Lte3000ClientHandler(AbstractClientMessage clientMessage, + AbstractHardwareDataBuffer abstractHardwareDataBuffer) { + super(clientMessage, abstractHardwareDataBuffer); } @Override @@ -21,8 +24,88 @@ public class Lte3000ClientHandler extends AbstractVirtualBoxClientHandler { super.sessionOpened(session); } + protected boolean isSameValue(byte value, int expect) { + return ((0xFF & value) == expect); + } + @Override protected boolean handleCommandResponse(byte[] cmd, byte[] response, int responseLen) { + if (response[0] != Lte3000CommandHelper.ACK || responseLen < 6) { + return false; + } + //api document: "SRM - MRF - MRM - XRM - QRM - LTE Protocol v2.15 Rev FR.pdf" + + //O:Query Output Channel P.106 + //0x4F + if (responseLen == 9 && isSameValue(response[3], 0x4F)) { // 'O' +// 0x6 0x46 0x46 0x4F 0x30 0x32 0x38 0x3 0x70 + int col = Lte3000CommandHelper.getBcdPort(cmd[4], cmd[5], cmd[6]); + int row = Lte3000CommandHelper.getBcdPort(response[4], response[5], response[6]); + // limits only one set "ON" in a column, others should be OFF + for (int i = 1; i <= hardwareDataBuffer.getMaxRow(); i++) { + if (i == row) { + hardwareDataBuffer.setAttenuation(i, col, 1); + } else { + hardwareDataBuffer.setAttenuation(i, col, 0); + } + } + log.info("RESPONSE Ox4F. ROW = {}, COL = {}", row, col); + return true; + } + + //S: Set CrossPoint P.115 + //0x53 + if (responseLen == 6 && isSameValue(response[3], 0x53)) { + int col = Lte3000CommandHelper.getBcdPort(cmd[4], cmd[5], cmd[6]); + int row = Lte3000CommandHelper.getBcdPort(cmd[7], cmd[8], cmd[9]); + // limits only one set "ON" in a column, others should be OFF + for (int i = 1; i <= hardwareDataBuffer.getMaxRow(); i++) { + if (i == row) { + hardwareDataBuffer.setAttenuation(i, col, 1); + } else { + hardwareDataBuffer.setAttenuation(i, col, 0); + } + } + log.info("RESPONSE Ox53. ROW = {}, COL = {}", row, col); + return true; + } + + //XGMO: Set Gain Control to Manual Mode - Output p.137 + //0x58 0x47 0x4D 0x4F + if (responseLen == 9 && response[3] == 'X' && response[4] == 'G' && response[5] == 'M' && response[6] == 'O') { +// receive - 0x2 0x30 0x30 0x58 0x47 0x4D 0x4F 0x30 0x30 0x31 0x40 0x2D 0x36 0x33 0x2E 0x30 0x3 0x5B +// 00XGMO001@-63.0[ +// set col/attn 1/63 + + int col = Lte3000CommandHelper.getBcdPort(cmd[7], cmd[8], cmd[9]); + int attn = Lte3000CommandHelper.getBcdAttn(cmd[11], cmd[12], cmd[13], cmd[14], cmd[15]); + hardwareDataBuffer.setOffset(col, attn); + log.info("RESPONSE XGMO. ATTN = {}, COL = {}", attn, col); + return true; + } + + + //XGRO: Gain Control Read Status - Output P.139 + if (responseLen == 16 && response[3] == 'X' && response[4] == 'G' && response[5] == 'R' && response[6] == 'O') { + /* + Example Command: + 02 XX XX 58 46 52 4F 30 31 36 03 XX + STX ADR ADR X G R O O 1 6 ETX CHK + (Read attenuation control status of system output 16) + */ + /* + Example Response: + 06 XX XX 58 46 52 4F 4D 40 2D 31 33 2E 35 03 XX + ACK ADR ADR X G R O M @ - 1 3 . 5 ETX CHX + (Output set at -13.5 dB of attenuation in manual mode. ) + */ + int col = Lte3000CommandHelper.getBcdPort(cmd[7], cmd[8], cmd[9]); + int attn = Lte3000CommandHelper.getBcdAttn(response[9], response[10], response[11], response[12], response[13]); + hardwareDataBuffer.setOffset(col, attn); + log.info("RESPONSE XGRO. ATTN = {}, COL = {}", attn, col); + return true; + } + log.info("收到服务器回传的消息了"); return false; } -- libgit2 0.21.2