Tạo ứng dụng Node.js IOT trên Raspberry Pi dùng giao thức MQTT

Hướng dẫn tạo chương trình ứng dụng IOT cơ bản trên Raspberry Pi với giao thức MQTT. Mọi thứ cần biết để bắt đầu xây dựng hệ thống IOT nhà thông minh của riêng mình.


1071

Giao thức MQTT là một giao thức mạng tiêu chuẩn có trọng lượng nhẹ và linh hoạt, điều này làm cho nó trở nên hoàn hảo cho các nhà phát triển IoT. Bạn có thể sử dụng nó để chuyển thông điệp giữa các thiết bị khách, chẳng hạn như cảm biến IoT và môi giới MQTT, là một máy chủ nhận và định tuyến các thông báo đến các thiết bị khách khác.

Trong bài viết này, chúng ta sẽ xem xét các trường hợp sử dụng MQTT trong thế giới thực trên các thiết bị IoT edge, như Raspberry Pi. Chỉ qua một chút mã, tôi sẽ chỉ cho bạn cách thu thập dữ liệu từ các cảm biến IoT (cảm biến DHT11 hoặc DHT22) được kết nối với Raspberry Pi và sử dụng một nhà môi giới MQTT để xử lý, lưu trữ và chuyển tiếp dữ liệu đến các thiết bị khác trong mạng lưới. Có rất nhiều trường hợp sử dụng cho các cảm biến môi trường thông minh này. Ví dụ: bạn có thể đặt Pi này với các cảm biến của nó trong một ngôi nhà xanh và để Pi điều khiển A / C và các đơn vị tưới tiêu để giữ cho cây trồng trong môi trường tối ưu.

Thiết lập Raspberry Pi

Raspberry Pi là một máy tính rất mạnh trong một gói nhỏ. Tùy chọn rẻ nhất, Raspberry Pi Zero , có khả năng chạy bản phân phối Linux đầy đủ tính năng và mang lại màn hình độ nét cao. Nó có kích thước bằng 3 ngón tay và có giá 5 đô la. Với giá 10 đô la, Raspberry Pi Zero W đi kèm với WiFi và Bluetooth tích hợp.

Cách dễ nhất (nhưng đắt nhất) để thiết lập chỉ là mua một bộ máy tính để bàn với giá khoảng $ 100 USD . Nó đi kèm với mọi thứ bạn cần cho một máy tính ngoại trừ màn hình. Bộ này thường bao gồm một thẻ MicroSD được cài sẵn Linux cho Raspberry Pi. Nếu không có bộ phụ kiện, bạn có thể mua thẻ MicroSD 16GB, đầu đọc thẻ MicroSD và sử dụng Raspberry Pi Imager để tải hệ điều hành vào thẻ MicroSD từ máy tính xách tay của bạn.

Cài đặt hệ điều hành vào thẻ MicroSD

Hai lựa chọn phổ biến là Raspberry Pi OS và Ubuntu Linux. Cả hai đều là bản phân phối Linux dựa trên Debian. Hầu hết các bộ khởi động đều cài đặt sẵn Hệ điều hành Raspberry Pi trên thẻ MicroSD của họ (nó được gọi là NOOBS).

Đối với các nhà phát triển chỉ muốn sử dụng thiết bị như một máy chủ hoặc thiết bị IoT, Ubuntu Linux là một lựa chọn tốt hơn. Nó có các gói phần mềm và thư viện mới nhất và có thể hiệu quả hơn nhiều khi không có cửa sổ máy tính để bàn, trình duyệt web, Java, trò chơi và các công cụ học tập.

Bạn có thể tải xuống file Máy chủ Ubuntu cho Raspberry Pi từ web và chép vào thẻ MicroSD. Nhưng có lẽ một cách dễ dàng hơn nhiều chỉ là sử dụng Raspberry Pi Imager , chọn Ubuntu Server 20.04 TLS từ menu và ghi vào thẻ MicroSD trống.

Sau khi chuẩn bị xong thẻ MicroSD, bạn nên làm theo các hướng dẫn sau để nhập tên và mật khẩu mạng WiFi của mình. Điều này cho phép thiết bị Raspberry Pi kết nối mạng ngay khi khởi động.

Về cơ bản, bạn có thể chỉ cần đặt thẻ MicroSD vào Raspberry Pi, kết nối nguồn USB, sau đó đợi nó trực tuyến. Bạn có thể tìm thấy raspberrypiIP của thiết bị từ bộ định tuyến WiFi của mình, sau đó SSH vào đó từ bất kỳ máy tính nào trong mạng của bạn.

Tên người dùng và mật khẩu ban đầu là ubuntu / ubuntu. Thậm chí không cần kết nối màn hình hoặc bàn phím.

