Thứ Sáu, 14 tháng 7, 2017

IOT qua Messenger phần 1: Nguyên lý hoạt động

Internet cho vạn vật - Internet of Thing.

Lý do ra đời:

Một thời gian trước mình có tham gia một kỳ thi sáng tạo của khoa tổ chức. Trong lúc còn đang tìm ý tưởng, thì thời gian đó phong trào làm chat bot cho các fanpage trở nên rầm rộ. Do nền tảng Messenger của Facebook giúp cho các các fanpage có thể tự làm một con bot không chỉ dừng lại ở trả lời khách hàng tự động mà còn có thể thêm các tính năng như tra cứu, đặt hàng, thanh toán,... Thế là mình nghĩ tới khả năng điều khiển thiết bị điện hay điện tử thì sao?
Thay vì các dự án IOT thường điều khiển qua một web hay app riêng thì ta hãy thử kết nối với Messenger để nhận thông tin và điều khiển. Đối với bản thân mình thì ứng dụng Messenger là một ứng dụng dùng để liên lạc không thể thiếu, Và có mặt trên hầu hết tất cả thiết bị. Vì vậy đây sẽ là một giải pháp tiện lợi và gọn. Sau một tuần nghiên cứu lại chat bot của anh Hoàng code dạo và khả năng kết nối internet của mạch Arduino, mình quyết định sử dụng thêm mạch ESP8266. Sau đây mình sẽ chia sẻ lại cho các bạn source code của dự án và hướng dẫn xây dưng để nó chạy.


Nguyên lý hoạt động:

Công nghệ sử dụng:

Các công nghệ.
Ở đây ta sẽ sử dụng 4 công nghệ để có thể làm nên hệ thống này, xem nào:
  • Messenger Platform: Như đã giới thiệu ở trên, là một nền tảng của Facebook cho phép ta xây dựng các ứng dụng dựa trên nền tảng ứng dụng nhắn tin Messenger.
  • NodeJS Server: NodeJS là một ngôn ngữ lập trình mới, và đang là xu hướng mới cho các lập trình viên. Nhưng không phải bất kỳ một máy chủ hay hosting nào cũng có khả năng chạy được NodeJS, ở đây mình sẽ hướng dẫn các bạn trên Codeanywhere, vì nó miễn phí cho phép ta xây dựng một máy chủ NodeJS cá nhân đủ để thử nghiệm.
  • Module ESP8266: ESP8266 là một mạch vi điều khiển có thể giúp chúng ta điều khiển các thiết bị điện tử. Điều đặc biệt của nó, đó là sự kết hợp của module Wifi tích hợp sẵn bên trong con vi điều khiển chính. Hiện nay, ESP8266 rất được giới nghiên cứu tự động hóa Việt Nam ưa chuộng vì giá thành rẻ, nhưng lại được tích hợp sẵn Wifi, bộ nhớ flash 8Mb.
  • Mạch lập trình Arduino: Khác với các vi điều khiển, Arduino là một mạch điện tử kết hợp giữa chip điều khiển, mạch nạp, và các chân giao tiếp GPIO và cho ta một giao diện lập trình trực quan hơn, sử dụng ngôn ngữ java gần gũi. Dễ sử dụng, giá thành tốt cũng là yếu tố giúp cho Arduino ngày cầng phổ biến hơn.

Phương thức kết nối:

