11 KiB
11 KiB
NNNet
Проект для школьного офлайн-месседжера на базе BLE P2P mesh-сети.
Цель
Создать систему общения между учениками и учителями без зависимости от интернета:
- обмен сообщениями в пределах школы;
- работа в условиях отсутствия Wi-Fi/мобильной сети;
- безопасное взаимодействие с базовой модерацией.
Текущее состояние
- BLE discovery + advertising работают.
- Реализован минимальный GATT transport для обмена mesh-пакетами.
- Есть foreground service, Room-хранилище, ACK/retry очередь и UI в стиле Telegram.
- Реализованы главный экран со списком чатов, отдельный экран диалога, меню
три точки -> Настройки, ручная проверка обновлений и опциональная автопроверка черезversion.json. - В меню
три точкидоступныКарта сети,ПакетыиНастройки. - Добавлены профили пользователей:
firstName,lastName,username, описание, локальное редактирование профиля и поиск профиля поusername. - Профили распространяются как mesh-пакеты и кэшируются узлами локально; по найденному
usernameможно получитьpeerId. - В настройки добавлены диагностические режимы: карта сети и журнал исходящих, входящих и транзитных пакетов.
- Обновление приложения выполняется через APK во временном каталоге: проверка версии, скачивание, остановка mesh и запуск системной установки через
Intent. - При выключенном Bluetooth приложение запрашивает его включение перед запуском mesh.
- Публикация APK и сайта автоматизирована через
Makefile. - Проект и Android-приложение приведены к имени
NNNet, пакет приложения:pro.nnnteam.nnnet.
Стек
- Android приложение: Kotlin
- Сборка: Gradle +
Gradle Wrapper - Промо/лендинг сайт: HTML + CSS + JS + Bootstrap + Bootstrap Icons
Концепция сети
- Устройства действуют как BLE-ноды.
- Сообщения передаются hop-by-hop (mesh-подход).
- Каждый пакет имеет
messageId,ttl,senderId,timestamp. - Узлы хранят кратковременный кэш, чтобы избегать дубликатов.
- Доставка подтверждается ACK-пакетами.
Основные компоненты Android-приложения
-
BLE Transport Layer
- сканирование соседей;
- реклама (advertising) своего присутствия;
- установление BLE-соединений;
- отправка/приём фрагментированных пакетов.
-
Mesh Routing Layer
- пересылка пакетов с TTL;
- фильтрация дублей;
- политика повторных отправок.
-
Messaging Layer
- личные сообщения;
- список чатов и отдельный экран диалога;
- статусы доставки (queued/sent/relayed/delivered).
-
Data Layer
- локальное хранилище (Room);
- история сообщений, очередь исходящей доставки, каталог профилей и журнал пакетов.
-
Security Layer
- идентификация пользователя;
- шифрование сообщений (напр. E2E для приватных чатов);
- защита от подмены/повтора пакетов.
Этапы разработки (Roadmap)
- Подготовка Android-проекта на Kotlin + Gradle.
- Реализация BLE-обнаружения и рекламы узлов.
- Реализация протокола пакетов (формат, TTL, ACK, дедупликация).
- Базовый mesh-relay между 3+ устройствами.
- Экран чатов и отправка текстовых сообщений.
- Локальная БД (Room) и история сообщений.
- Минимальное шифрование и валидация пакетов.
- Тестирование в школьном сценарии (коридоры/классы/этажи).
- Создание сайта проекта с описанием и кнопкой скачивания APK.
- Подготовка релиза и документации для пилотного запуска.
Задачи (Backlog)
- Инициализировать Android-проект (
appмодуль + базовый каркас репозитория). - Добавить Android-модули
domain,data,mesh. - Настроить
minSdkи базовые BLE-permissions. - Добавить foreground service для фоновой mesh-работы.
- Описать формат сетевого пакета (черновой JSON codec + модель пакета).
- Реализовать базовый BLE bootstrap (scanner + advertiser + runtime permissions).
- Реализовать минимальный GATT-обмен между BLE-узлами.
- Реализовать очередь отправки + ретраи + ACK timeout.
- Добавить защиту от дубликатов по
messageId(in-memory cache, базово). - Реализовать mesh-forwarding с ограничением TTL (routing action layer, базово).
- Добавить список чатов и базовый UI окна сообщений.
- Перенести настройки в меню
три точкии убрать debug-лог из пользовательского интерфейса. - Подключить Room и базовую схему хранения.
- Реализовать базовую регистрацию пользователя (локальный профиль).
- Добавить кэш профилей из mesh-сети и поиск по
username. - Добавить журнал исходящих, входящих и транзитных пакетов.
- Добавить режим карты сети в настройках.
- Добавить логирование сети и debug-экран маршрутов.
- Добавить ручную проверку обновлений и опциональную автопроверку клиента.
- Добавить шифрование полезной нагрузки сообщений.
- Написать инструментальные тесты BLE-обмена.
- Создать сайт (
index.html,styles.css,app.js) на Bootstrap. - Добавить страницу скачивания APK и раздел документации.
- Подготовить CI-сборку (Gitea Actions
assembleDebug). - Собрать и опубликовать debug APK на сайте проекта.
Предлагаемая структура репозитория
android/— Android-приложение (Kotlin + Gradle)website/— сайт проекта (HTML/CSS/JS + Bootstrap)docs/— документация протокола и архитектуры
Автоматизация
make client-build RELEASE_NOTES='- пункт 1\n- пункт 2'— обновитьrelease-notes.txt, увеличить версию, собратьdebugAPK и создать git-тегvX.Y.Z.make client-tag— создать git-тег для текущей версии вручную.make client-publish— опубликовать собранный APK на сайт и обновитьversion.json.make publish RELEASE_NOTES='- пункт 1\n- пункт 2'— обновить release notes, увеличить версию, собрать APK, опубликовать клиент и перезагрузитьnginx.- Вместо
RELEASE_NOTESможно передатьRELEASE_NOTES_FILE=/path/to/file. make server-start|server-stop|server-restart|server-status|server-rebuild— управлениеnginx.
Лицензия
Проект использует лицензию GPL-3.0. См. LICENSE.
Ближайший следующий шаг
Добавить шифрование payload и инструментальные тесты BLE-обмена между несколькими устройствами.
Ограничения сети
- Выделенный хост для NNNet не нужен: сеть строится как P2P mesh между устройствами.
- Все узлы равноправны на уровне текущей архитектуры: каждое устройство может обнаруживать соседей, принимать и ретранслировать пакеты.
- Количество пользователей не бесконечно. Практический предел зависит от плотности устройств, качества BLE-эфира, числа одновременных соединений, частоты ретрансляции и ограничений батареи Android.
- Каталог профилей хранится распределённо: каждый узел кэширует увиденные профильные пакеты, поэтому поиск по
usernameзависит от того, успел ли профиль распространиться по mesh. - Для школы такая схема подходит как офлайн-сеть без интернета, но для больших нагрузок всё равно понадобятся дополнительные оптимизации маршрутизации, дедупликации и доставки.