REST API to serwer, który odpowiada na zażądania od klienta. Obrazując działanie można porównać je do pracy kelnera. Jego zadaniem jest dostarczenie tego co zażąda (Request) klient. Jedzenie z kuchni to natomiast dane, które wracają w postaci odpowiedzi (Response). Tworząc takie api umożliwiamy łatwą integracje innym urządzeniom z serwerem.
Zadanie
Stwórz serwer Rest Api na Arduino z wykorzystaniem biblioteki eREST. Serwer powinien odczytywać dane z czujnika i zwracać dane w postaci JSON. Budując serwer REST API na Arduino pomocna będzie biblioteka eREST, o której więcej można się dowiedzieć na stronie http://arest.io/.
Do zbudowania użyję:
- Czujnik BMP180
- Arduino MKR1010 wifi
- Schemat połączenia:

Kod programu:
#include <WiFiNINA.h>
#include <aREST.h>
#include <Adafruit_BMP085.h>
char ssid[] = "SSIDSSID"; // SSID Twojej sieci WiFi
char pass[] = "HasloHaslo"; // Hasło Twojej sieci WiFi
int status = WL_IDLE_STATUS; // status połączenia
WiFiServer server(80); // Port serwera
aREST rest = aREST(); // Utwórz instancję aREST
Adafruit_BMP085 bmp; // Utwórz instancję bmp
// Zmienne, które mają być wystawione w API
float temperature;
int pressure;
// Zmienne, które zapisują czas i interwal odświeżania danych
unsigned long timer = 0;
int interval = 5000;
void setup() {
Serial.begin(9600);
delay(2000);
bmp.begin(); // Rozpoczęcie pracy czujnika bmp
// Inicjuj zmienne i wystawiaj je w REST API
rest.variable("temperature",&temperature);
rest.variable("pressure",&pressure);
// Podaj nazwę i ID urządzenia (ID powinno mieć 6 znaków)
rest.set_id("001");
rest.set_name("Pokoj_1");
enable_WiFi(); // Sprawdź moduł WiFi
connect_WiFi(); // Próba połączenia z siecią Wi-Fi
server.begin(); // Start serwera
printWifiStatus(); // Wyświetl status serwera w monitorze portu szeregowego
}
void enable_WiFi() {
// Sprawdź moduł WiFi:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Komunikacja z modułem WiFi sie nie powiodła!");
// nie kontynuuj
while (true);
}
// Sprawdź wersje
String fv = WiFi.firmwareVersion();
if (fv < "1.0.0") {
Serial.println("Zaktualizuj oprogramowanie");
}
}
void connect_WiFi() {
// Próba połączenia z siecią Wi-Fi:
while (status != WL_CONNECTED) {
Serial.print("Proba połaczenia z SSID: ");
Serial.println(ssid);
// Połącz się z siecią WPA/WPA2. Zmień tę linię, jeśli używasz sieci otwartej lub WEP:
status = WiFi.begin(ssid, pass);
delay(10000); // Poczekaj 10 sekund na połączenie:
}
}
void loop() {
WiFiClient client = server.available(); // pobiera dane klienta połączonego
if ((millis() - timer) >= interval || timer == 0){
// jeśli od ostatniego połączenia minęło 5 sekund,
timer = millis(); // zanotuj czas nawiązania połączenia:
// pobierz dane z czujnika
temperature = bmp.readTemperature();
pressure = bmp.readPressure();
// wyświetl
Serial.println("");
Serial.print(temperature);
Serial.print(", ");
Serial.print(pressure);
}
rest.handle(client); // Uchwyt klienta
}
void printWifiStatus() {
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
Po przesłaniu programu na płytkę otrzymamy w monitorze portu szeregowym informacje o polaczeniu oraz dane pobrane z czujnika odświeżające się w interwale co 5 sekund.

Wykonując zapytanie z komputera (np. otwierając stronę lub za pomocą programu Postman) otrzymujemy w odpowiedzi dane w postaci JSON:

Nasze Api zwróciło dane z czujnika (temperaturę, pressure) oraz dane z informacjami o urządzeniu i połączeniu (id, name, hardware, connected).
Pokazałem ci jak łatwo stworzyć proste API, które obsługuje proste zapytania bez parametrów. Bibliotek umożliwia wiele więcej innych ciekawych rozwiązań, które możesz poznać na stronie http://arest.io/.
