ESP8266 và IOT (Part 3): Kết nối ESP8266 với IBM Bluemix

download

IBM Bluemix

Trong tutorial trước tôi đã hướng dẫn các bạn về MQTT protocol và cho bạn thấy được cách sử dụng nó với ESP8266. Mặc dù chúng tôi phát triển trên một ứng dụng đơn giản, nhưng hy vong sẽ giúp bạn thấy được những tiềm năng của MQTT.

Trong một vài bài tiếp theo, chúng tôi sẽ sử dụng một platform là IBM Bluemix để xây dựng nhưng ứng dụng IoT phức tạp hơn.

Vậy IBM Bluemix là cái gì?

IBM Bluemix là một cloud platform như một service (PaaS), nghĩa là nó cho phép khách hàng có thể phát triển, chạy và quản lý các ứng dụng mà không cần phải xây dựng và bảo trì phức tạp nào trong toàn bộ hạ tầng liên quan tới việc phát triển ứng dụng. Lý do chúng ta đang sử dụng nó để đưa ra những IoT services – chúng ta có thể dễ dàng kết nối và quản lý thiết bị chúng ta. Thêm một điểm nữa, có rất nhiều các services khác mà chúng ta có thể dễ dàng kết nối thiết bị chúng ta vào, cho phép nhanh chóng phát triển những hệ thống phức tạp một cách thuận tiện. Ví dụ như một kỹ sư điện tử và ai đó không có kinh nghiệm trong việc phát triển web/cloud, tôi tìm được IBM Bluemix như một platform hết sức tuyệt vời cho việc xây dựng những ứng dụng mà không yêu cầu bạn tốn nhiều thời gian để học những thứ mới từ đầu. Thay vào những giới hạn triển khai ý tưởng hoặc tuyệt vọng khi nhờ một ai đó, với IBM Bluemix bạn có thể làm rất nhiều thứ tuyệt vời. Ví dụ, tôi cần hiển thị tất cả các thiết bị trên một bản đồ, có thể lấy những giá trị cụ thể của cảm biến bằng cách click vào một marker trên bản đồ hiển thị thiết bị của tôi, bạn dễ dành nhanh chóng phát triển chúng với IBM Bluemix và tôi sẽ cho bạn biết làm cách nào làm được trong những series tutorials này.

Để bắt đầu xây dựng ứng dụng, bạn phải tạo một account. Vào https://console.ng.bluemix.net/ và đăng ký. Bạn có thể sử dụng IBM Bluemix hoàn toàn miễn phí trong 30 ngày. Sau đó bạn phải add credit card của bạn vào, bạn sẽ không bị thu phí trừ khi bạn vượt ngưỡng giới hạn, nó đủ nếu bạn chỉ chơi và thử những ý tưởng của bạn và bạn vẫn chưa có kế hoạch sửa dụng nó cho mục đích thương mại. Để biết thêm thông tin về giá bạn click vào đây.

Sau khi tạo một account, đăng nhập. Điều đâu tiên bạn đăng nhập là một cửa sổ hỏi bạn thiết lập môi trường (environment) để hiển thị.

Setting up environment
Setting up environment

Tên tổ chức của bạn (dự án hoặc team mà chia sẻ tài nguyên, như apps, databases, và những service khác) và chọn vùng (vị trí địa lý nơi tổ chức của bạn). Với region thì chọn US South bởi vì có một vài tính năng chúng tôi sẽ được hỗ trợ chỉ trong vùng này. New organizations có thể được nhập vào sau nếu cần thiết. Bây giờ bạn phải chọn space name, ví dụ như dev. Sau khi thiết lập environment, bạn đã sẵn sàng để sử dụng IBM Bluemix.

Nếu bạn vào Dashboard, trong space của bạn có thể thấy tất cả các ứng dụng bạn tạo ra và tất cả các services, các container và server ảo mà bạn chọn để dùng.

Main dashboard
Main dashboard

Bạn chưa tạo bất cứ thứ gì ở đây. Dưới Catalog tab, bạn có thể thấy rất nhiều các option để phát triển, những service khác nhau (Boilerplates, Data, Mobile, third party…) bạn có thể dùng để xây dựng rất nhiều dự án lớn.

Catalog
Catalog

IoT Platform

Phía bên dưới, bạn sẽ thấy vùng Internet of Things. Click vào Internet of Things Platform