Cách kết nối.
  • Webhook và RestAPI: Xin phép trích lại phần giải thích hài hước của anh Hoàng:
    [[expand]]Webhook là gì?

    Hãy tưởng tượng bạn là một thanh niên đi làm đã có vợ con đùm đề. Một ngày nọ, có một em gái người Pháp tóc vàng ngực khủng rất xinh chuyển tới gần nhà bạn. Nhà em gái nọ kín cổng cao tường, có 2 con chó bẹc giê giữ tợn canh giữ; nhà bạn cũng chả khá hơn, có 1 mụ vợ già canh giữ.

    Bạn rất muốn rủ rê em gái nọ đi chơi nhưng không biết cách. Bí quá, bạn bèn ra lan can dựng tấm bảng: “Đang tìm người xem phim chung, ai muốn đi thì ném cái thời gian địa điểm hẹn qua nhé”. May thay, thấy bạn đẹp trai khoai to nên em gái kia cũng hứng thú, viết một mẩu giấy ghi thời gian địa điểm hẹn ném qua lan can nhà bạn. Nhặt được tờ giấy, bạn bắt đầu lên kế hoạch nói dối mụ vợ để ra ngoài hú hí.

    Nếu nói bạn và em gái Pháp là 2 chương trình khác nhau, thì ở đây Webhook chính là cái lan can, thứ giúp 2 người kết nối với nhau. Theo lý thuyết, webhook là một HTTP callback. Trong code, khi bạn truyền callback vào 1 hàm, mang ý nghĩa “Tao đưa mày cái hàm này nè, khi nào có thì gọi hàm đó báo tao nhe”. Webhook cũng tương tự, nhưng là thông qua HTTP POST. Ví dụ có thể giải thích như sau trên:

    Em gái Pháp: Anh ơi em muốn đi chơi.
    Bạn: Webhook của anh là: http://lancan.com. Khi nào muốn cứ đi em gửi POST Request (ném tờ giấy) lên http://lancan.com. Trong request nhớ ghi thời gian và địa điểm nhé.
    Em gái Pháp: OK !

    RestAPI là gì?

    Quay lại chuyện em gái Pháp tóc vàng ngực khủng. Nhận được tờ giấy, bạn mừng rơn nhưng không biết làm sao báo lại cho nàng. Nàng không biết tiếng Việt, còn bạn cũng không rành tiếng Pháp. May thay, nàng vốn là tiểu thư, nên nhà có con người hầu biết tiếng Anh. Bạn gửi một mẫu giấy cho con người hầu, nhờ nó báo lại địa điểm hẹn cho nàng.

    Cuộc hẹn thành công tốt đẹp. Hai người đi ăn uống, xem phim rồi tìm nơi thanh vắng riêng tư nghỉ ngơi. Chó bẹc giê hay mụ vợ già cũng chẳng thể nào ngăn cách tình yêu đôi lứa.

    Ở đây, bạn là chương trình C#, còn nàng lại viết bằng Java. Con bé người hầu ở đây là RestAPI của nàng, sử dụng tiếng Anh (giao thức HTTP) để giúp 2 bạn giao tiếp với nhau. Nhờ có RestAPI mà 2 chương trình viết bằng 2 ngôn ngữ khác nhau có thể giao tiếp, truy cập dữ liệu của nhau.

    Cũng đã có khá nhiều bài viết về REST nên mình không nhắc lại, bạn nào muốn tìm hiểu có thể google thêm nhé: REST API là gì?. Hiện tại, các ứng dụng nổi tiếng như Facebook, Youtube, Twitter đều có REST API. Thông qua các Rest API này, ta có thể viết web, mobile app để truy cập dữ liệu Facebook, Youtube, …  mà không cần quan tâm đến ngôn ngữ sử dụng.
    [[expend]]
  • Socket: Các bạn cũng tự tìm hiểu thêm về giao thức này nhé:
    [[expand]]Socket là gì?
    -Socket là một cổng logic mà một chương trình sử dụng để kết nối với một chương trình khác chạy trên một máy tính khác trên Internet. Chương trình mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có thể sử dụng Internet cùng một lúc.Có 2 loại Socket:
    + Stream Socket: Dựa trên giao thức TCP( Tranmission Control Protocol) việc truyền dữ liệu chỉ thực hiện giữa 2 quá trình đã thiết lập kết nối. Giao thức này đảm bảo dữ liệu được truyền đến nơi nhận một cách đáng tin cậy, đúng thứ tự nhờ vào cơ chế quản lý luồng lưu thông trên mạng và cơ chế chống tắc nghẽn.
    + Datagram Socket: Dựa trên giao thức UDP( User Datagram Protocol) việc truyền dữ liệu không yêu cầu có sự thiết lập kết nối giữa 2 quá trình. Ngược lại với giao thức TCP thì dữ liệu được truyền theo giao thức UDP không được tin cậy, có thế không đúng trình tự và lặp lại. Tuy nhiên vì nó không yêu cầu thiết lập kết nối không phải có những cơ chế phức tạp nên tốc độ nhanh…ứng dụng cho các ứng dụng truyền dữ liệu nhanh như chat, game…[[expend]]
    Và đây là lý do tại sao lại chọn socket:
    + Một lệnh HTTP truyền thống cần phải có thời gian thiết lập kết nối, điều đó là bắt buộc. Sau đó, tuần tự các phép chuyển dữ liệu mới diễn ra. Trong khi đó, websocket chỉ cần thiết đặt một lần duy nhất và khi kết nối còn giữ thì mọi việc diễn ra rất nhanh, dữ liệu được gửi đi ngay tức khắc với độ trễ chỉ khoảng 1-2 mili giây.
    + Việc trao đổi diễn ra hai chiều: Nghĩa là server có thể tạo ra một sự kiện ở client.
  • Serial: hiểu đơn giản là một kiểu kết nối trực tiếp bằng các cổng vật lý thôi.
    Tìm hiểu thêm tại đây.

Vậy công việc của ta gồm có:

  1. Tạo một Fanpage trên Facebook và tạo một ứng dụng để kết nối.
  2. Xây dựng một Server đóng vai trò là webhook và socket server.
  3. Cấu hình cho ESP8266 kết nối với Server và Arduino.
  4. Lập trình nhận lệnh điều khiển và xử lý cho Arduino.
Đến đây là xong phần 1 rồi, bắt đầu từ phần sau thì ta sẽ bắt tay vào công việc nhé!

Chi phí mua sắm:

  1. Mạch Arduino UNO R3: ~ 160k
  2. Mạch NodeMCU CP2102 (ESP8266): ~ 165k
  3. Test board: ~ 30k
  4. Dây cắm: ~ 10k



Không có nhận xét nào:

Đăng nhận xét

Thông tin

Tự Học Linux là blog hướng dẫn người dùng sử dụng các hệ điều hành mã nguồn mở nhân Linux. Blog gồm các bài viết hướng dẫn sử dụng, thủ thuật cũng như sửa lỗi gặp phải trong quá trình sử dụng. Bài viết có thể được dịch hoặc tham khảo từ nhiều nguồn (xem cuối bài viết), vui lòng dẫn nguồn Tự Học Linux nếu bạn phát hành lại bài viết của Blog. Cảm ơn các bạn đọc đã ủng hộ!