Skip to content

Commit 2f4a6b7

Browse files
committed
feat: add device discover response
Signed-off-by: wei <[email protected]>
1 parent 873945b commit 2f4a6b7

File tree

26 files changed

+400
-126
lines changed

26 files changed

+400
-126
lines changed

mdtp-client/src/main/java/io/github/protocol/mdtp/client/MdtpClient.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package io.github.protocol.mdtp.client;
22

3+
import io.github.protocol.mdtp.common.codec.MdtpDecoder;
34
import io.github.protocol.mdtp.common.model.CDATHeader;
5+
import io.github.protocol.mdtp.common.model.CDATHeaderFactory;
46
import io.github.protocol.mdtp.common.model.DeviceDiscoveryRequest;
57
import io.github.protocol.mdtp.common.model.MdtpPacket;
6-
import io.github.protocol.mdtp.common.model.MessageBodyHeader;
78
import io.netty.bootstrap.Bootstrap;
89
import io.netty.channel.ChannelFuture;
910
import io.netty.channel.ChannelInitializer;
11+
import io.netty.channel.ChannelPipeline;
1012
import io.netty.channel.EventLoopGroup;
1113
import io.netty.channel.nio.NioEventLoopGroup;
1214
import io.netty.channel.socket.SocketChannel;
@@ -42,6 +44,8 @@ public void start() throws Exception {
4244
.handler(new ChannelInitializer<SocketChannel>() {
4345
@Override
4446
protected void initChannel(SocketChannel ch) throws Exception {
47+
ChannelPipeline pipeline = ch.pipeline();
48+
pipeline.addLast(new MdtpDecoder());
4549
}
4650
});
4751
this.channelFuture = bootstrap.connect().sync();
@@ -66,8 +70,7 @@ public void close() throws IOException {
6670
public void sendDeviceDiscoveryRequest(int[] deviceTypes) {
6771
log.info("start to send device discovery request.");
6872
DeviceDiscoveryRequest request = new DeviceDiscoveryRequest();
69-
request.setMessageBodyHeader(MessageBodyHeader.DEVICE_DISCOVERY_REQUEST);
70-
request.setRequestId(request.generateRequestId());
73+
request.setRequestId(request.generateId());
7174

7275
if (deviceTypes == null) {
7376
request.setDeviceTypeCount((byte) 0);
@@ -79,14 +82,7 @@ public void sendDeviceDiscoveryRequest(int[] deviceTypes) {
7982
request.setDeviceTypes(deviceTypes);
8083
}
8184

82-
CDATHeader cdatHeader = new CDATHeader();
83-
cdatHeader.setFormatType((byte) 0x02);
84-
cdatHeader.setProtocolVersion((byte) 1);
85-
cdatHeader.setMessageLength((short) 0);
86-
cdatHeader.setTimestamp(System.currentTimeMillis());
87-
cdatHeader.setFlags((byte) 0b01100000);
88-
cdatHeader.setSequenceNumber(0);
89-
cdatHeader.setLogicalChannelId(0);
85+
CDATHeader cdatHeader = CDATHeaderFactory.createDeviceDiscoveryCDATHeader();
9086

9187
MdtpPacket packet = new MdtpPacket();
9288
packet.setHeader(cdatHeader);
@@ -95,6 +91,6 @@ public void sendDeviceDiscoveryRequest(int[] deviceTypes) {
9591
packet.setSignature(null);
9692

9793
this.channelFuture.channel().writeAndFlush(packet.toByteBuf());
98-
log.info("send device discovery request success: " + packet);
94+
log.info("send device discovery request success.");
9995
}
10096
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.github.protocol.mdtp.common.codec;
2+
3+
import io.github.protocol.mdtp.common.model.AbstractMessageBody;
4+
import io.github.protocol.mdtp.common.model.DeviceDiscoveryResponse;
5+
import io.netty.buffer.ByteBuf;
6+
7+
public class DeviceDiscoveryReponseDecoder implements MessageBodyDecoder {
8+
@Override
9+
public AbstractMessageBody handle(ByteBuf in) {
10+
return DeviceDiscoveryResponse.readFromBuffer(in);
11+
}
12+
13+
}

mdtp-common/src/main/java/io/github/protocol/mdtp/common/codec/MdtpDecoder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,10 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) t
2424
MessageBodyHeader messageBodyHeader = MessageBodyHeader.readByteBuf(in);
2525
MessageBodyDecoder messageDecode = MessageDecoderFactory.getDecoder(messageBodyHeader);
2626
AbstractMessageBody messageBody = messageDecode.handle(in);
27-
messageBody.setMessageBodyHeader(messageBodyHeader);
28-
2927
mdtpPacket.setHeader(header);
3028
mdtpPacket.setBody(messageBody);
3129

3230
out.add(mdtpPacket);
31+
log.info("decode packet success: {}", mdtpPacket);
3332
}
3433
}

mdtp-common/src/main/java/io/github/protocol/mdtp/common/codec/MessageDecoderFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class MessageDecoderFactory {
1111

1212
static {
1313
decoders.put(MessageBodyHeader.DEVICE_DISCOVERY_REQUEST.toShort(), new DeviceDiscoveryRequestDecoder());
14+
decoders.put(MessageBodyHeader.DEVICE_DISCOVERY_RESPONSE.toShort(), new DeviceDiscoveryReponseDecoder());
1415
}
1516

1617
public static MessageBodyDecoder getDecoder(MessageBodyHeader header) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.github.protocol.mdtp.common.handler;
2+
3+
import io.github.protocol.mdtp.common.model.Attributes;
4+
import io.github.protocol.mdtp.common.model.CDATHeader;
5+
import io.github.protocol.mdtp.common.model.CDATHeaderFactory;
6+
import io.github.protocol.mdtp.common.model.Device;
7+
import io.github.protocol.mdtp.common.model.DeviceDiscoveryRequest;
8+
import io.github.protocol.mdtp.common.model.DeviceDiscoveryResponse;
9+
import io.github.protocol.mdtp.common.model.MdtpPacket;
10+
import io.netty.channel.ChannelHandlerContext;
11+
import lombok.extern.slf4j.Slf4j;
12+
13+
@Slf4j
14+
public class DeviceDiscoveryRequestHandler implements MessageBodyHandler {
15+
16+
@Override
17+
public void handle (ChannelHandlerContext ctx, MdtpPacket requestPacket) {
18+
log.info("start to send device discovery response.");
19+
DeviceDiscoveryRequest deviceDiscoveryRequest = (DeviceDiscoveryRequest) requestPacket.getBody();
20+
DeviceDiscoveryResponse deviceDiscoveryResponse = new DeviceDiscoveryResponse();
21+
deviceDiscoveryResponse.setRequestId(deviceDiscoveryRequest.getRequestId());
22+
deviceDiscoveryResponse.setResponseId(deviceDiscoveryResponse.generateId());
23+
Device device = ctx.channel().attr(Attributes.DEVICE_KEY).get();
24+
deviceDiscoveryResponse.setDevice(device);
25+
26+
CDATHeader cdatHeader = CDATHeaderFactory.createDeviceDiscoveryCDATHeader();
27+
28+
MdtpPacket packet = new MdtpPacket();
29+
packet.setHeader(cdatHeader);
30+
packet.setSecurityHeader(null);
31+
packet.setBody(deviceDiscoveryResponse);
32+
packet.setSignature(null);
33+
ctx.channel().writeAndFlush(packet.toByteBuf());
34+
log.info("send device discovery response success.");
35+
}
36+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.github.protocol.mdtp.common.handler;
2+
3+
import io.github.protocol.mdtp.common.model.MdtpPacket;
4+
import io.netty.channel.ChannelHandlerContext;
5+
6+
public interface MessageBodyHandler {
7+
8+
void handle (ChannelHandlerContext ctx, MdtpPacket mdtpPacket);
9+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.github.protocol.mdtp.common.handler;
2+
3+
4+
import io.github.protocol.mdtp.common.model.MessageBodyHeader;
5+
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
public class MessageHandlerFactory {
10+
private static final Map<Short, MessageBodyHandler> handlers = new HashMap<>();
11+
12+
static {
13+
handlers.put(MessageBodyHeader.DEVICE_DISCOVERY_REQUEST.toShort(), new DeviceDiscoveryRequestHandler());
14+
}
15+
16+
public static MessageBodyHandler getHandler(MessageBodyHeader header) {
17+
return handlers.get(header.toShort());
18+
}
19+
}

mdtp-common/src/main/java/io/github/protocol/mdtp/common/model/AbstractMessageBody.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,16 @@
99
public abstract class AbstractMessageBody {
1010
private MessageBodyHeader messageBodyHeader;
1111

12-
public short generateRequestId() {
12+
protected AbstractMessageBody () {
13+
}
14+
15+
protected AbstractMessageBody (MessageBodyHeader messageBodyHeader) {
16+
this.messageBodyHeader = messageBodyHeader;
17+
}
18+
19+
public short generateId() {
1320
UUID uuid = UUID.randomUUID();
14-
return (short) (uuid.getLeastSignificantBits() & 0xFFFF);
21+
return (short) (uuid.getLeastSignificantBits() & 0x7FFF);
1522
}
1623

1724
public void writeByteBuf(ByteBuf buffer) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.github.protocol.mdtp.common.model;
2+
3+
import io.netty.buffer.ByteBuf;
4+
5+
import java.net.InetAddress;
6+
import java.net.UnknownHostException;
7+
8+
public class Address {
9+
public static final byte IPV4_TYPE = 4;
10+
public static final byte IPV6_TYPE = 6;
11+
12+
private final byte type;
13+
private final byte[] value;
14+
15+
public Address(byte type, byte[] value) {
16+
this.type = type;
17+
this.value = value;
18+
}
19+
20+
public String getIpString() throws UnknownHostException {
21+
return InetAddress.getByAddress(value).getHostAddress();
22+
}
23+
24+
public void writeByteBuf(ByteBuf buffer) {
25+
buffer.writeByte(type);
26+
buffer.writeBytes(value);
27+
}
28+
29+
public static Address readByteBuf(ByteBuf buffer) {
30+
byte type = buffer.readByte();
31+
int length = (type == IPV4_TYPE) ? 4 : 16;
32+
byte[] value = new byte[length];
33+
buffer.readBytes(value);
34+
return new Address(type, value);
35+
}
36+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.github.protocol.mdtp.common.model;
2+
3+
import io.netty.util.AttributeKey;
4+
5+
public class Attributes {
6+
public static final AttributeKey<Device> DEVICE_KEY = AttributeKey.valueOf("device");
7+
}

0 commit comments

Comments
 (0)