Chọn free plan, nó có những giới hạn nhất định nhưng nhiều hơn những gì chúng ta cần bây giờ. Service này sẽ không ràng buộc vì chúng ta chưa có bất cứ app nào. Sau nó, khi chúng ta bắt đầu build ứng dụng chúng ta sẽ kết nối service này với nó và chúng ta sẽ khám phá các tính năng của nó. Click create

Create IoT platform
Create IoT platform

Nếu bạn quay trở lại main dashboard, bạn nên xem Internet of Things Platform phía dưới những service.

Chúng ta muốn kết nối các thiết bị chúng ta với Bluemix. Để làm điều này, bạn chạy Internet of Things Platform dashboard.

Launch IoT Platform dashboard
Launch IoT Platform dashboard

Trên phía trái của dashboard, click devices.

Go to Devices
Go to Devices
Click Add Device
Click Add Device

Bạn có thể chọn để add một device mới hoặc tạo một loại device. Vì chúng ta chưa có bất cứ loại device nào được tạo, chúng ta phải tạo một cái. Chúng ta gọi nó là loại ESP8266.  Chúng ta phải làm điều này một lần cho mỗi loại device. Sau khi tạo loại device này và đặt tên là ESP8266. Description nếu cần thiết. Click next. Có một vài trường (serial number, manufacturer, module…) bạn có thể chọn nhưng nó không phải bắt buộc. Tiếp tục cho tới khi bạn có thể click vào nút Create. Chúng ta vẫn chưa thêm bất cứ thiết bị cụ thể nào vào, chung ta chỉ vừa tạo ra một bản mẫu, một loại thiết bị, chúng ta phải chọn mỗi lần tạo một thiết bị mới. Bây giờ chọn loại ESP8266 và click next. Chúng ta cần thêm một device ID. Device ID nên là MAC address của module ESP8266. Để lấy được địa chỉ, bạn sử dụng chương trình này:

#include <ESP8266WiFi.h>

void setup() {
  Serial.begin(115200);
  String clientMac = "";
  unsigned char mac[6];
  WiFi.macAddress(mac);
  clientMac += macToStr(mac);
  Serial.println();
  Serial.println(clientMac);
}

String macToStr(const uint8_t* mac){
 String result;
   for (int i = 0; i < 6; ++i) {
    result += String(mac[i], 16);
   if (i < 5)
    result += ':';
 }
 return result;
}

void loop() {

}

Sau khi thêm một device ID, tất cả các ký tự nên viết hoa và loại bỏ các dấu phẩy, ví dụ: 18FE34D81E46. Nếu bạn muốn, có thể điền thêm các trường về manufacturer, module … và tiếp tục. Bạn có thể tránh metadata và click next 2 lần. Bạn nên xem tổng kết (summary) của thiết bị.

Add your ESP8266 device
Add your ESP8266 device

Click Add. Cửa sổ xuất hiện rất quan trọng. Bạn phải copy authentication token, vì bạn sẽ không thể truy cập nó bất cứ điều gì, sau đó bạn đóng cửa sổ lại! Copy tất cả các parameters bởi vì bạn sẽ cần chúng trong code.

Copy these strings
Copy these strings

Bạn đã thêm một thiết bị mới và bạn nên xem nó trong dashboard

List of all your devices
List of all your devices

Bạn có thể đang ký tới 20 thiết bị cho free plan của Internet of Things Platform.

Publishing Events đến Bluemix

Bạn đã sẵn sàng kết nối với thiết bị vật lý của mình (module ESP8266) đến Bluemix. Chúng ta sẽ sử dụng chung thư viện và code như bài tutorial trước. Điểm khác biệt là lúc này có một security protection và chúng ta phải cung cấp authentication token. Đầu tiên, thiết bị của bạn sẽ là publisher. Chúng ta sẽ set counter và publish giá trị của nó và chu kỳ đều đặn. Cập nhật theo code và các paramenter bạn vừa lưu và upload nó vào ESP8266. Đồng thời, đừng quên thêm SSID và password cho kết nối WI-FI.

#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient/releases/tag/v2.3

//-------- Customise these values -----------
const char* ssid = "";
const char* password = "";

#define ORG "<yourOrganization>"
#define DEVICE_TYPE "ESP8266"
#define DEVICE_ID "<yourDeviceID>"
#define TOKEN "<yourToken>"
//-------- Customise the above values --------

char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

WiFiClient wifiClient;
PubSubClient client(server, 1883, NULL, wifiClient);

void setup() {
 Serial.begin(115200);
 Serial.println();

 Serial.print("Connecting to "); Serial.print(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 } 
 Serial.println("");

 Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP());
}

