Node RED là một công cụ lập trình dùng để kết nối các thiết bị phần cứng, API và các dịch vụ trực tuyến với nhau. Về cơ bản, đây là một công cụ trực quan được thiết kế cho hệ thống IOT nói chung và nhà thông minh nói riêng, Node RED cũng cung cấp những module hỗ trợ (plugin) có thể được sử dụng cho các ứng dụng khác nhằm liên kết nhanh các luồng dịch vụ khác nhau. Node-RED là mã nguồn mở và được phát triển bởi Emerging Technology Services của IBM và được tích hợp trong gói ứng dụng khởi
29
động IoT Bluemix của IBM (Platform-as-a-Service hoặc PaaS). Node-RED cũng có thể được triển khai riêng bằng ứng dụng Node.js. Hiện tại, Node-RED là một dự án của JS Foundation, Node-RED cho phép người dùng kết hợp các dịch vụ Web và phần cứng bằng cách thay thế các tác vụ mã hóa cấp thấp phổ biến (như một dịch vụ đơn giản giao tiếp với một cổng nối tiếp) và điều này có thể được thực hiện với giao diện kéo thả trực quan. Các thành phần khác nhau trong Node-RED được kết nối với nhau để tạo ra một luồng (flow) và sinh mã tự động.
Hình 2.1: Giao diện điều khiển nhà thông minh trên Node RED
Thuật ngữ node red khá phổ biến trong giới lập trình đặc biệt với những lập trình viên giàu kinh nghiệm. Node RED cung cấp cho lập trình viên một trình soạn thảo dựa trên trình duyệt giúp dễ dàng kết nối các luồng với nhau bằng cách sử dụng một loạt các node trong palette. Các hành động này có thể được triển khai dễ dàng chỉ bằng một cú nhấp chuột. Đây là một trong những yếu tố tạo nên sự hấp dẫn của node red. Trước đây các lập trình viên cần phải biết đến ngôn ngữ C, C+, các ngôn ngữ lập trình bậc thấp để code thì hiện nay có thể làm nó bằng Javacscript nhờ Node red được xây dựng dựa trên NodeJS. Chính vì vậy Node RED là một công cụ thể hiện vai trò của ba yếu tố là kết nối API, liên kết phần cứng và online service. Node RED là một sự cải cách vĩ đại trong dòng chảy của thời đại cách mạng công nghệ số 4.0 đó chính là khả năng kết nối hệ thống internet vạn vật.
Trong thực tế, nếu đưa vấn đề đi theo hướng cơ bản thì mọi sự kết nối online đều cần phải vận dụng tới rất nhiều đối tượng với nhiều kiểu ngôn ngữ khác nhau. Tuy nhiên
30
các kỹ sư công nghệ thế hệ mới đã không cam tâm đi theo chiều hướng phức tạp và có phần thủ công đó. Họ hướng đến việc làm thế nào để có thể nhanh chóng lấy được dữ liệu vận hành. Và Node RED chính là một công cụ như thế. Các nhà phát triển công nghệ đã tìm cách để có thể đơn giản hóa việc liên kết giữa hệ thống, thiết bị trong chiến lược phát triển hệ thống internet vạn vật. Trong nhận thức, ai cũng hiểu rõ, bất cứ sự kết nối nào cũng sẽ phải lặp đi lặp lại rất nhiều lần, những số lần không đếm xuể. Đó là một quá trình vô cùng phức tạp, khó khăn. Vì thế các kỹ sư trẻ đến từ nhóm Công nghệ của IBM muốn xây dựng hộp công cụ mã nhằm tối giản quá trình kết nối lặp đi lặp lại đó, nếu mục tiêu này thành công thì cơ hội hệ thống internet of things cũng sẽ được tăng tốc nhiều hơn.
Dù có cơ chế hoạt động khá đơn giản nhưng công cụ được tạo ra từ Node RED lại có thể đem đến khả năng kết nối dễ dàng nhiều sự kiện ở thế giới thực, có thể thêm dữ liệu thông tin hoặc truy cập được những nút đơn giản, từ đó tích hợp thành công chúng lại với nhau áp dụng vào các hệ thống nhắn tin cũng như ứng dụng cho những nền tảng mạng xã hội phổ biến bao gồm MongoDB, Twitter hay Watson loT. Đây là cách tốt nhất để các nhà phát triển có thể tạo nên những ứng dụng có khả năng phản ứng lại với mọi thứ diễn ra trong thế giới của họ. Node RED có thể làm giảm đi tối đa nhu cầu viết mã, hạ thấp hơn những thanh kỹ thuật, giúp cho những ai đang quan tâm tới vấn đề cần phát triển loT có thể thực hiện chức năng tạo. Chính vì thế mà node red trở nên phổ biến với rất nhiều đối tượng, nhiều hoàn cảnh do dễ dàng sử dụng. Node RED được đánh giá cao về độ ứng dụng của nó vì hầu hết mọi người đều có thể dễ dàng học được cách sử dụng nó, không phải chỉ lập trình viên mới có thể học và hiểu. Trong sự phát triển của IoT thì Node RED được đánh giá là công cụ hữu ích vô cùng trong việc kết nối vạn vật một cách hiệu quả trên internet.
Trong quá trình tìm hiểu để xây dựng đề cương cho luận văn, học viện nhận thấy việc cần xây một ứng dụng để hiển thị các dữ liệu thu thập được từ các cảm biến môi trường và điều khiển một số cơ cấu đơn giản của hệ mô hình nhà thông minh. Ứng dụng sẽ có định dạng đơn giản, chạy trên web và hỗ trợ giao thức vận chuyển dữ liệu phổ biến như MQTT, và Node RED là một nền tảng khá phù hợp cho yêu cầu này. Đây là một công cụ lập trình dùng để kết nối các thiết bị phần cứng, API và các dịch vụ trực tuyến với nhau, có thể thấy rằng Node RED là một công cụ trực quan được thiết kế cho hệ thống IOT nói chung và nhà thông minh nói riêng.
31
Hình 2.2: Ứng dụng đa nền tảng của Node RED 2.1.1 Thiết lập môi trường Node RED
Để thiết lập hoạt động của Node RED cần chuẩn bị môi trường có hệ điều hành Ubuntu để khởi chạy hệ thống. Đây là một hệ điều hành mã nguồn mở với rất nhiều tiện ích và là hệ điều hành thích hợp để phát triển các tính năng của hệ thống IoT nói chung và nhà thông minh trên nền tảng Node RED nói riêng. Ubuntu hoàn toàn miễn phí, và được chia sẻ rộng rãi trên trang chủ của Ubuntu với bản cập nhật mỗi sáu tháng một lần và luôn tăng cường bảo mật. Cách cài đặt Ubuntu vào máy tính cũng tương đối dễ dàng.
Ngoài ra, người dùng cũng có thể chỉnh sửa tùy ý, sao chép hoặc cải tiến nó với giấy phép từ GNU GPL. Ubuntu hoạt động khá hiệu quả và tiêu tốn cực ít dung lượng phần cứng, đây là một điểm then chốt khi phát triển các thiết bị trong nhà thông minh bởi cần sự nhỏ gọn và tiết kiệm năng lượng. Điều này sẽ gia tăng tốc độ hoạt động của các máy tính đồng thời tăng hiệu suất hệ thống. Theo nhận định của nhiều chuyên gia về công nghệ thì cơ chế bảo mật của Ubuntu cao hơn so với Windows. Ubuntu là phần mềm mã nguồn mở và được hỗ trợ bởi một cộng đồng rộng lớn trên thế giới. Chính vì thế nên khi Ubuntu có bất kỳ lỗ hổng bảo mật nào thì người dùng sẽ lập tức nhận được bản cập nhật vá lỗi trong thời gian ngắn. Khi cài đặt Ubuntu, người dùng sẽ được cung
32
cấp hầu như toàn bộ các driver cần thiết để máy tính có thể hoạt động ổn định. Nếu các driver gặp vấn đề, người dùng cũng có thể khắc phục lỗi thông qua các bản update được cập nhật thường xuyên. Để cài đặt Node RED ta tiến hành bằng các câu lệnh sau:
$ sudo apt-get install node.js -y $ sudo apt-get install nodejs-legacy $ sudo apt-get install git -y
$ git clone https://github.com/node-red/node-red.git $ cd node-red
$ sudo npm install n -g $ sudo n stable
$ cd ..
$ sudo npm install -g grunt-cli $ cd node-red
$ grunt build $ node red
Sau khi gói cài đặt được thiết lập, màn hình sẽ đưa ra thông báo sau:
Hình 2.3: Cài đặt thành công gói Node RED
Khi cài đặt thành công có thể truy cập vào Node RED ở đường dẫn http://127.0.0.1:1880/#, tiếp theo cần tiến hành thiết lập đăng nhập và khởi động Node RED tự động, đây là một tùy chọn khi cài trên ubuntu 16.04, người sử dụng cần tạo một service Node RED với với lệnh:
$ sudo nano /etc/systemd/system/node-red.service Tiếp theo tiến hành cấu hình các trường khi làm việc trong Node RED
[Unit]
33 After=syslog.target network.target [Service] ExecStart=/usr/local/bin/node-red-pi--max-old-space- size=128 -v Restart=on-failure KillSignal=SIGINT
# log output to syslog as 'node-red' SyslogIdentifier=node-red
StandardOutput=syslog # non-root user to run as WorkingDirectory=/home/sammy/ User=GiangLT
Group=GiangLT [Install]
WantedBy=multi-user.target
Thực hiện lệnh sau để tự động khởi chạy Node RED: $ sudo systemctl enable node-red $ sudo systemctl start node-red
Nếu muốn dừng chạy tự động khởi động thì thực hiện lệnh: $ sudo systemctl stop node-red
Khi tiến hành thiết lập giao diện trên Node RED cần đảm bảo chỉ có duy nhất một đối tượng tham gia vào quá trình thay đổi tham số hệ thống, chính vì vậy cần thiết lập các quy tắc đăng nhập, tạo cơ chế đồng bộ hóa, những thiết lập này sẽ nằm trong file setting.js và được gọi đến bằng trình soạn thảo nano mặc định của ubuntu.
$ nano ~/.node-red/settings.js Thiết lập tài khoản đăng nhập:
adminAuth: { type: "credentials", users: [{ username: "admin", password: "admin", permissions: "*" }] },
34
Khi các thiết lập đã hoàn tất truy cập vào địa chỉ của Node RED là đã có thể tiến hành sử dụng.
Hình 2.4: Màn hình làm việc chính của Node RED 2.1.2 Một số thao tác cơ bản trên Node RED
Node RED vốn là một công cụ lập trình có nhiệm vụ nhanh chóng tạo ra kết nối các thiết bị phần cứng mà cụ thể là các cảm biến, các cơ cấu chấp hành có thể kết nối vào mạng, đồng thời cho phép trao đổi dữ liệu bằng cách tích hợp các API và các dịch vụ trực tuyến với nhau. Node-RED được xây dựng bằng Node.JS. Do đó, Node RED có thể chạy dễ dàng trên bất cứ trình duyệt web nào. Giao diện Node RED được chia làm ba phần đó là khu vực input nơi chứa các Block để xử lý luồng đầu vào, khu vực xây dựng các luồng xử lý đó là các Flow, nơi có thể chứa các Block và biểu diễn quan hệ giữa các Block với nhau. Khu vực output chứa thông tin và các Block, cách cấu hình chúng và debug.
35
Hình 2.5: Cửa số làm việc của Node RED
Cửa sổ soạn thảo gồm 4 thành phần chính: Tiêu đề ở trên, chứa nút Deploy, menu chính.
Bảng màu (palette ) bên trái, chứa các nút có sẵn để sử dụng.
Không gian làm việc chính (workspace) ở giữa, nơi các luồng được tạo. Thanh sidebar bên phải.
Trong môi trường Node RED các chương trình được tổ chức dưới dạng các Flow, các Flow có thể chạy song song và độc lập với nhau, người lập trình cũng có thể thêm, sửa xóa các Flow hết sức dễ dàng.
36
Hình 2.6: Tạo Flow trong Node RED
Để xóa một Flow chỉ cần kích đúp vào tab của Flow đó và chọn Delete ở phần panel hiện ra bên phải, cửa sổ này còn cho phép đổi tên và viết mô tả, giới thiệu các thông tin cơ bản của luồng.
Hình 2.7: Cách xóa Flow trong Node RED
Việc thao tác giữa các luồng Flow cũng cần quan tâm đến việc Export (kết xuất dữ liệu) để tiến hành lưu trữ, đồng thời Import dữ liệu từ Flow trở lại màn hình làm việc. Node RED cho phép xuất nhập file dưới định dạng văn bản thông thường nên rất thuận tiện cho việc thay đổi và hiệu chỉnh chương trình. Các thao tác sao chép, di chuyển node giữa các Flow cũng được thực hiện hết sức dễ dàng qua các bước:
Bước 1: khối chọn những nodes muốn sao chép hoặc di chuyển
Bước 2: dùng Ctrl + C để sao chép các nodes; dùng Ctrl + X để di chuyển các nodes Bước 3: chuyển sang Flow khác và dùng Ctrl + V để dán các nodes lại
Mặc dù là Node-RED cung cấp cho chúng ta một cách lập trình trực quan, dễ hiểu. Tuy nhiên, việc ghi chú lại chức năng, cách sử dụng các nodes / flow là rất cần thiết. Vì nếu người dùng share Flow cho cộng đồng thì những ghi chú đó sẽ rất có giá trị. Đây là lý do Node RED cung cấp một node khá hữu ích đó là Comment. Để sử dụng, chỉ cần kéo thả node Comment vào workspace, sau đó double-click vào node Comment để thêm nội dung ghi chú.
37
Hình 2.8: Cửa sổ ghi chú thích của Node RED
Ngoài cách export ra Clipboard, Node-RED còn hỗ trợ người dùng export các Flow / Nodes ra thành Library. Dĩ nhiên cách này sẽ thuận tiện cho chúng ta hơn rất nhiều khi làm các dự án lớn vì không cần copy / paste phần export nữa. Để bắt đầu, người dùng khối chọn các nodes muốn export và chọn Menu -> Export -> Library.
Sau đó điền tên Library theo ý muốn. Người dùng cũng có thể phân cấp Library bằng cách dùng dấu /. Như hình bên dưới có nghĩa là Library sẽ nằm trong thư mục mechasolution. Để sử dụng Library vừa tạo, người dùng chỉ việc vào Menu -> Import -> Library -> mechasolution -> first-flow
38
Hình 2.9: Ví trí thiết lập thư viện trong Node RED
Một node khá quan trọng khi tìm hiểu Node RED đó chính là Function node, node này cho phép người dùng tự viết một hàm riêng bằng mã javascript, từ đó các chương trình hoạt động của Node RED được mở rộng lên rất nhiều. Ngoài ra, người dùng hoàn toàn có thể tạo ra các node được cá nhân hóa bằng cách sử dụng tính năng Subflow node, tính năng này cho phép thiết lập các Flow riêng biệt với các tính năng do người lập trình quyết định. Để tạo đầu tiên cần chọn node(s) Sau đó chọn Menu -> Subflows -> Selection to Subflow.
Hình 2.10: Cách tạo Subflows trong Node RED
Như vậy có thể thấy rằng Node RED cung cấp cho người dùng một môi trường làm việc với cách đối tượng được thiết kế sẵn và hỗ trợ tối đa việc tùy biến đối tượng cũng như phát triển các đối tượng mới. Việc nhúng các API vào trong Node RED cũng rất dễ dàng, từ đó liên kết hệ thống trở nên đơn giản hơn. Cơ bản các nhà phát triển sẽ sử dụng Node RED làm trạm trung chuyển để nhúng các giao thức mạng như MQTT, CoAP, http… đồng thời phát triển nhanh giao diện người dùng dashboard.
2.2Tích hợp wifi trên nền tảng Node RED 2.2.1 Giao thức MQTT 2.2.1 Giao thức MQTT
39
MQTT(Message Queuing Telemetry Transport) là giao thức truyền message theo mô hình cung cấp thuê bao publish/subcribe sử dụng cho các thiết bị bằng băng thông thấp, độ tin cậy cao và có khả năng hoạt động trong điều kiện đường truyền không ổn đinh. Bởi vì sử dụng băng thông thấp trong môi trường có độ trễ cao nên đây là giao thức lý tưởng cho việc xây dựng các ứng dụng IoT đặc biệt là trong xây dựng ứng dụng cho nhà thông minh. Trong một hệ thống sử dụng giao thức MQTT, nhiều node trạm (gọi là MQTT client hoặc client, là các publisher hoặc subscriber) kết nối tới một MQTT server (gọi là broker). Mỗi client sẽ đăng ký một vài kênh (topic). Quá trình đăng ký này gọi là subscribe. Trong đề tài luận văn sẽ sử dụng MQTT trao đổi dữ liệu trong hệ thống xây dựng bằng Node RED. Về cơ bản công nghệ MQTT được cấu tạo gồm:
Session: Một session- phiên làm việc được định nghĩa là kết nối từ client đến server. Tất cả các giao tiếp giữa client và server đều là một phần của phiên.
Subscription: Không giống như sessions, subscription về mặt logic là kết nối từ client đến topic. Khi thực hiện subscribed đến topic, client có thể trao đổi messages với topic. Subscriptions có thể ở trạng thái ‘transient’ hoặc ‘durable’, phụ thuộc vào cờ clean session trong gói Connect.
Publish: là hành động một client gửi dữ liệu lên kênh thông tin, mỗi khi kênh thông tin đó được cập nhật dữ liệu (dữ liệu này có thể được các client khác gửi lên) thì những client đã đăng ký theo dõi kênh này sẽ nhận được dữ liệu cập nhật đó.
Message (message payload): có định dạng mặc định là plain-text, dạng chữ viết người