ESP8266 ile AWS Lambda ve API Gateway kullanımı

ESP8266 ile uygulama geliştirmeye başladıktan bir süre sonra ister istemez kendi yazdığınız ya da hazır yazılmış olan web servislerine erişmek isteyeceksiniz. ESP8266, kendi başına bir web sunucusu olarak kullanılabilir. Ancak gerek hızı gerekse de hafızası açısından kimi durumlarda bu iş için yeterli olmayabilir elbette.

Bir web sayfasının tüm içeriğini okuyup belirli kısımlarını ayrıştırmak istediniz diyelim. Mesela IMDB'nin ana sayfasından "Box Office" listesini çekip OLED ekrana yazdırmak istediniz. Bunun için tüm sayfa içeriğini okuyup sayfa içeriğinden Box Office yazan yerin konumunu bulmak gerekiyor. Bu, ESP8266 için oldukça zahmetli bir işlemdir. Teorik olarak mümkündür yapılabilir, ancak bu tip ağır işlem yükü gerektiren işleri bir sunucuda (back-end) yapmak daha akıllıca olacaktır. Bu durumda ESP8266'yı istemci (front-end) gibi düşünebiliriz. 8266'nın JSON gibi hazır işlenmiş veriler üzerinde çalışması daha uygundur.

Çoğu durumda yapmak istediğimiz işi yapan bir API bulabiliriz. Bunların çoğu ya tamamen ücretsiz ya da belirli bir kotanın -ki bu kota genellikle hobi geliştiricisinin ihtiyacından çok daha fazladır- altında ücretsizdir. Örneğin Omdb Rest API kullanarak tüm filmler hakkında bilgileri IMDB'den bağımsız olarak elde edebiliriz. Ancak ya böyle bir API yoksa ya da yaptığımız iş, hobiden öte standard dışı bir görev ise. Bu durumda iş başa düşüyor. Kendi API'ımızı kendimiz yazacağız.

Kendi API'ımızı yazmak demek kendimize ait bir sunucuya sahip olmak demektir. Bu da en azından aylık 5-10 dolarlık bir masraf ve gereksiz bir uğraş demek. Ancak Amazon'un Lamda servisini kullanırsak böyle bir şeye ihtiyacımız kalmaz. Ayrıca çok çok büyük ihtimalle bu işlem için herhangi bir ücret ödememize gerek yok. İlk 1 milyon işlem istek için AWS Lambda yalnızca free-tier kullanıcıları için değil, herkes için ücretsiz.

Son bir ayrıntı daha var. Genellikle API servisleri HTTPS üzerinden çalışır. Bu da demektir ki bağlantımızı WifiClientSecure kütüphanesini kullanarak kurmamız gerekiyor. İnternet'te gördüğüm pek çok örnekte WifiClient kütüphanesi kullanılmış. Bu örnekleri https üzerinden kullanamazsınız. İsteklerimizi 443 portuna göndermemiz gerekiyor. O halde yapmamız gerekenleri sıralayalım:

  1. AWS Lambda
  2. AWS API Gateway
  3. ESP8266 ile HTTPS isteği göndermek

Bu örnekte surf-forecast.com adresinden, sörf noktalarındaki rüzgar ve dalga durumlarını alan ve JSON formatına çeviren bir fonksiyon hazırladım. Ancak aynı mantık GET isteği ile elde edebileceğiniz her türlü veri için kullanılabilir. Elde ettiğimiz JSON'ı ESP8266 üzerinde kolaylıkla kullanıp OLED ekrana yazdırabiliriz.

Öncelikle AWS Lamda üzerinde fonksiyonumuzu hazırlayalım. SurfReport adı ile NodeJS 6 fonksiyonu oluşturdum. Buradaki örnek haliyle surf-forecast sitesinin dizaynı ile sıkı bir şekilde ilişkide. Eğer bir gün bu sayfanın dizaynı değişirse, servisimizin de değişmesi gerekecek. Ancak, bu işlem için paralı servisleri kullanmak istemediğimden kendi servisimi güncellemek benim için çok daha kolay.

Kısaca ne yaptığımızı açıklayalım. Lambda, surf-forecast'e GET isteği göndererek sayfa içeriğini okuyor. Sayfa içerisinde; dalganın kalitesi, büyüklüğü ve rüzgarın yönünün yazdığı kısımları bularak bir değişkene atıyor ve bu değişkenleri JSON olarak geri döndürüyor. Örneğin aşağıdaki örnek için "North-Piha"'yı kullandım. Dolayısıyla bu kısmı Querystring değişkeni olarak alırsak istediğimiz her nokta için ESP8266 içinden istek gönderebiliriz.

http://www.surf-forecast.com/breaks/North-Piha/forecasts/latest/six_day

Lambda fonksiyonumuzu hazırladıktan sonra, dış dünyaya açmamız gerekiyor. "Triggers" üzerinden "API Gateway" seçerek yeni bir API yaratalım. Burada önemli olan nokta "Integration Request" kısmında "Use Lambda Proxy integration"'ın seçili olması gerektiğidir. Tüm işlemleri yaptıktan sonra Invoke URL hazır hale gelecek. BU URL'i ESP8266 içerisinden kullanabileceğiz.

ESP8266 için Arduino arayüzü kullanılarak hazırlanan kodlarımız:

OLED ile bağlantımızı aşağıdaki gibi yaptıktan sonra sonuç almaya başlayabiliriz:

OLED - ESP8266 bağlantısı

Sonuçlar:

Sonuçlar-1
Sonuçlar-2