В современном мире технологии играют всё более важную роль в обучении и развитии детей. Проект "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
Заказчик сократил восемь китайцев, которые пытались безуспешно реализовать серверную часть в течение пяти лет. После того как я справился с этой задачей всего за две недели.

Комментарии (0)