Мы продолжаем рассказывать о выпускных проектах слушателей наших образовательных проектов. В этом выпуске мы расскажем про три проекта по дисциплине «Разработка на С++» в Технопарке. Предыдущие публикации: один, два, три, четыре.
Для студентов Технопарка эта работа — первый опыт проектной деятельности в рамках образовательной программы. Далее они столкнутся с такой задачей во втором и выпускном семестре.
JunTracker — CRM для школ дополнительного образования
Авторам проекта хотелось сделать что-то полезное, что могло бы использоваться в реальной жизни. Один из студентов работал в школе дополнительного образования преподавателем по робототехнике, программированию и 3D-моделированию. В Excel было сделано и расписание, и учёт финансов, и журнал с оценкам студентов. Всё это было очень неудобно воспринимать, да и родителям не покажешь. Так возникла идея сделать удобный сервис для подобных школ, позволяющий составлять расписание, следить за финансами школы и вести электронный журнал для учеников. При этом сервис должен быть с разделением прав.
CRM написали за семестр с нуля. Сделали многое, но кое-что не успели. В следующем семестре авторы сделают вторую версию с фронтендом на React и сервером на Go.
Левая часть предназначена для администратора школы, а справа отображается вся информация о текущем дне. В базе учеников можно искать по имени и фамилии.
У каждого ученика есть личная карточка со статистикой:
Архитектура CRM выглядит так:
Фронтенд написан на JS, HTML и CSS. В нём использованы паттерны State и «компоновщик». В шаблонизаторе использован синтаксис Django и паттерн «фабрика». В сервере использован паттерн «посредник». Для работы с базой данных PostgreSQL авторы написали обёртку.
Команда проекта: Марк Быховец, Михаил Трущелев, Тимофей Макаров, Андрей Маврин.
GitHub-репозиторий.
Видео с защиты проекта.
Настольный мессенджер JMICKHENGER
Студенты захотели попробовать свои силы в создании мессенджера, обладающего основными функциями подобных современных приложений. JMICKHENGER работает под Linux и macOS. Он умеет создавать беседы с людьми из списка контактов (поддерживает неограниченное количество пользователей в одном чате), отправлять изображения и показывать состояние сообщения (прочитано оно или нет).
Мессенджер создан с использованием таких технологий:
- OpenSSL.
- Qt — используется для отрисовки интерфейса, применён шаблон проектированиz MVC.
- Boost.
- MongoDB.
- SQLite.
Общая архитектура системы:
На стороне приложения находится библиотека сетевой части. Как только пользователь взаимодействует с приложением, вызывается определенная функция клиента. И в зависимости от действия передается callback с нужной функциональностью, которая выполнится после того, как сетевая часть обработает ответ от сервера или уведомит модель об ошибке. При неверных действиях приложение обработает и уведомит пользователя о неточности введенных данных или других действиях (неправильный логин или пароль, уже зарегистрированный пользователь, несуществующий друг, или друг уже есть в списке, и т. п.). Количество запросов к серверу уменьшено: выделяются уникальные ID для уведомления всех пользователей в чате, которые используются вместо запросов. Есть защита от нетерпеливых пользователей: бесполезно кликать много раз по одной и той же кнопке, каждый раз отправляя запрос, в надежде поскорее получить ответ от сервера :)
Сетевая часть взаимодействует с удаленным сервером. Асинхронный клиент работает в отдельном выделенном потоке и написан с использованием Boost Asio. Клиент поддерживает TLS-соединение с сервером. Формат обмена данными — JSON. Для обеспечения безопасности использован OpenSSL. Взаимодействие с сетевой частью происходит с помощью callback’ов. Некоторые callback’и выполняются однократно после прихода ответа от сервера, другие же устанавливаются на всё время работы приложения и срабатывают при каждом получении определенной информации от сервера (аналог observer в Google Firestore). Для некоторой информации, которая редко обновляется, реализован кэш с использованием SQLite.
Асинхронный TCP-сервер тоже написан с использованием Boost Asio и OpenSSL. Сервер идентифицирует подключения с уникальными ID, и с помощью очереди запросов делегирует их выполнение экземпляру класса бизнес-логики. Также авторы с помощью библиотеки mongocxx написали класс-обёртку для работы с MongoDB. При его создании была использована библиотека mongocxx. Бизнес-логику можно условно разделить на три части: получение запроса от клиента в виде JSON’а и его парсинг; работа с базой данных и, в некоторых случаях, проверка их правильности; формирование ответа клиенту. Кроме того, бизнес логику реализовали в виде динамической библиотеки, чтобы удобнее было объединять её с частями сервера.
Схема обмена данными между клиентом и сервером:
А так устроен обмен данными с базой:
Команда проекта: Константин Павлов, Сергей Алексеев, Николай Манзеев, Никита Щелканов.
GitHub-репозиторий.
Видео с защиты проекта.
Система штрих-кодирования
Авторы сделали систему для штрих-кодирования для предприятий, выпускающих всевозможную электронику. Система умеет автоматически учитывать продукцию, контролировать прохождение изделиями различных этапов технологического процесса, и позволяет повысить автоматизацию производства.
Система снижает нагрузку по контролю за производством изделий. Вся актуальная информация доступна в онлайне. Также система исключает человеческие ошибки при подсчёте изделий на разных этапах производства.
Схема работы:
Клиентское ПО позволяет генерировать штрих-коды и регистрировать в базе данных на сервере производимую продукцию. Исполнители с помощью беспроводных сканеров считывают штрих-коды, нанесённые на упаковку или сами изделия. Сканер отправляет информацию о считанном штрих-коде и просит БД зарегистрировать новое изделие.
Для работы системы необходим беспроводной сканер штрих-кодов, вроде такого:
Особенности встроенного ПО:
- Суперсовременная IDE, поддерживающая исключительно язык С.
- Частично задокументированный API на языке С для сканирования и работы с клавишами, дисплеем, лампочками, WiFi, внутренним хранилищем.
- Есть утилита для загрузки прошивки в память.
Чтобы подружить сканер со своей системой штрих-кодирования, авторы проекта провели обратный инжиниринг IDE. Выяснилось, что устройство оснащено микроконтроллером STM32F103xx с ядром ARMv7-M. Также удалось найти статическую библиотеку с бизнес-логикой для обработки API-вызовов.
Инструменты, применявшиеся для разработки системы:
- cc-arm-none-eabi (GNU ARM Toolchain) — набор средств для разработки под архитектуру ARM (компиляторы С, С++, ASM; ld, objdump).
- linker-script — для разметки Flash и RAM.
- cmake в качестве системы сборки + cmake toolchain file для кросс-компиляции под микроконтроллеры STM32 (спасибо репозиторию https://github.com/ObKo/stm32-cmake)/
- Спецификации, документация, Stackoverflow, тематические форумы.
Пришлось написать такие модули:
- Класс-обёртку для взаимодействия с пользователем через клавиши.
- «GUI» для работы с пользователем.
- Стек TCP-HTTP-JSON над реализованным в API сканера IP-уровнем.
- Класс-обёртку над API сканера для сканирования штрих-кодов и получения результатов сканирования.
Далее команда написала клиентское ПО, которое позволяет:
- Авторизовать пользователя.
- Просматривать все модели изделий и информацию о них.
- Просматривать все устройства.
- Добавлять устройства.
- Добавлять модели.
- Генерировать штрих-код для модели.
- Печатать штрих-код на принтере
- Сохранять штрих-код в файл.
Это ПО написали с помощью:
- QtCreator (графический интерфейс).
- Boost (реализация сетевого взаимодействия и парсинг JSON).
- Библиотеки для преобразования идентификатора изделия в штрих-код.
HTTP-сервер создан с использованием Boost.beast, MySqlCppConnector, Boost.thread и OpenSSL. Его задачи:
- Получение HTTP-запросов.
- Обращение к базе данных.
- Аутентификация пользователя/сканера.
- Регистрация пользователя/сканера.
- Генерирование уникальных QR-кодов.
- Отправка HTTP-ответов.
В роли БД выступает MySQL.
Архитектура сервера и базы данных:
Команда проекта: Даниил Черный, Николай Умрихин, Сергей Чепурной.
Видео с защиты проекта.
Подробнее о наших образовательных проектах вы можете почитать по этой ссылке. И почаще заходите на канал Технострим, там регулярно появляются новые обучающие видео о программировании, разработке и других дисциплинах.
iit
В мою молодость все студенты вместо CRM писали CMS
Вместо чатов — форумы
Вместо штрих-кодов QR-коды
А так забавно ...