Firebase và ESP8266 có liên quan gì nhau ? Cách để lưu dữ liệu thu thập từ ESP8266 lên database đơn giản có thể truy xuất khắp mọi nơi là gì ?

Firebase là gì ?

Firebase là một dịch vụ cơ sở dữ liệu thời gian thực hoạt động trên nền tảng đám mây được cung cấp bởi Google nhằm giúp các lập trình phát triển nhanh các ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu. Nếu cần xây dựng một ứng dụng cho mobile hoặc các thiết bị di động khác, mà bạn đang gặp khó khăn vì không biết chọn dịch vụ VPS nào, loại database gì . . . thì Firebase sẽ là dịch vụ dành cho bạn.

FireBase có thể rất mạnh mẽ đối với ứng dụng backend, nó bao gồm việc lưu trữ dữ liệu, xác thực người dùng, static hosting……Nên lập trình viên chỉ cần chú tâm đến việc nâng cao trải nghiệm người dùng.

Mình cùng điểm qua các tính năng và lợi ích của firebase xem sao

Realtime Database

  • Firebase lưu trữ dữ liệu database dưới dạng JSON và thực hiện đồng bộ database tới tất cả các client theo thời gian thực. Cụ thể hơn là bạn có thể xây dựng được client đa nền tảng (cross-platform client) và tất cả các client này sẽ cùng sử dụng chung 1 database đến từ Firebase và có thể tự động cập nhật mỗi khi dữ liệu trong database được thêm mới hoặc sửa đổi.
  • Tự động tính toán quy mô ứng dụng của bạn, giúp bạn dễ dàng hơn rất nhiều mỗi khi cần nâng cấp hay mở rộng dịch vụ. Ngoài ra Firebase sử dụng NoSQL, giúp cho database của bạn sẽ không bị bó buộc trong các bảng và các trường mà bạn có thể tùy ý xây dựng database theo cấu trúc của riêng bạn.
  • Cho phép bạn phân quyền một cách đơn giản bằng cú pháp tương tự như javascript.

Khi ứng dụng của bạn muốn phát triển, bạn không cần lo lắng về việc nâng cấp máy chủ…Firebase sẽ xử lý việc tự động cho bạn. Các máy chủ của Firebase quản lý hàng triệu kết nối đồng thời và hàng tỉ lượt truy vấn mỗi tháng.

Các tính năng bảo mật

Firebase hoạt động dựa trên nền tảng cloud và thực hiện kết nối thông qua giao thức bảo mật SSL, chính vì vậy bạn sẽ bớt lo lắng rất nhiều về việc bảo mật của dữ liệu cũng như đường truyền giữa client và server. Không chỉ có vậy, việc cho phép phân quyền người dùng database bằng cú pháp javascipt cũng nâng cao hơn nhiều độ bảo mật cho ứng dụng của bạn, bởi chỉ những user mà bạn cho phép mới có thể có quyền chỉnh sửa cơ sở dữ liệu.

Làm việc offline

Ứng dụng Firebase của bạn sẽ duy trì tương tác bất chấp một số các vấn đề về internet xảy ra. Trước khi bất kỳ dữ liệu được ghi đến server thì tất cả dữ liệu lập tức sẽ được viết vào một cơ sử dữ liệu Firebase ở local. Ngay khi có thể kết nối lại, client đó sẽ nhận bất kỳ thay đổi mà nó thiếu và đồng bộ hoá nó với trạng thái hiện tại server.

Xác thực người dùng

Với Firebase, bạn có thể dễ dàng xác thực người dùng từ ứng dụng của bạn trên Android, iOS và JavaScript SDKs chỉ với một vài đoạn mã. Firebase đã xây dựng chức năng cho việc xác thực người dùng với Email, Facebook, Twitter, GitHub, Google, và xác thực nặc danh. Các ứng dụng sử dụng chức năng xác thực của FireBase có thể giải quyết được vấn đề khi người dùng đăng nhập, nó sẽ tiết kiện thời gian và rất nhiều các vấn đề phức tạp về phần backend. Hơn nữa bạn có thể tích hợp xác thực người dùng với các chức năng backend đã có sẵn dùng custom auth tokens.

Firebase Hosting

Các bạn có thể triển khai một ứng dụng nền web chỉ với vài giây (chém gió tới từ firebase, chính mình cũng không tin lắm) với hệ thống Firebase, và các dữ liệu sẽ được lưu trữ đám mây đồng thời được bảo mật thông qua giao thức truy cập SSL.

Các ứng dụng sẽ được cấp 1 tên miền dạng *.firebaseio.com hoặc bạn có thể trả tiền để sử dụng tên miền của riêng mình.

