III. Triển khai ứng dụng bật tắt bóng đèn qua Internet trong Smart Home
1. Mô hình triển khai
Một mô hình triển khai đơn giản trong ngôi nhà thông minh như sau:
Hình 6: Mô hình triển khai
Home Server: Là một máy tính mini chạy hệ điều hành Debian, đã được cài đặt dịch vụ Web Server với các API cần thiết. Trên máy tính mini này được gắn một bộ vi xử lý Zigbee Network Processor (ZNP), máy tính sẽ được cài driver do nhà sản xuất cung cấp để có thể tích hợp được với nhau tạo thành một khối thống nhất. Web Server và ZNP giao tiếp với nhau qua các thông điệp mà chúng gửi đi để trao đổi, truyền thông tin với nhau.
Các thiết bị trong nhà: Đây là các thiết bị thông minh. Chúng hoạt động bằng cách giao tiếp với ZNP qua sóng Zigbee.
Các thiết bị điều khiển (PC, tablet, SmartPhone,...): Có nhiệm vụ giúp người dùng điều khiển các thiết bị trong nhà thông qua Internet. Người dùng điều khiển các thiết bị bằng cách sử dụng các thiết bị điều khiển gửi HTTP requet đến Web Server yêu cầu thực thi một API nào đó. Khi đó, ngay lập tức Web Server sẽ phản hồi lại, đồng thời gửi tin nhắn đến ZNP nhằm ra lệnh cho một thiết bị nào đó hoạt động theo cách mà người dùng yêu cầu.
2. Xây dựng Web Server với Node JS
a. Tổng quan về Node JS
Node.js là một hệ thống phần mềm được thiết kế để viết các ứng dụng internet có khả năng mở rộng, đặc biệt là máy chủ web. Chương trình được viết bằng JavaScript, sử dụng kỹ thật điều khển theo sự kiện, nhập/xuất không đồng bộ để tối tiểu tổng chi phí và tối đại khả năng mở rộng. Node.js bao gồm có V8 JavaScript engine của Google, libUV, và vài thư viện khác.
Node.js được tạo bởi Ryan Dahl từ năm 2009, và phát triển dưới sự bảo trợ của Joyent.Node.js được “Info World” bình chọn là “công nghệ của năm” năm 2012
Mục tiêu ban đầu của Dahl là làm cho trang web có khả năng push như trong một số ứng dụng web như Gmail. Sau khi thử với vài ngôn ngữ Dahl chọn Javascript vì một API Nhập/Xuất không đầy đủ. Điều này cho phép anh có thể định nghĩa một quy ước Nhập/Xuất điểu khiển theo sự kiện, non-blocking.
b. Tại sao sử dụng Node JS
Node JS là hệ thống phần mềm để thiết kế viết các ứng dụng internet có khả năng mở rộng cao, đặc biệt là máy chủ web.
Node JS cho phép chúng ta có thể chạy các ứng dụng trên các hệ điều hành khác nhau như Os, Windows, Linux.
NodeJS nhận và xử lý nhiều kết nối chỉ với một single-thread. Đồng thời, tận dụng ưu điểm non-blocking I/O của Javascript, NodeJS sử dụng tối đa tài nguyên của server làm tăng hiệu năng của hệ thống cực cao.
Tất cả các hàm trong Node.js là không đồng bộ.
c. Cơ chế hoạt động Web Server
Web server là nơi quản lí, lưu trữ các trạng thái của thiết bị. Đồng thời cũng là nơi chuyển tiếp tín hiệu từ phía client cho vi xử lý ZNP điều khiển trực tiếp các thiết bị.
Trong bài báo cáo này, mô hình giao tiếp từ client tới các thiết bị được cụ thể hóa như sau:
Trước tiên web service sẽ kết nối tới cổng mà vi xử lí ZNP đang nghe trên đó bằng module serialPort có sẵn trên NodeJS
Ví dụ:
var SerialPort = require("serialport").SerialPort; var sPort = new SerialPort("/dev/ttyO1", { baudrate: 115200 }); sPort.on("open", function() { console.log("Opened serial port"); });
Sau đó là tiếp nhận các http request gửi lên từ client tới web service theo dạng các URL
Ví dụ: 127.0.0.1:8888/device/den-ngu/switch/on
Sau khi tiếp nhận các request thì web service sẽ sinh ra 1 chuỗi có độ dài 8 byte. Chuỗi 8 byte này không cố định mà tùy thuộc từng loại vi xử lí. Với ZNP thì sẽ là 1 chuỗi 8 byte. Ta có thể hiểu chúng như là các mật mã để đi qua cánh cửa vậy
Ví dụ:
devStatus[0]=0x44; devStatus[1]=0x31; devStatus[2]=0x34; devStatus[3]=0x31; devStatus[4]=0xa2; devStatus[5]=0x6a; devStatus[6]=0x10; devStatus[7]=0x31; serialPort.write(devStatus); res.send({ message: “Bật đèn”, status: '200 OK' });
Byte thứ 8 tức devStatus là giá trị quan trọng nhất quyết định tới trạng thái của thiết bị mà người dùng muốn xử lí. 0x31 tức là ứng với giá trị 1 – tức là bật đèn. Các giá trị của chuỗi 8 byte hoàn toàn do lập trình viên lập trình trên vi xử lí quy định.
Câu lệnh serialPort.write(devStatus); sẽ thực thi nhiệm vụ gửi tin nhắn tới ZNP và ZNP sẽ điều khiển thiết bị theo ý muốn người dùng.
Cuối cùng là webservice trả về thông báo cho người dùng bằng chuỗi JSON
message: “Bật đèn”, status: '200 OK'