int counter = 0;

void loop() {

 if (!client.connected()) {
 Serial.print("Reconnecting client to ");
 Serial.println(server);
 while (!client.connect(clientId, authMethod, token)) {
 Serial.print(".");
 delay(500);
 }
 Serial.println();
 }

 String payload = "{\"d\":{\"Name\":\"18FE34D81E46\"";
 payload += ",\"counter\":";
 payload += counter++;
 payload += "}}";
 
 Serial.print("Sending payload: ");
 Serial.println(payload);
 
 if (client.publish(topic, (char*) payload.c_str())) {
 Serial.println("Publish ok");
 } else {
 Serial.println("Publish failed");
 }

 delay(5000);
}

Hãy xem tại chuỗi topic. Evt tham chiêu với sự kiện (event), nó có nghĩa là chúng là những publishing event. Chúng ta cũng có thể nhập cmd để lệnh. Các kết thúc chuỗi với fmt/json có nghĩa là dữ liệu được publish trong json format. Nếu chúng ta muốn publish dữ liệu như một chuỗi riêng, chúng ta có thể đặt fmt/String. Sau khi bạn upload code, tìm thiết bị bạn đã thêm trong IoT Platform dashboard và click vào nó. Bạn nên xem những sự kiện dưới vùng Recent Event nếu thiết bị của bạn được publish giá trị counter thành công.

Published events
Published events

Nếu bạn có thể coi các event đến từ các chu kỳ đều đặn, chúng mừng, bạn đã kết nối thành công thiết bị với IBM Bluemix.

Tạo một App với Node-RED

Làm gì bây giờ? Lúc này, chúng ta có thể xác nhận rằng thiết bị của bạn kết nối với Bluemix và publish vài dữ liệu chúng ta thấy trong event list, nhưng chúng ta không làm được gì nhiều hơn nữa. Chúng ta muốn sử dụng dữ liệu, lưu trữ nó, vẽ đồ thị, thiết lập các trigger và act với nó. Đó là tại sao chúng ta sẽ build một ứng dụng.

Trong main dashboard, click Create App và chọn Web.

Create app
Create app

Bạn có thể thấy là Bluemix hỗ trợ một vài ngôn ngữ lập trình. Chúng ta sẽ build ứng dụng của bạn sử dung NodeRed. Nó là một tool trực quan để nối các thiết bị phần cứng với nhau, APIs và các online service. Đầu tiên hãy build ứng dụng của bạn và sau đó bạn sẽ có một Node-Red trong sáng hơn. Click vào browse boilderplates và chọn Node-Red Starter. Nhập tên ứng dụng của bạn và click tạo. Sau một lúc, nếu moi thứ ok, ứng dụng của bạn sẽ chạy. Neu bạn vào main dashboard, bạn nên xem ứng dụng của bạn được liết kê phía dưới các dứng dụng. Nếu click lên nó, bạn sẽ xem app status, memory còn trống, các service liên quan… Lưu ý rằng Cloudant Database service liên kết tới của ứng dụng của bạn một cách mặc định.

App overview
App overview