Triểu khai siêu tốc

Với Firebase bạn có thể giảm bớt rất nhiều thời gian cho việc viết các dòng code để quản lý và đồng bộ cơ sở dữ liệu, mọi việc sẽ diễn ra hoàn toàn tự động với các API của Firebase. Không chỉ có vậy Firebase còn hỗ trợ đã nền tảng nên bạn sẽ càng đỡ mất thời gian rất nhiều khi ứng dụng bạn muốn xây dựng là ứng dụng đa nền tảng. Không chỉ nhanh chóng trong việc xây dựng database, Google Firebase còn giúp ta đơn giản hóa quá trình đăng kí và đăng nhập vào ứng dụng bằng các sử dụng hệ thống xác thực do chính Firebase cung cấp.

Sự ổn định

Firebase hoạt động dựa trên nền tảng Cloud đến từ Google vì vậy hầu như bạn không bao giờ phải lo lắng về việc sập server, tấn công mạng như DDOS, tốc độ kết nối lúc nhanh lúc chậm, … nữa.

Giá thành

Google Firebase có rất nhiều gói dịch vụ với các mức dung lượng lưu trữ cũng như băng thông khác nhau với mức giá dao động từ Free đến $1500 đủ để đáp ứng được nhu cầu của tất cả các đối tượng. Chính vì vậy bạn có thể lựa chọn gói dịch vụ phù hợp nhất với nhu cầu của mình. Điều này giúp bạn tới ưu hóa được vốn đầu tư và vận hành của mình tùy theo số lượng người sử dụng. Ngoài ra bạn còn không mất chi phí để bảo trì, nâng cấp, khắc phục các sự cố . . .

Thông tin trên mình có tổng hợp và chỉnh sửa lại một chút từ vtcacademy và techmaster.

ESP8266 có liên quan gì tới Firebase ?

Như mình đã nói ở trên firebase là cloud, nghĩa là mọi thứ có kết nối internet thì đều có thể “tương tác” với anh Firebase này. Nhìn lại thì ESP8266 của chúng ta có kết nối internet, và thật may mắn là firebase cũng có hỗ trợ cho ESP8266 luôn :D, nên có thể dùng ESP8266 để lấy dữ liệu từ cảm biến và gửi lên firebase

Làm thế nào để gửi dữ liệu và lưu vào database của Firebase dùng ESP8266 ? Mình xin đi vào ví dụ cụ thể luôn

À anh em nào chưa biết gì về ESP8266 ứng dụng trong IOT mình coi qua bài giới thiệu này nhé.

Chuẩn bị

  1. Phần cứng: ESP8266, ở đây mình dùng NodeMCU
  2. Phần mềm: Arduino IDE 1.6.12
  3. Thư viện firebase https://github.com/hocarm/firebase-arduino
  4. Thư viện Arduino Json 5.x https://github.com/bblanchon/ArduinoJson

Các bạn lưu ý mình up thư viện chạy ok lên github của hocarm để các bạn có thể tiện sử dụng, trường hợp firebase thay đổi liên tục các bạn lấy thư viện mới nhất là thư viện trên Firebase Arduino về sử dụng xem có lỗi ko nhé

Tạo tài khoản

Việc tạo tài khoản khá đơn giản, bạn chọn Get Started for free hoặc ấn vào đăng nhập, dùng tài khoản google của mình là xong

Tạo một project mới

Ví dụ 1

Tạo dữ liệu trong database

Bước 0: Tạo database mới tại thẻ database, lưu ý sử dụng Realtime database nha các bạn

Bước 1: Chỉnh rule cho Database cho phép ai cũng có thể ghi vào, chỉnh null thành true, sau đó publish để lưu lại

Bước 2: Lập trình trên ESP8266

#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define FIREBASE_HOST "hocarm1.firebaseio.com" //Thay bằng địa chỉ firebase của bạn
#define FIREBASE_AUTH ""   //Không dùng xác thực nên không đổi
#define WIFI_SSID "ten_wifi"   //Thay wifi và mật khẩu
#define WIFI_PASSWORD "mat_khau"

void setup() {
  Serial.begin(9600);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
  Firebase.setFloat("led", 0);

  int i = 0;
  for (i = 0; i < 10; i++) {
    Firebase.setFloat("led", i);
    // handle error
    if (Firebase.failed()) {
      Serial.print("setting /number failed:");
      Serial.println(Firebase.error());
      return;
    }
    Serial.println(i);
    delay(200);
  }
}

Trong chương trình có phần cần phải thay đổi

