Я реализую свой DIY
IoT
.У меня есть центральный узел (сервер), который получает команды из разных источников и выполняет их.
Формат ввода:
<DEVICE_NAME>_<COMMAND> <DEVICE_NAME>_<COMMAND> <DEVICE_NAME>_<COMMAND>
<DEVICE_NAME>_<COMMAND> <DEVICE_NAME>_<COMMAND>
<DEVICE_NAME>_<COMMAND> <DEVICE_NAME>_<COMMAND> <DEVICE_NAME>_<COMMAND>
Каждая строка может содержать несколько команд.
Я реализовал сервер-исполнитель команд, который принимает команды из сеанса как InputStream
.Затем я разделяю данные и обрабатываю их:
private Device c0 = // Device constructor
private Device c1 = // Device constructor
private Device c2 = // Device constructor
private Device c3 = // Device constructor
private ExecutorService executor = Executors.newFixedThreadPool(3);
public void onConnection(InputStream in)
InputStreamReader isr = new InputStreamReader(in);
LineNumberReader reader = new LineNumberReader(isr);
String line = null;
while ((line = reader.readLine()) != null) {
String[] strings = line.split(",");
for (String raw : strings) {
String command = raw.substring(0, 3);
if (raw.startsWith("C0_")) {
executor.submit(() -> c0.execute(command));
} else if (raw.startsWith("C1_")) {
executor.submit(() -> c1.execute(command));
} else if (raw.startsWith("C2_")) {
executor.submit(() -> c2.execute(command));
} else if (raw.startsWith("C3_")) {
executor.submit(() -> c3.execute(command));
}
}
}
}
Я понимаю, что код выглядит ужасно.У вас есть идеи по улучшению?Может быть, я мог бы использовать Steam API
?Любые советы и подсказки приветствуются.
ОБНОВЛЕНИЕ
Я попытался немного очистить код, отправив задачу только один раз, но компилятор говорит, что device
должно быть final
или effectively final
, так что это не работает:
String command = raw.substring(0, 3);
Device device;
if (raw.startsWith("C0_")) {
device = c0;
} else if (raw.startsWith("C1_")) {
device = c1;
} else if (raw.startsWith("C2_")) {
device = c2;
} else if (raw.startsWith("C3_")) {
device = c3;
}
executor.submit(() -> device.execute(command));