18 февраля 2020

Зачем и как строить Интернет вещей с Node.js

Пишу об IT и на Python. kungurov.net
О том, как применить Node.js для серверной части Интернета вещей. Разбираемся с вопросами безопасности и показываем пару реальных примеров интеграции платформы в IoT.
Зачем и как строить Интернет вещей с Node.js

Публикация представляет собой перевод поста на freeCodeCamp Олега Романюка – главы отдела входящего маркетинга в KeenEthics.

1. Оценка состояния рынка

В 2019 году рыночная выручка IoT достигла 212 миллиардов долларов. В мире насчитывается около 26,7 миллиарда подключенных устройств IoT. К 2025 году это число достигнет 75,4 миллиарда.

По оценкам ООН, на февраль 2020 года численность населения составляет 7,7 миллиарда человек. У среднестатистического человека есть около 3-4 устройств IoT. Наверняка у вас есть хотя бы одно из таких устройств: смарт-часы, фитнес-трекер, смарт-ТВ или, может быть, даже «умная» машина.

Ожидается, что в 2025 году численность населения достигнет 8,1 миллиарда человек и на каждого человека будет приходиться 9-10 IoT-устройств.

Думаем, вы уже поняли к чему мы клоним. Наверняка вы были бы не прочь присоединиться к этому рынку и тем более, чтобы ваше IoT-устройство было одним из тех девяти-десяти, что будут у каждого.

Статистические данные получены от Statista и ООН.
Статистические данные получены от Statista и ООН.

2. Выбор правильного фреймворка

Клиентская часть IoT-устройств представлена самим аппаратным обеспечением. Она написана на C, C++, Lua и других низкоуровневых языках программирования. Из-за аппаратных ограничений с этим ничего не поделаешь.

Наряду с высокой производительностью, пользователи IoT-устройств отдают приоритет низкой стоимости и энергоэффективности. Поэтому приложения для устройств следует писать на низкоуровневых языках. По крайней мере, пока.

Но вы никак не ограничены в выборе фреймворка и языка программирования для серверной части IoT-приложений. На наш взгляд, Node.js – правильный выбор. И вот почему.

2.1. Быстрота и производительность

Так как любое IoT-устройство постоянно работает с динамически изменяющимися данными, нужен фреймворк, способный работать с приложениями, работающими в режиме реального времени и с большими объемами данных.

Node.js работает на высокоэффективном и масштабируемом JavaScript движке V8 от Google. Вследствие этого Node.js является основной платформой для работы с приложениями, работающими в режиме реального времени и постоянно меняющимися данными.

2.2. Node.js легко интегрируется с протоколами IoT

Приложения интернета вещей активно использует протокол MQTT для обмена сообщениями между устройствами по принципу издатель-подписчик. Для транспортировки и инкапсуляции этот протокол задействует WebSockets. Как MQTT, так и WebSockets хорошо поддерживаются и легко интегрируются с Node.JS.

2.3. Модули Node.js облегчают разработку IoT

В Node.js есть npm (менеджер пакетов, англ. Node Package Manager) с множеством полезных пакетов для IoT-устройств. Существует около 80 пакетов для Intel IoT Edison, Arduino и Raspberry Pi. Кроме того, он содержит более 30 пакетов для различных датчиков, маячков и модулей.

2.4. Ресурсоэффективность и масштабируемость

Разработчики предпочитают работать с Node.js, так как он не требует большого объема ресурсов. Процессор и оперативная память не перегружены. Кроме того, Node.js обладает высокой масштабируемостью, что абсолютно необходимо для большинства современных компаний.

3. Избегаем подводных камней

Вход в нишу IoT может привести вас к успеху. Неудивительно, что на пути вас ждет множество проблем и ловушек – успех никогда не бывает легким. Первая и самая главная задача, которую вы должны решить, – безопасность.

3.1. Безопасная аутентификация

Существует множество инструментов для аутентификации в Node.js: токены, JWT, Auth0 и т. д. Каждый из них имеет свои преимущества и недостатки. Для начала посмотрим на них с точки зрения IoT.

Токены эффективны, но не на 100% безопасны. Они являются отличным способом настройки аутентификации, так как позволяют идентифицировать конкретного пользователя и принять решение о том, предоставлять или запрещать ему доступ. Токен может быть зашифрован любым алгоритмом.

Однако, аппаратное обеспечение (сканеры, датчики, хабы и другие штуки IoT) должно хранить этот токен или данные логина в прошивке. Это означает, что злоумышленники могут украсть токен, если у них есть физический доступ к аппаратным средствам. То же самое касается JWT и Auth0.