#define FIREBASE_HOST "hocarm1.firebaseio.com" //Thay bằng địa chỉ firebase của bạn
#define FIREBASE_AUTH ""; //Không dùng xác thực nên không đổi
#define WIFI_SSID "ten_wifi"; //Thay wifi và mật khẩu
#define WIFI_PASSWORD "mat_khau"

Với chương trình trên sẽ tự tạo trong database giá trị led thay đổi từ 0-9

Bước 4: Kết quả trong thẻ Data

Bạn có thể mở terminal của Arduino ra để so sánh giá trị với database

Ví dụ 2

Dùng ESP đọc/ghi/xóa nhiều dữ liệu

Bước 1: Mình sửa lại rule trong Database là ".read": "true", để có thể đọc giá trị từ database

Bước 2: Chương trình ghi đọc nhiều dữ liệu lên database

//
// Copyright 2015 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// FirebaseDemo_ESP8266 is a sample that demo the different functions
// of the FirebaseArduino API.

#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>

// Cấu hình.
#define FIREBASE_HOST "hocarm1.firebaseio.com"  //Đổi lại nhé
#define FIREBASE_AUTH ""
#define WIFI_SSID "ten_wifi"
#define WIFI_PASSWORD "mat_khau"

void setup() {
  Serial.begin(9600);

  // Két nối wifi.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}

int n = 0;

void loop() {
  // Set giá trị lưu vào db
  Firebase.setFloat("number", 42.0);
  // Kiểm tra lỗi
  if (Firebase.failed()) {
      Serial.print("setting /number failed:");
      Serial.println(Firebase.error());  
      return;
  }
  delay(1000);
  
  // Cập nhật giá trị
  Firebase.setFloat("number", 43.0);
  // Kiểm tra lỗi
  if (Firebase.failed()) {
      Serial.print("setting /number failed:");
      Serial.println(Firebase.error());  
      return;
  }
  delay(1000);

  // Lấy giá trị
  Serial.print("number: ");
  Serial.println(Firebase.getFloat("number"));
  delay(1000);

  // Xóa giá trị
  Firebase.remove("number");
  delay(1000);

  // Thêm chuỗi
  Firebase.setString("message", "hello world");
  // Kiểm tra lỗi
  if (Firebase.failed()) {
      Serial.print("setting /message failed:");
      Serial.println(Firebase.error());  
      return;
  }
  delay(1000);
  
  // Thêm giá trị bool
  Firebase.setBool("truth", false);
  // Kiểm tra lỗi
  if (Firebase.failed()) {
      Serial.print("setting /truth failed:");
      Serial.println(Firebase.error());  
      return;
  }
  delay(1000);

  // Lưu log
  String name = Firebase.pushInt("logs", n++);
  // Kiểm tra lỗi
  if (Firebase.failed()) {
      Serial.print("pushing /logs failed:");
      Serial.println(Firebase.error());  
      return;
  }
  Serial.print("pushed: /logs/");
  Serial.println(name);
  delay(1000);
}

Chương trình này sẽ thực hiện các nhiệm vụ

  • Lưu giá trị float number vào db
  • Cập nhật giá trị number vào db
  • Lấy giá trị number từ db hiển thị ra terminal
  • Thêm chuỗi hello world vào db
  • Thêm giá trị kiểu bool vào db
  • Lưu lại log vào db
  • Kiểm tra lỗi

Bước 3: Kết quả trực quan cho mọi người dễ theo dõi

Ví dụ 3

Xác thực vào database

Ở 2 ví dụ trên mình mở quyền read write cho ai cũng có thể ghi dữ liệu vào, việc này thuận tiện trong quá trình học và debug, tuy nhiên nhược điểm lớn nhất là ai cũng có thể truy xuất vào database của mình, điều này thì quá là nguy hiểm. Giờ mình muốn khắc phục thì phải làm sao ?

Bước 1: Chỉnh lại rule trong database về nguyên gốc

Bạn có thể thấy sau khi chuyển về null thì sẽ có thông báo từ terminal là lỗi, đây là lỗi không kết nối được vào database

Bước 2: Lấy Database Secrets

Bước 4: Thêm mã này vào code ở trên phần #define FIREBASE_AUTH "" là xong

Bước 5: Build và nạp lại vào ESP8266 và xem lại kết quả

Tạm kết

Thế là đã tạm xong firebase với ESP8266, mình có thể lưu được các giá trị lên database theo một cách đơn giản nhất, có xác thực và bảo mật nên vô cùng yên tâm. Hi vọng sẽ giúp ích cho các bạn.