Pull to refresh

Comments 6

Спасибо за статью!

Расскажите, пожалуйста, а как у вас в проекте реализован протокол общения между устройством и сервером?
Я некоторое время назад тоже писал сервер на 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 +
                '}';
    }
}


Спасибо.
У меня нечто похожее. Pipeline. Decoder. Encoder.

А вообще рекомендую Вам просто скачать исходники и проглянуть в IDE. Так будет проще.
Даже не знал, что можно посмотреть исходники! Спасибо!!
Не за что. Если возникнут вопросы — буду рад ответить.
Это не я. Это Digital Ocean.
Sign up to leave a comment.

Articles