Jest w trakcie pisania aplikacji IoT za pomocą której, można sterować urządzeniami (Arduino, esp8266 itd.), bądź odczytywać różne pomiary.
Backend to: Spring boot, REST, JPA, WebSocket
Frontend to: JSP + JQery (Ajax).
Aktualny stan:
Mikrokontrolery łączą się z serwerem używając websocketów.
Do każdego urządzenia przypisany jest indywidualni użytkownik.
Następnie rejestrują się jeśli nie ma ich w bazie i co 500ms wysyłają wiadomość.
Poniżej przykładowa wiadomość microkontrollera do backendu:
{
"id":"OUTDOOR1",
"label":"Arduino mini pro",
"type":"INDOOR",
"lastSeen":"2019-04-27T22:07:11.566Z",
"internalIP":null,
"modules":[
{
"type":"switch",
"id":4,
"internalId":0,
"label":"Pokój Marcina: światło",
"isOn":false
},
{
"type":"switch",
"id":5,
"internalId":1,
"label":"Pokój Marcina: lampka",
"isOn":true
},
{
"type":"temperatureSensor",
"id":6,
"internalId":1,
"label":"Termometr_1",
"temperature":34.22
},
{
"type":"humiditySensor",
"id":7,
"internalId":2,
"label":"Wilgotoność pow.",
"humidity":55.0
},
{
"type":"switchDim",
"id":8,
"internalId":1,
"label":"Pokój Marcina: lampka",
"isOn":true,
"dim":50
}
]
}
Rejestracja i aktualizacja odbywa się w następujący sposób:(otrzymana wiadomość od mikrokontrolera poprzez WebSocket )
@MessageMapping("/microcontroller")
public void handleReading(Microcontroller inbound) {
Optional<Microcontroller> found = microcontrollerRepository.findById(inbound.getId());
if (!found.isPresent()) {
inbound.getModules().forEach(m -> moduleRepository.save(m));
inbound.setLastSeen(Instant.now());
Microcontroller saved = microcontrollerRepository.save(inbound);
log.info("Microcontroller has been saved: " + saved.toString());
} else {
List<Module> modules = found.get().getModules();
List<Module> incomingModules = inbound.getModules();
if (incomingModules.size() > modules.size()) {
throw new MoreModulesThanExpectedException(incomingModules.size(), modules.size());
}
modules.forEach(m -> moduleRepository.save(m.update(incomingModules.stream()
.filter(i -> i.getInternalId().equals(m.getInternalId())).findFirst().get()
)
));
found.get().setLastSeen(Instant.now());
Microcontroller saved = microcontrollerRepository.save(found.get());
log.info("Microcontroller has been updated: " + saved.toString());
}
}
Niżej screenshoot kawałka strony www:
###Aktualnie aktualizacje parametrów mikrokontrolera wygląda następująco.
Z racji tego, że WebScoket pozwala na komunikację dwustronną, backend wysyła wiadomość(np. obiekt Switch ) do mikrokontrolera z nowym stanem modułu (np. przełącznik).
Tak jak wspomniałem microkontroller wysyła co 500ms powyższy JSON do aplikacji i dopiero wtedy następuje wysłanie wiadomości zwrotnej.
###W przypadku wciśnięcia przycisku on/off:##
Wysyłam za pomocą Ajax żądanie http z wiadomością do backend'u, następnie wiadomość jest przekazywana do mikrokontrollera za pomocą websocket'ów.
Problem mam w tym miejscu.
Nie wiem, w jaki sposób wyłapać to, że wiadomość została faktycznie przekazana do mikrokontrollera.
Kod odpowiedzi http dostanę 200, ale wiadomości wysyłane są docelowo przez websocket'y.
###Proszę was o pomysły, w jaki sposób byście to rozwiązali.
Jest to projekt hobbystyczny
Fajnie, gdyby ktoś wypunktował przejścia np.
F: Frontend
M: Micocontroller
B: Backend
- F:Wysłanie zadania http przez ajax
- B:W rest kontrolerze wysłanie wiadomości przez webscoket
..... - F:Po kliknięciu w przycisk on/off, zablokować go.
- B: W przypadku dostania wiadomości zwrotnej zaktualizować dane w bazie
itd.
- screenshot-20190505134334.png (17 KB) - ściągnięć: 92