Cài đặt Node.js trên Pi của bạn

Có rất nhiều thư viện MQTT dành cho Linux trên Raspberry Pi. Mình khuyên bạn nên sử dụng Node.js vì một số lý do.

  • Đầu tiên, Node.js cung cấp một hệ sinh thái các công cụ và thư viện hoạt động với các trường hợp sử dụng IoT. Nó rất dễ dàng để cài đặt phần mềm trên Node.js. NPM cho phép bạn cài đặt các module cho MQTT, hỗ trợ cảm biến và thời gian chạy mới với một dòng lệnh.
  • Thứ hai, JavaScript rất dễ hiểu đối với hầu hết các nhà phát triển. Nó là một ngôn ngữ tốt để viết các ứng dụng IoT.
  • Thứ ba, Node.js là một trình chạy hiệu suất cao. Trong khi các ứng dụng Node.js được viết bằng JavaScript, nhiều tác vụ nặng về tính toán hoặc I / O chuyên sâu thực sự được thực thi bởi các tệp nhị phân gốc thông qua thời gian chạy.

Để cài đặt Node.js trên Ubuntu 20.04 hoặc Raspberry Pi OS, hãy SSH vào thiết bị và chạy lệnh sau trong thiết bị đầu cuối SSH.

$ curl -sL https://deb.nodesource.com/setup_10.x | sudo bash - $ sudo apt install nodejs

Bạn có thể xác minh cài đặt được thực hiện đúng bằng cách chạy hai lệnh sau: $ node -v và $ npm -v. Cả hai lệnh node và npm hiện đã có sẵn.

Từ đây, bạn có thể sử dụng npm để cài đặt các mô-đun bổ sung cho giao tiếp MQTT và các phụ kiện IoT.

Sử dụng MQTT để đăng ký hàng đợi tin nhắn

Để cài đặt thư viện MQTT trên Node.js, hãy chạy lệnh sau trong bảng điều khiển SSH được kết nối với Raspberry Pi của bạn.

$ npm install mqtt --save

Giờ đây, bạn có thể viết một ứng dụng JavaScript đơn giản để gửi tin nhắn tới Nền tảng Internet vạn vật của IBM.

const connectOptions = {
    port: 8883,
    host: za6xa7.messaging.internetofthings.ibmcloud.com,
    rejectUnauthorized: false,
    protocol: 'mqtts',
    username: a-za6xa7-lxmzussonj,
    password: auth-token-here,
    clientId: "a:za6xa7:test1",
    ca: "messaging.pem"
};

var mqtt = require('mqtt');
var client  = mqtt.connect(connectOptions);

client.subscribe("iot-2/type/test/id/4321/evt/status/fmt/+");

client.on('connect', function () {
  client.publish('iot-2/type/test/id/4321/evt/status/fmt/json', '{\"mesg\" : \"hello IBM\"}');
});

client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString());
});

Ứng dụng JavaScript này mở ra một kết nối MQTT an toàn với Nền tảng Internet of Things của IBM và đăng ký vào hàng đợi tin nhắn. Nó sẽ gửi một thông báo trạng thái khi nó được kết nối và in ra tất cả các tin nhắn đã nhận. Ví dụ cho thấy rằng bạn có thể thu thập dữ liệu từ các cảm biến IoT được kết nối với Raspberry Pi, cấu trúc dữ liệu thành JSON và gửi thông điệp JSON đến nhà môi giới MQTT để được xử lý, lưu trữ hoặc chuyển tiếp đến các thiết bị khác trong mạng.

Đọc và gửi dữ liệu bằng mã PIN GPIO trên Pi

Khi các phụ kiện IoT, chẳng hạn như cảm biến, đèn LED, động cơ, được gắn vào Raspberry Pi, chúng thường giao tiếp với thiết bị Pi thông qua mã PIN GPIO. Từ phần mềm, bạn có thể đọc điện áp trên mỗi mã PIN và cũng có thể đặt điện áp trên mỗi mã PIN. Điều đó cho phép phần mềm của bạn giao tiếp với phần cứng bên ngoài được kết nối với các mã PIN đó.

Gói GPIO trong Node.js cho phép ứng dụng của bạn đọc và đặt trạng thái mã PIN bằng cách sử dụng JavaScript đơn giản. Để cài đặt nó, hãy sử dụng npmlệnh sau .

$ npm install gpio

Lệnh sau đặt PIN 4 thành điện áp cao. Nếu mã PIN được kết nối với đèn LED, đèn sẽ sáng.

var gpio = require("gpio");

var gpio4 = gpio.export(4, {
   direction: gpio.DIRECTION.OUT,
   interval: 200 // Must wait this amount of ms between set() actions
});

