Как R&D проект помог организовать посещение офиса во время карантина, соблюдая основные карантинные требования
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Это история развития одного R&D-проекта, который помог специалистам компании ELEKS легко адаптироваться в период карантина и посещять офис при существующей необходимости, придерживаясь всех ограничений, установленных на уровне страны.
Вспомним докарантинное время: большинство IТ-компаний уже практиковали удаленную работу, но это не было на постоянной или продолжительной основе, так как терялся весь смысл «плюшек» (спортзал, массаж, развлекательно-игровые комнаты, йога и медитация, атмосфера стендапов и многое другое), которые являлись важным фактором для специалистов при выборе компании. Конечно, часть этого удалось виртуализировать и предоставить специалистам в качестве сервисов, чтобы как-то сгладить недостаток, но все же...
Мы стали обдумывать план, как выполнить все карантинные ограничения, учитывая возможность физического присутствия огранниченного колличества людей в офисе (сейчас это не более 10%) на своих рабочих местах. Запустили проект Back2Office, который должен был помочь его реализовать. Первую версию проекта сделали из «подручных» средств, чтобы минимизировать затраты и время на разработку. Поэтому Back2Office появился с использованием Jira Workflow, а организационные процессы выполнялись полуавтоматически.
Параллельно мы запустили создание специальной системы, которая автоматизирует весь цикл работы Back2Office. И в этот момент пригодился R&D-проект. Создан первоначально для других целей, он на 90% покрыл все требования для реализации Back2Office. А именно:
1. Бронировать рабочие места в офисе с указанием места и времени пребывания.
2. Учитывать карантинный лимит одновременного нахождения специалистов в помещении.
3. Управлять загрузкой рабочих мест, предоставляя командам безопасное пребывание в офисе.
4. Визуализировать схему рабочих мест для просмотра в реальном времени.
5. Интеграция с пропускной системой компании.
В результате R&D-проект помог решить такие проблемы, как:
- поиск необходимой комнаты в большом офисе, особенно, когда специалисты впервые его посещают;
- управление свободными рабочими местами;
- автоматизация процесса перемещения специалистов;
- бронирование комнат для встреч, переговоров.
Если рассматривать технические аспекты, то решение построили на архитектуре монолита с использованием гибридного подхода облачных и внутрикорпоративных сервисов.
Первое, что необходимо было выбрать, — стек технологии на разных уровнях приложения, которые позволяют максимально гибко разрабатывать и легко интегрироваться с разными сервисами, учитывая цели и требования решения. Как и любая монолитная архитектура, включает в себя уровни или слои приложения. Самый нижний — уровень данных.
Для хранения и работы с нереляционными данными выбрали платформу MongoDB. Она помогла аккумулировать информацию о бронировании, координатах расположения рабочих мест на одной локации, что в свою очередь упростило разработку с использованием MongoDB API.
Серверную часть решения написали на Node.js с применением родного драйвера API и MongoClient для гибкой работы по созданию различных запросов и реализации CRUD операций с данными.
Далее нужно было определиться с инструментами авторизации. Так как компания используетAzure AD для большинства внутренних и внешних сервисов, выбор стал очевиден. Основной задачей было организовать поддержку единой точки входа (SSO), двухфакторную авторизацию (MFA) и всех политик использования безопасности работы данной системы.
Microsoft предлагает широкий спектр процессов авторизации, с которыми можно ознакомится здесь. Мы выбрали библиотеку msal.js. Она позволяет разрабатывать на разных платформах и гарантирует использование двухфакторной авторизации, что является критичным для безопасности. Для клиентской части использовали React. Подход выбрали Implicit flow, поскольку только он поддерживался в связке с React и msal.js.
Для использования Implicit flow необходимо всего лишь зарегистрироваться в Azure AppRegistration и включить опцию.
Но после осуществления данного подхода столкнулись с тем, что процесс авторизации оказался не столь безопасным, и вся информация о пользователе и его полученном bearer токене хранилась в локальном хранилище или сессии браузера.
Вот этот провайдер, который необходимо было взять в работу. У него один из параметров cacheLocation.
Поэтому мы решили использовать иной подход авторизации authorization code flow, который позволял бы проходить всю авторизацию на стороне сервера, то есть Node.js, и не сохранял при этом данные пользователя или ключи на стороне браузера. Новый подход не был до конца реализован в библиотеке msal.js и нам пришлось разработать собственный интерфейс.
Также хотелось бы подчеркнуть проблему бронирования митинг-комнат, которая заключалась не в конкретном бронировании, а в эффективности его использования. К примеру, намечается встреча и необходимо на определенное время забронировать комнату, но потом встречу по различным причинам переносят или она заканчивается раньше. При этом бронь остается в системе, комната простаивает, и никто не может ею воспользоваться. Мы придумали сценарий, чтобы автоматически освобождать комнаты. Данное решение разработали в качестве эксперимента, но оно может стать интересной идеей для других компаний, которым тоже необходимо эффективно управлять локациями для встреч.
В данной архитектуре использовали разные сервисы платформы MS Azure, что способствовалобыстрой разработке решения. Основная идея приложения — отслеживание в комнате любого движения в определенное время и проверка бронирования в календаре, что давало понять, занята ли локация. Для этого применили сенсор движения и микроконтроллер на базе ESP32, который поддерживает работу с Azure IoT SDK, позволяет нативно подключатся к Azure IoT Hub сервису по протоколу MQTT и передавать необходимую информацию о перемещениях.
// initialization
CONNECTTION_STRING = «HostName=XXX;DeviceId=YYY;SharedAccessKey=ZZZ»;
iot_hub_client_handle = IoTHubClient_LL_CreateFromConnectionString(CONNECTTION_STRING, MQTT_Protocol));
IoTHubClient_LL_SetMessageCallback(iot_hub_client_handle, OnMessageCallback, &receive_context);
// receive message (cloud-to-device)
static IOTHUBMESSAGE_DISPOSITION_RESULT OnMessageCallback(
IOTHUB_MESSAGE_HANDLE message, void* user_context)
{
...
IoTHubMessage_GetByteArray(message, (const unsigned char**)&buffer, &size);
...
}
// send message (device-to-cloud)
...
event_instance->messageHandle =
IoTHubMessage_CreateFromByteArray((const unsigned char*)buffer, size));
IoTHubClient_LL_SendEventAsync(
iot_hub_client_handle, event_instance->messageHandle, confirmation_callback, event_instance);
...
Для микроконтроллера разработали приложение, чтобы учитывать погрешности, например, если кто-то случайно зашел в комнату и вышел или, если в комнате есть окна, замечено движение в нем.
Дальше по процессу необходимо обработать полученную информацию и передать ее в веб-интерфейс. Для этого использовали Azure Functions, которые позволяют создавать триггеры и следить за появлением новых сообщений в Azure Event Hub, а также срабатывать только тогда, когда это необходимо.
def main(req: func.HttpRequest) -> func.HttpResponse:
room = req.params.get(’room’)
block_blob_service = BlockBlobService(account_name=’roomstatestorage’, account_key=’)
msg = block_blob_service.get_blob_to_text(’rooms’, room)
msg_to_json = json.loads(msg.content)[0]
time_utc = msg_to_json.get(’time_utc’)
datetime_object = datetime.strptime(time_utc[:-1], «%Y-%m-%d %H:%M»)
minutes_diff = (datetime.utcnow() - datetime_object).seconds/60
if minutes_diff > m_delay:
return func.HttpResponse(f’True’)
else:
return func.HttpResponse(f’False’)
Вся новая информация о движениях обрабатывалась и сохранялась в Blob для дальнейшего использования.
Веб-приложение отображало наличие свободных комнат, а также отправляло уведомления пользователям о том, что комната освободилась и ее можно использовать.
Данное решение упростило процесс пребывание специалистов в офисе ELEKS, позволило эффективно использовать комнаты встреч, а также автоматизировало ряд рабочих моментов, связанных с безопасной работой в компании. Сейчас решение проходит стадию тестирования и план по развертыванию на всю компанию.
7 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів