Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.Data;

import java.util.UUID;

@Data
public abstract class AbstractMessageBody {
private short messageBodyHeader;

public void setMessageBodyHeader(MessageType messageType, ServiceGroup serviceGroup, DiscoveryServiceCode serviceCode) {
this.messageBodyHeader = 0;
this.messageBodyHeader |= (short) (messageType.getCode() & 0b111);
this.messageBodyHeader |= (short) ((serviceGroup.getCode() & 0b1111111) << 3);
this.messageBodyHeader |= (short) ((serviceCode.getCode() & 0b111111) << 10);
}

public short generateRequestId() {
UUID uuid = UUID.randomUUID();
return (short) (uuid.getLeastSignificantBits() & 0xFFFF);
}

public ByteBuf toByteBuf(ByteBuf buffer) {
buffer.writeShort(messageBodyHeader);
return buffer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class CDATHeader {

private byte formatType;

private byte protocolVersion;

private short messageLength;

private long timestamp;

private byte flags;

private Integer sequenceNumber;

private Integer logicalChannelId;

public ByteBuf toByteBuf(ByteBuf buffer) {
buffer.writeByte(formatType);
buffer.writeByte(protocolVersion);
buffer.writeShort(messageLength);
buffer.writeLong(timestamp);
buffer.writeByte(flags);
buffer.writeInt(sequenceNumber);
buffer.writeInt(logicalChannelId);
return buffer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.Data;


@Data
public class DeviceDiscoveryRequest extends AbstractMessageBody {
private short requestId;

private byte mask;

private byte deviceTypeCount;

private int[] deviceTypes;

public ByteBuf toByteBuf(ByteBuf buffer) {
super.toByteBuf(buffer);
buffer.writeShort(requestId);
buffer.writeByte(mask);
buffer.writeByte(deviceTypeCount);
for (int deviceType : deviceTypes) {
buffer.writeInt(deviceType);
}
return buffer;
}

public static DeviceDiscoveryRequest fromByteBuf(ByteBuf data) {
DeviceDiscoveryRequest request = new DeviceDiscoveryRequest();
request.requestId = data.readShort();
request.mask = data.readByte();
request.deviceTypeCount = data.readByte();

int length = request.deviceTypeCount;
request.deviceTypes = new int[length];
for (int i = 0; i < length; i++) {
request.deviceTypes[i] = data.readInt();
}
return request;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.Data;

import java.nio.charset.StandardCharsets;

@Data
public class DeviceDiscoveryResponse {
private short messageHeader;

private short requestId;

private short responseId;

private byte mask;

private byte deviceStatus;

private byte addressCount;

private String[] addresses;

private short port;

private int deviceType;

private byte[] uniqueId;

private String deviceName;

public ByteBuf toByteBuf(ByteBuf buffer) {
buffer.writeShort(messageHeader);
buffer.writeShort(requestId);
buffer.writeShort(responseId);
buffer.writeByte(mask);
buffer.writeByte(deviceStatus);
buffer.writeByte(addressCount);

for (String address : addresses) {
byte[] addressBytes = address.getBytes(StandardCharsets.UTF_8);
buffer.writeBytes(addressBytes);
}

buffer.writeShort(port);
buffer.writeInt(deviceType);

if (uniqueId != null) {
buffer.writeBytes(uniqueId);
}

if (deviceName != null) {
byte[] nameBytes = deviceName.getBytes(StandardCharsets.UTF_8);
buffer.writeBytes(nameBytes);
}

return buffer;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package iot.github.protocol.mdtp.common.model;
package io.github.protocol.mdtp.common.model;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.Data;

@Data
public class MdtpPacket {

private CDATHeader header;

private SecurityHeader securityHeader;

private AbstractMessageBody body;

private Signature signature;

public ByteBuf toByteBuf(ByteBuf buffer) {
header.toByteBuf(buffer);
if (securityHeader != null) {
securityHeader.toByteBuf(buffer);
}
if (body != null) {
body.toByteBuf(buffer);
}
return buffer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.github.protocol.mdtp.common.model;

public enum MessageType {
REQUEST(0),

RESPONSE(1),

NOTIFY(2);

private final int code;

MessageType(int code) {
this.code = code;
}

public int getCode() {
return code;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.github.protocol.mdtp.common.model;

import io.netty.buffer.ByteBuf;
import lombok.Data;

@Data
public class SecurityHeader {
private byte[] encryptionData;

public ByteBuf toByteBuf(ByteBuf buffer) {
for (int data : encryptionData) {
buffer.writeInt(data);
}
return buffer;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package iot.github.protocol.mdtp.common.model;
package io.github.protocol.mdtp.common.model;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.github.protocol.mdtp.common.model;

import lombok.Data;

@Data
public class Signature {
private byte[] signatureData;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package io.github.protocol.mdtp.common;

import io.github.protocol.mdtp.common.model.AbstractMessageBody;
import io.github.protocol.mdtp.common.model.DiscoveryServiceCode;
import io.github.protocol.mdtp.common.model.MessageType;
import io.github.protocol.mdtp.common.model.ServiceGroup;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class AbstractMessageBodyTest {

private AbstractMessageBody messageBody;

@BeforeEach
void setUp() {
messageBody = new AbstractMessageBody(){};
}

@Test
void testSetMessageBodyHeader() {
MessageType messageType = mock(MessageType.class);
ServiceGroup serviceGroup = mock(ServiceGroup.class);
DiscoveryServiceCode serviceCode = mock(DiscoveryServiceCode.class);

when(messageType.getCode()).thenReturn(1);
when(serviceGroup.getCode()).thenReturn(2);
when(serviceCode.getCode()).thenReturn( 3);

messageBody.setMessageBodyHeader(messageType, serviceGroup, serviceCode);

short expectedHeader = (short) ((1 & 0b111) | ((2 & 0b1111111) << 3) | ((3 & 0b111111) << 10));

assertEquals(expectedHeader, messageBody.getMessageBodyHeader());
}

@Test
void testGenerateRequestId() {
short requestId1 = messageBody.generateRequestId();
short requestId2 = messageBody.generateRequestId();

assertEquals(Short.class, ((Object) requestId1).getClass());
assertEquals(Short.class, ((Object) requestId2).getClass());
assertNotEquals(requestId1, requestId2);
}

@Test
void testToByteBuf() {
ByteBuf buffer = Unpooled.buffer();

MessageType messageType = mock(MessageType.class);
ServiceGroup serviceGroup = mock(ServiceGroup.class);
DiscoveryServiceCode serviceCode = mock(DiscoveryServiceCode.class);

when(messageType.getCode()).thenReturn(1);
when(serviceGroup.getCode()).thenReturn(2);
when(serviceCode.getCode()).thenReturn( 3);

messageBody.setMessageBodyHeader(messageType, serviceGroup, serviceCode);

messageBody.toByteBuf(buffer);

assertEquals(messageBody.getMessageBodyHeader(), buffer.readShort());

buffer.release();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.github.protocol.mdtp.common;

import io.github.protocol.mdtp.common.model.CDATHeader;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CDATHeaderTest {
private CDATHeader cdatHeader;

@BeforeEach
void setUp() {
cdatHeader = new CDATHeader(
(byte) 1,
(byte) 2,
(short) 100,
123456789L,
(byte) 0x1F,
42,
7
);
}

@Test
void testToByteBuf() {
ByteBuf buffer = Unpooled.buffer();

cdatHeader.toByteBuf(buffer);

assertEquals(1, buffer.readByte());
assertEquals(2, buffer.readByte());
assertEquals(100, buffer.readShort());
assertEquals(123456789L, buffer.readLong());
assertEquals(0x1F, buffer.readByte());
assertEquals(42, buffer.readInt());
assertEquals(7, buffer.readInt());

buffer.release();
}
}
Loading