gpio4.set(); // Set to high voltage; Turn on the light
// ...  do something else ...
gpio4.set(0); // Set of low voltage; Turn off the light.

Cho xem nhiều hơn

Lệnh sau đọc điện áp từ mã PIN 4.

var gpio = require("gpio");
var gpio4 = gpio.export(4, {
   direction: gpio.DIRECTION.IN
});

gpio4.on("change", function(val) {
   // value will report either 1 or 0 (number) when the value changes
   console.log(val)
});

Cho xem nhiều hơn

Với các mô-đun MQTT và GPIO, bạn có thể sử dụng Nền tảng Internet vạn vật của IBM để nhận và lưu trữ dữ liệu từ các cảm biến từ xa, đồng thời gửi lệnh đến các cảm biến đó.

Đọc và gửi dữ liệu cảm biến từ Pi tới MQTT broker

Có rất nhiều cảm biến IoT hoạt động với Raspberry Pi. Các cảm biến thường giao tiếp với thiết bị Raspberry Pi thông qua các mã PIN GPIO trên bo mạch.

Hãy sử dụng cảm biến nhiệt độ và độ ẩm DHT11 và DHT22 làm ví dụ. Những cảm biến môi trường này rất hữu ích trong nhiều ứng dụng trong thế giới thực. Ví dụ, bạn có thể đặt một cái bên ngoài ngôi nhà có máy lạnh ở sân sau của bạn. Nó sẽ có thể đo nhiệt độ và độ ẩm bên ngoài, đồng thời tính toán chỉ số nhiệt trên Raspberry Pi. Bạn có thể tra cứu các bài đọc trên thiết bị di động của mình trước khi ra ngoài. Một ví dụ khác là đặt các cảm biến môi trường được kết nối Raspberry Pi bên trong một ngôi nhà xanh. Thiết bị Raspberry Pi có thể điều khiển A / C và các thiết bị tưới tiêu trong ngôi nhà xanh thông qua WiFi hoặc một thiết bị khác được kết nối với mã PIN GPIO để giữ cho cây trồng ở môi trường tối ưu.

DHT11 và DHT22 là những cảm biến rất nhỏ, mỗi cảm biến có 4 mã PIN để kết nối với Raspberry Pi. Hai trong số các mã PIN dành cho nguồn, một dành cho dữ liệu và một mã PIN chưa được kết nối hoặc sử dụng. Chú ý điện trở cần thiết để điều chỉnh dòng điện cung cấp cho cảm biến.

Raspberry Pi gửi một xung điện áp cao thông qua mã PIN dữ liệu để cho cảm biến biết rằng nó đã sẵn sàng đọc dữ liệu nhiệt độ và độ ẩm. Cảm biến phản hồi bằng 40 xung 0 (điện áp thấp) và 1 (điện áp cao), mã hóa các giá trị của nhiệt độ và độ ẩm. Mặc dù có thể viết một chương trình để đọc các xung trực tiếp từ các mã PIN GPIO và giải mã các kết quả đọc từ cảm biến, có một cách dễ dàng hơn.

Cài đặt package  node-dht-sensor để đọc dữ liệu từ những cảm biến.

$ npm install node-dht-sensor

Mã JavaScript bên dưới đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến DHT11 với mã PIN DATA được kết nối với GPIO 4 của Raspberry Pi.

var sensor = require("node-dht-sensor");

sensor.read(11, 4, function(err, temperature, humidity) {
  if (!err) {
    console.log(`temp: ${temperature}°C, humidity: ${humidity}%`);
  }
});

Khi bạn đã đọc các giá trị nhiệt độ và độ ẩm, bạn có thể gửi chúng đến MQTT broker, chẳng hạn như Nền tảng Internet of Things của IBM, để các thiết bị và dịch vụ khác được kết nối với nhà môi giới có thể xem và phản hồi các kết quả đọc này. Ví dụ: một dịch vụ nhắn tin được kết nối với trung tâm có thể theo dõi nhiệt độ và gửi cảnh báo đến điện thoại di động khi các chỉ số nhiệt độ quá cao 3 lần liên tiếp.

Tóm tắt

Trong bài viết này, chúng ta đã thảo luận về cách giao thức MQTT được sử dụng trong các ứng dụng thế giới thực. Chúng ta sử dụng thiết bị Raspberry Pi để quản lý cảm biến môi trường và gửi kết quả đọc trong tin nhắn MQTT. Một MQTT broker trên Nền tảng Internet of Things của IBM sẽ lắng nghe những thông điệp đó. Nó ghi lại và có khả năng gửi các giá trị về môi trường đó đến server. 

Bây giờ đã đến lúc bắt tay xây dựng nhà thông minh của riêng bạn, ahihi.


Like it? Share with your friends!

1071