Побочный проект моей компании в области Интернета вещей (IoT) начался, когда мы не смогли сбросить дверной замок, унаследованный от предыдущего арендатора. Это была одна из тех незначительных деталей, о которых мы узнали после переезда в наш новый офис в последнюю минуту.

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

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

Пока что в нашем эксперименте с дверным замком мы разработали решения для интеграции со Slack, встроенных приложений для iOS и Android, Apple Watch и Pebble. Я сосредоточусь на архитектуре мобильных приложений. Я признаю, что конечный продукт немного переработан, но нам он просто нравится!

Архитектура iOS и Android

Что именно происходит, когда вы нажимаете кнопку в нашем приложении для iOS / Android? HTTP-запрос отправляется на облачный сервер, который затем отправляет сообщение демону дверного замка через клиентский сервер, который затем сообщает релейной плате открыть дверной замок.

Традиционно дверной замок открывается кнопкой рядом с дверью. Но с современными технологиями возможности выходят за рамки прямой физической кнопки. В дополнение к физической кнопке, которая запускает Doorlock Daemon на диаграмме, мы добавили два других триггера: триггер на основе облака и триггер Bluetooth с низким энергопотреблением (BLE), благодаря нашему выбору оборудования.

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

Начиная с нажатия кнопки до записи, сохраненной на сервере Skygear.

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

В облачном сервере происходят две вещи. Во-первых, запись сохраняется на выбранном нами сервере, Skygear Cloud Database, что позволяет синхронизировать ваши данные с облаком. Сервер будет регистрировать запрос доступа к двери.

После сохранения записи запускается функция after_save, предоставляемая Skygear Cloud Functions, которая запускает наш код в облаке, не беспокоясь о развертывании сервера.

Функция after_save запускается после сохранения записи . def after_open_door_save(record, original_record, db): запускается асинхронно при сохранении записи типа 'OpenDoor'. Функция публикует сообщение на канале 'xxx-channel'.

Клиент узла и сервер Clojure на Raspberry Pi

Следующим шагом будет создание слушателя запроса. Именно здесь на помощь приходят клиент Node и сервер Clojure на Raspberry Pi. Клиент Node прослушивает сообщение в указанном канале на сервере Skygear. Сервер Clojure - единственный, у которого есть право доступа к цепи Raspberry Pi 3. Затем клиент Node отправляет запрос на сервер Clojure, как только он слышит какое-либо сообщение.

Вот сценарий для клиента Node, который включает код, относящийся к нашей конкретной конфигурации для Skygear. Конечная точка и ключ API предназначены для доступа к основному серверу Skygear. skygear.on('xxx-channel', onReceiveOpenDoor) означает подписку на обратный вызов функции (onReceiveOpenDoor) при получении сообщения на 'xxx-channel' канале.

Сервер Clojure напрямую управляет вводом / выводом общего назначения (GPIO) на Raspberry Pi. GPIO - это контакты на Raspberry Pi 3. GPIO подключается к внешней цепи, которая связана с дверным магнитом.

Вот код Clojure, показывающий, как Raspberry Pi открывает дверь. Как только сервер Clojure получит запрос от клиента Node, он откроет дверь и откроет ее на 3 секунды. Однако, если в течение этих 3 секунд поступает новый запрос, дверь сбрасывает таймер на еще 3 секунды. Когда время обратного отсчета истечет, дверь снова закроется.

Случайное примечание: Skygear использует AWS в Америке, а дверь и Raspberry Pi - в Гонконге. Фактически, наш запрос ‘芝麻開門’ (Chima Open Door) путешествует по всему миру, прежде чем достигнет двери.

Почему Raspberry Pi?

Теперь вам может быть интересно, почему мы специально выбрали Raspberry Pi. Мы рассматривали возможность использования плат Arduino, потому что они у нас были в офисе. Причина, по которой мы не могли использовать нашу конкретную модель Arduino, заключалась в том, что мы хотели синхронизировать данные через Skygear JS SDK, а этот конкретный Arduino не может настроить сервер Node.

Более того, Raspberry Pi - это Bluetooth Готовность к низкому энергопотреблению (это означает, что мы можем получить доступ к дверному замку с помощью третьего метода, Bluetooth).

Дополнительные интеграции

Учитывая, что приложение предназначено только для внутреннего использования, мы запустили специальную команду Slack /chima-open-door, чтобы открыть дверь, поскольку каждый Ourskyer имеет доступ к Slack.

Позже к этому проекту подключились и другие коллеги Урского, которые помогли написать приложение WatchOS и приложение для Android, опубликованное на внутренней платформе. Помимо нажатия кнопки внутри приложения, мы также предоставляем альтернативы, такие как iOS 3D Touch, расширение Today, виджет Android и даже интеграцию Pebble, потому что некоторые из наших разработчиков используют его.

Вот и все! Прежде чем вы погрузитесь в подробности, необходимо учитывать еще два основных фактора: обратный поток электроэнергии (в данном случае для Raspberry Pi) и безопасность каждой из ваших интеграций. Например, мы также интегрировали доступ к приложениям Bluetooth с Bluetooth Low Energy (BLE), который имеет самореализованную аутентификацию, подобную 2FA. Другие возможности интеграции, которые вы можете включить, - это уведомления, когда дверь открыта (звонок, светодиод).

Если вы хотите узнать о чем-либо из вышеперечисленного, свяжитесь с нами!

Ссылка на репо / файлы
Doorlock: https://github.com/oursky/doorlock

Я хотел бы поблагодарить своих коллег Дэвида Нг, Бориса (akiroz), Брайана (b 壹 貳 參 肆 零零) и Мэй Юн за работу над приложением Android, реализацией схемы и Clojure, приложением Pebble и этой статьей в блоге соответственно. За совместную работу!

В Oursky мы все помогаем брендам и предпринимателям воплощать свои идеи в жизнь, а также помогаем коллегам-разработчикам - наш последний проект Skygear (https://skygear.io) с открытым исходным кодом (https://github.com / skygeario ) бессерверная платформа для мобильных, веб-приложений и приложений Интернета вещей - помогает быстрее создавать лучшие приложения. 😻