В современном мире технологии играют всё более важную роль в обучении и развитии детей. Проект "Animal Island Aila" — это инновационная умная система, созданная специально для малышей от 12 до 36 месяцев. Она помогает детям познакомиться с основами английского языка (цвета, формы, буквы), расширяет словарный запас и делает процесс обучения увлекательным.
В 2019 году я имел возможность участвовать в разработке этой системы. Моя задача заключалась в создании как серверной, так и клиентской части проекта.
Суть проекта
Проект "Animal Island Aila" реализован на основе клиент-серверной архитектуры и включает два отдельных приложения: одно для детей, а другое для родителей. В качестве сервера используется облачная платформа Amazon Web Services.
Приложение для детей, разработанное на Kotlin, работает на специальном Android-планшете Aila Sit & Play™. Оно демонстрирует различные обучающие видео, рассказы и колыбельные для детей.
Приложение для родителей, разработанное на Flutter и Dart, доступно для платформ Android и iOS. Оно позволяет родителям управлять детским устройством и наблюдать за детьми в реальном времени.
Архитектура серверной части
Серверная часть проекта реализована с использованием AWS Serverless, набора облачных услуг от Amazon, позволяющих разработчикам создавать и управлять приложениями без необходимости обслуживания физических серверов. Основные преимущества этой технологии включают автоматическое масштабирование, оплату только за фактическое использование ресурсов и упрощенное развертывание приложений.
Для связи клиентской и серверной части через REST API используются два экземпляра Amazon API Gateway: один для детей, другой для родителей. Amazon API Gateway — это управляемый сервис, который позволяет автоматически создавать, публиковать, поддерживать, мониторить и обеспечивать безопасность API для приложений. Он обеспечивает высокую доступность, автоматическое масштабирование и интеграцию с другими сервисами AWS, упрощая взаимодействие между клиентскими и серверными компонентами.
Логика сервера реализована на AWS Lambda с использованием Node.js. AWS Lambda — это вычислительный сервис, позволяющий запускать код без управления серверами. AWS Lambda выполняет все администрирование за вас, включая обслуживание сервера и операционной системы, выделение ресурсов и автоматическое масштабирование, мониторинг кода и ведение журнала. Это позволяет сосредоточиться на написании кода и логике приложения, а не на инфраструктуре. AWS Lambda поддерживает множество языков программирования, таких как Node.js, Python и Java, что делает его гибким инструментом для реализации серверной логики.
Для хранения данных используется Amazon DynamoDB — полностью управляемая NoSQL база данных, предлагающая быструю и предсказуемую производительность с автоматическим масштабированием. DynamoDB позволяет хранить и извлекать любые объемы данных, обеспечивая низкую задержку даже при высоких нагрузках. Данный сервис поддерживает гибкие схемы данных и предлагает встроенные функции, такие как автоматическое резервное копирование и восстановление, что делает его оптимальным выбором для современных приложений, требующих высокой доступности и масштабируемости.
Видеоуроки, рассказы и колыбельные хранятся в Amazon S3 (Simple Storage Service) — высокодоступном и масштабируемом облачном хранилище объектов. Оно обеспечивает надежность, безопасность и высокую доступность данных, поддерживая различные уровни хранения и управления доступом. S3 идеально подходит для хранения статических файлов, таких как изображения, видео и резервные копии. В данном проекте видеоуроки, рассказы и колыбельные защищены с помощью DRM и предназначены исключительно для воспроизведения на детских устройствах.
Клиентская часть
Клиентское приложение для детей разработано на языке Kotlin с использованием архитектуры MVP (Model-View-Presenter). Оно не только воспроизводит видеоуроки и колыбельные в обычном режиме, но и позволяет отображать пользовательские видео и изображения. Видео обновляются в фоновом режиме, пока воспроизводится текущий материал, что обеспечивает плавный процесс без ожидания завершения обновления. Для детей это проходит незаметно и не отвлекает их от просмотра.
Для воспроизведения видео используется библиотека ExoPlayer 2, обеспечивающая поддержку DRM и оптимизацию работы с медиафайлами, что гарантирует плавное воспроизведение.
Для работы изображениями применяется библиотека Picasso, которая эффективно управляет кэшированием и позволяет загружать изображения с различных источников, включая URL, ресурсы и файлы, что делает ее универсальным инструментом для работы с графикой.
Приложение взаимодействует с AWS IoT Services через протокол MQTT, что позволяет родителям управлять контентом и получать обратную связь в реальном времени. MQTT обеспечивает простоту использования и низкую нагрузку на сеть.
Библиотека OkHttp используется для работы с REST API, что улучшает взаимодействие с сервером, поддерживает HTTP/2 и кэширование ответов, обеспечивая быстрый доступ к контенту и устойчивость к сетевым проблемам.
Приложение для детей имеет возможность проверять и самостоятельно устанавливать обновления, что обеспечивает его актуальность и функциональность.
Кроме того, приложение реализует распознавание эмоций с помощью компьютерного зрения через камеру. Для этой задачи применяется библиотека dlib-android, а также самописная библиотека, предоставленная заказчиком.
Родительское приложение для просмотра видео в реальном времени с камеры устройства использует протокол RTSP, обеспечивая эффективное потоковое передача видео. Соединение происходит напрямую через Wi-Fi в одной сети, благодаря чему достигается минимальная задержка передачи данных. Обнаружение устройства осуществляется через Network Service Discovery (NSD), что упрощает поиск доступного детского устройства без необходимости ввода IP-адреса.
Для получения видео и его потоковой передачи используется оверлей, так как необходимо отображать SurfaceView из сервиса. Это связано с особенностями реализации библиотеки libstreaming из-за проблем с MediaCodec. Изначально это решение планировалось как временное, и мы намеревались впоследствии обойтись без него, чтобы реализовать фоновую передачу видео. Однако дети были в восторге — им нравилось видеть себя на экране. В итоге мы решили оставить оверлей в приложении.
Проблемы в разработке и их решения
В процессе разработки возникли некоторые сложности:
Проблемы с воспроизведением видео: поступали жалобы от пользователей через обратную связь о том, что часть видео не воспроизводится или вообще пропускается. При этом все видеофайлы были на месте, что указывало на отсутствие багов в приложении. В ходе моего личного расследования этой проблемы выяснилось, что некоторые устройства поступили в продажу с бракованной NAND-памятью. Для решения этой проблемы при обновлении видео контрольная сумма сверяется независимо от версии видео — это позволяет в случае повреждения локального файла автоматически скачать его заново с сервера.
Целостность данных в DynamoDB: DynamoDB не поддерживает целостность данных на уровне базы данных. Для решения этой проблемы пришлось реализовывать проверки целостности данных с помощью триггеров DynamoDB Streams.
Добавление нового поля в DynamoDB: при добавлении нового поля в схему существующие записи не содержали это поле. Чтобы избежать обновления всех записей, был использован обходной путь: при получении данных из базы, если поле контрольной суммы отсутствовало, оно создавалось, и рассчитывалась соответствующая контрольная сумма.
Заключение
Проект "Animal Island Aila" стал ярким примером того, как современные технологии могут сделать обучение детей увлекательным и эффективным.
В процессе работы я использовал современные технологии, такие как AWS Serverless на серверной стороне и Kotlin, Dart, Flutter на клиентской стороне, что позволило создать надежную и масштабируемую архитектуру. Эти инструменты помогли внедрить инновационные функции, делая обучение увлекательным и интерактивным.
PS
Заказчик сократил восемь китайцев, которые пытались безуспешно реализовать серверную часть в течение пяти лет. После того как я справился с этой задачей всего за две недели.