Comments 6
Спасибо за статью!
Расскажите, пожалуйста, а как у вас в проекте реализован протокол общения между устройством и сервером?
Я некоторое время назад тоже писал сервер на Netty для IoT и воодушевившись этой статьей реализовал примерно так:
Спасибо.
Расскажите, пожалуйста, а как у вас в проекте реализован протокол общения между устройством и сервером?
Я некоторое время назад тоже писал сервер на Netty для IoT и воодушевившись этой статьей реализовал примерно так:
Базовый класс
abstract public class Packet implements Serializable {
public static Packet read(ByteBuf buffer) throws IOException {
int id = buffer.readByte();
Packet packet = newPacket(id);
if (packet == null) throw new IOException("Bad packet ID: " + id);
packet.get(buffer);
return packet;
}
public static void write(Packet packet, ByteBuf buff) {
buff.writeByte(packet.getId());
packet.send(buff);
}
public static Packet newPacket(int id) {
try {
switch (id) {
case 1:
return PingPacket.class.newInstance();
case 2:
return AuthPacket.class.newInstance();
case 3:
return AuthResultPacket.class.newInstance();
case 4:
return SettingsPacket.class.newInstance();
case 5:
return TimePacket.class.newInstance();
case 6:
return ModulesPacket.class.newInstance();
case 7:
return UpdatePacket.class.newInstance();
case 8:
return SwitchStatePacket.class.newInstance();
}
} catch (Exception ignored) {}
return null;
}
public int getId() {
if (this instanceof PingPacket) {
return 1;
}
if (this instanceof AuthPacket) {
return 2;
}
if (this instanceof AuthResultPacket) {
return 3;
}
if (this instanceof SettingsPacket) {
return 4;
}
if (this instanceof TimePacket) {
return 5;
}
if (this instanceof ModulesPacket) {
return 6;
}
if (this instanceof UpdatePacket) {
return 7;
}
if (this instanceof SwitchStatePacket) {
return 8;
}
return 0;
}
abstract public void get(ByteBuf buffer);
abstract public void send(ByteBuf buffer);
/**
* Закрывать ли соединение по завершению отправки пакета
*/
public boolean closeConnection() {
return false;
}
/**************************************************************
* БАЗОВЫЕ МЕТОДЫ *
**************************************************************/
final protected void writeString(ByteBuf buffer, String string) {
buffer.writeShort(string.length());
for (int i = 0; i < string.length(); i++) {
buffer.writeChar(string.charAt(i));
}
}
final protected String readString(ByteBuf buffer) {
int length = buffer.readShort();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < length; i++) {
sb.append(buffer.readChar());
}
return sb.toString();
}
}
Класс пакета
public class ModulesPacket extends Packet {
private Set<Module> modules;
/**
* Не получаем от устройства
*/
@Override
public void get(ByteBuf buffer) {
}
@Override
public void send(ByteBuf buffer) {
buffer.writeShort(modules.size());
for (Module module : modules) {
buffer.writeLong(module.getId());
buffer.writeInt(module.getTypeId());
buffer.writeInt(module.getPin());
}
}
public ModulesPacket() {
}
public ModulesPacket(Set<Module> modules) {
this.modules = modules;
}
public Set<Module> getModules() {
return modules;
}
public void setModules(Set<Module> modules) {
this.modules = modules;
}
@Override
public String toString() {
return "ModulesPacket{" +
"modules=" + modules +
'}';
}
}
Спасибо.
Чем графики рисуете?
Sign up to leave a comment.
Топ 6 оптимизаций для netty