Bạn có thể truy cập ứng dụng của bạn bằng cách click vào link <app name>.mybluemix.net (http://esp8266iot.mybluemix.net trong trường hợp của tôi). Click vào link và mở Node-Red flow editor. Trên vùng bên trái, bạn có thể thấy các node được chia trong một vài categories (input, output, function, storage…) Các Node build các block của ứng dụng chúng ta. Chúng ta đặt chung vào editor và nối chúng để tạo ra một flow. Bạn có thể có nhiều flow trong một editor. Sau khi chúng ta hoàn thành việc kết nối các node, chúng ta click Deploy button trong góc phải bên dưới. Ví dụ, flow có thể đơn giản nhất như sau:

Simple flow
Simple flow

Inject và debug node nối với nhau. Double click vào trong jnject node để thiết lập nó. Chọn chuỗi như loại payload và nhập payload tùy ý, ví dụ “Hello World”. Mỗi lần bạn click vào inject, chuỗi bạn nhập vào được hiện thị trên debug console (để xem debug console, click debug dưới Deplou button).

Đây là flow phức tạp hơn. Chúng ta thêm vào một function node với JavaScript code để thống kê giá trị input.

Simple flow with function node
Simple flow with function node

Giờ bạn đã nắm được ý tưởng. Bạn chọn các node và kết nối chúng để build các flow chức năng của ứng dụng của bạn.

Làm cách nào bạn xem dữ liệu đến từ các thiết bị với app? Có một node gọi là IBM IoT node trong các input node, nhưng trước khi chúng ta sử dụng nó, chúng ta cần nối Internet of Things Platform service đến app của chúng ta. Vào status page của app (từ main dashboard), click Bind một Service hoặc một API, check Internet of Things Platform service, click Add và chạy lại (restage) ứng dụng.

Bind IoT Platform to your app
Bind IoT Platform to your app

Sau khi tiến hành restaging hoàn thành, bạn đã sẵn sàn sử dụng các IoT node. Hãy quay lại Node-Red editor. Để bắt đầu, chúng ta sẽ tạo một flow đơn giản nhất có thể – một IoT input node và debug node được nối với nhau. Sau đó, chúng ta sẽ thêm fucntion, storage và nhiều node nữa.

Flow with IoT In node
Flow with IoT In node
Configure IoT In node
Configure IoT In node

Thay thế device ID với ID của module ESP8266. Trường Input type phải tương ứng với code. Vì chúng ta đặt evt trong topic, chúng ta phải chọn Device Event. Chạy ứng dụng. Nếu bạn có thể thấy các published event trong IoT Platform dashboard, giống như khái báo (described) trước đó, bạn nên xem những published envent trong debug console.

Debug console with published events
Debug console with published events

Gửi Commands đến ESP8266

Nếu bạn muốn thiết bị được đăng ký (subscribe) đên một topic nhất định vào nhận lệnh từ Bluemix, chúng ta phải sử dung IBM output node. Lúc này cũng sẽ tạo một flow rất đơn giản:

Flow with IoT Out node
Flow with IoT Out node

Mỗi lần chúng ta nhấn inject node, một chuỗi đặc tả (command 1) được gửi đến ESP8266 và được in ra trong serial monitor với callback function. Thiết lập của IBM IoT output node phải tương ứng với topic.

Configure IoT Out node
Configure IoT Out node

Upload code dưới đây:

#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient/releases/tag/v2.3

const char* ssid = "";
const char* password = "";

#define ORG "<yourOrganization>"
#define DEVICE_TYPE "ESP8266"
#define DEVICE_ID "<yourDeviceID>"
#define TOKEN "<yourToken>"

char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/cmd/test/fmt/String";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient);

void setup() {
  Serial.begin(115200);
  Serial.println();
  wifiConnect();
  mqttConnect();
}

void loop() {
  if (!client.loop()) {
    mqttConnect();
  }
}

void wifiConnect() {
  Serial.print("Connecting to "); Serial.print(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("nWiFi connected, IP address: "); Serial.println(WiFi.localIP());
}

void mqttConnect() {
  if (!client.connected()) {
    Serial.print("Reconnecting MQTT client to "); Serial.println(server);
    while (!client.connect(clientId, authMethod, token)) {
      Serial.print(".");
      delay(500);
    }
    initManagedDevice();
    Serial.println();
  }
}

void initManagedDevice() {
  if (client.subscribe(topic)) {
    Serial.println("subscribe to cmd OK");
  } else {
    Serial.println("subscribe to cmd FAILED");
  }
}

void callback(char* topic, byte* payload, unsigned int payloadLength) {
  Serial.print("callback invoked for topic: "); Serial.println(topic);

  for (int i = 0; i < payloadLength; i++) {
    Serial.print((char)payload[i]);
  }
}

Trong tutorial này bạn đã học làm cách nào để cài đặt một Bluemix environment, sử dụng Internet of Things service để kết nối thiết bị và trao đổi dữ liệu thông qua sử dung Node-Red editor. Mặc dù chúng ta build những flow khá đơn giản cho app, nhưng chung rất quan trọng vì chung là nền tảng của các project về sau.

Các bài cùng Series

(Part 1): Làm quen với ESP8266
(Part 2): ESP8266 với MQTT
(Part 3): Kết nối ESP8266 với IBM Bluemix
(Part 4): Dùng Cloudant DB trong IBM Bluemix để lưu trữ dữ liệu
(Part 5): Gửi Email và SMS thông báo khi bị trigger từ dữ liệu cảm biến
(Part 6): Hiển thị dữ liệu cảm biến với IBM Bluemix
(Part 7): Vị trí Devices trên Map
(Part 8): Nhận Motion Alarm Notifications trong Slack
(Part 9): Điều khiển thiết bị trong nhà bằng Slack

Tham khảo: Codingo

Comments

linhkienbachkhoa

Comments