С другой стороны, вы можете использовать любые инструменты для аутентификации на стороне сервера и интегрировать такой инструмент в платформу Node.js. Есть много npm-пакетов, которые позволяют сделать это вручную: Auth0, Passport и JWT. Есть также пакеты для интеграции с облачными IoT-сервисами: @azure-iot/authentication, aws-iot-device-sdk и т. д.

3.2. Безопасные HTTP запросы

Обратите внимание на HTTP-запросы с IoT-устройств. Вы должны проверить, получаете ли вы запрос от соответствующего IoT-устройства.

Используйте HTTPS для передачи данных между IoT-устройствами. Оборудование – не браузер, решить вопрос с HTTPS нужно самостоятельно. Для серверной части вы можете сделать это вручную или использовать хостинг с настройкой HTTPS и сертификатами.

В Node.js это довольно легко реализовать:

        const express = require('express');
const https = require('https');
const http = require('http');
const fs = require('fs');
const options = {
  key: fs.readFileSync('path/to/your/key.pem'),
  cert: fs.readFileSync('path/to/your/certificate.cert')
};
const app = express();
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
    

HTTPS использует протоколы SSL или TLS для шифрования данных. Чтобы убедиться, что вы получили запрос от нужного сервера или клиента, используйте дополнительное шифрование данных. Например, вот так можно использовать подпись:

        const fetch = require('node-fetch');
const verifier = crypto.createVerify('RSA-SHA1')
const SIGNATURE_FORMAT = 'base64';
//check if it trusted url for your certificate
const trustedUrl = ‘https://trustedUrl/’
const isTrustedUrl = trustedUrl.match(url);
If (isTrustedUrl) {
verifier.update(req.body, 'utf8')
	fetch(isTrustedUrl)
    .then(certificate => {
	// check signature
const isValidSignature = verifier.verify(certificate, reg.header.signature, SIGNATURE_FORMAT);
   })
    .catch(err => console.log(err));
}
    

Далее:

  • Проверьте доверенный URL вашего сертификата.
  • Подпишите тело запроса открытым ключом из сертификата.
  • Сравните подпись из тела запроса с подписью из заголовка.

Чрезвычайно важно знать, что вы получаете запросы с соответствующих устройств, и не сталкиваетесь с атакой где-то посередине.

4. Пара примеров примнения Node.js в IoT на практике

4.1. Asama – трекинг перемещений сотрудников компании

Зачем и как строить Интернет вещей с Node.js

Asama — это система микролокации, использующая смарт-часы и Bluetooth-маячки для отслеживания передвижения и другой активности сотрудников компании. Смарт-часы определяют местоположение сотрудника и анализируют, носит ли его нужный человек, спит ли сотрудник или работает. Данные передаются в мобильное приложение, которое устанавливается и настраивается на телефоне работодателя. Приложение работает на Node.js.

Зачем и как строить Интернет вещей с Node.js
Зачем и как строить Интернет вещей с Node.js

Таким образом, менеджеры могут отслеживать своих сотрудников в режиме реального времени, сразу же найти нужного им человека и оптимизировать рабочее пространство. Кроме того, в конце недели работодатель получает обширный отчет о деятельности сотрудников. Все это помогает повысить производительность и продуктивность компании.

Зачем и как строить Интернет вещей с Node.js

Такое решение может не подойти бизнесу с небольшим офисом и гибким графиком работы. Тем не менее, оно отлично подходит для промышленных предприятий, строительных площадок, фабрик, складов, торговых центров, супермаркетов, гостиниц, охранных агентств, ресторанов и магазинов. То есть везде, где работодателю необходимо знать, не приходят ли сотрудники слишком поздно или рано, их местоположение, активность работы в течение дня, следование расписанию.

PREE – поиск ваших вещей

PREE – система Bluetooth-маячков и мобильное приложение, помогающее людям перестать терять свои вещи. Это помощник для тех, кто часто забывает телефон, сумку, ключи, бумажник или любые другие ценные аксессуары.

Зачем и как строить Интернет вещей с Node.js

Пользователь видит местонахождение своего предмета в режиме реального времени и делится им с доверенными контактами. Как только предмет окажется вне досягаемости, он получит уведомление, так же как и его друзья или члены семьи. Чтобы уведомления не отвлекали, их можно отключить для определенной области.

Эта система IoT построена на Node.js, Express и Mongo на бэкенде и Ionic с Cordova на фронтенде.

***

Если статья вас убедила в выборе платформы для серверной части IoT, Библиотека программиста подготовила еще несколько популярных статей по Node.js:

А по Интернету вещей у нас даже есть отдельный тег IoT.

Источники

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