WiFi - Serwer REST API cz16

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:

schemat

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.

Monitor portu szeregowego

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

zapytanie

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/.