NNNet

Проект для школьного офлайн-месседжера на базе BLE P2P mesh-сети.

Цель

Создать систему общения между учениками и учителями без зависимости от интернета:

  • обмен сообщениями в пределах школы;
  • работа в условиях отсутствия Wi-Fi/мобильной сети;
  • безопасное взаимодействие с базовой модерацией.

Текущее состояние

  • BLE discovery + advertising работают.
  • Реализован минимальный GATT transport для обмена mesh-пакетами.
  • Есть foreground service, Room-хранилище, ACK/retry очередь и UI в стиле Telegram.
  • Реализованы главный экран со списком чатов, отдельный экран диалога, меню три точки -> Настройки, ручная проверка обновлений и опциональная автопроверка через version.json.
  • При выключенном 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-приложения

  1. BLE Transport Layer

    • сканирование соседей;
    • реклама (advertising) своего присутствия;
    • установление BLE-соединений;
    • отправка/приём фрагментированных пакетов.
  2. Mesh Routing Layer

    • пересылка пакетов с TTL;
    • фильтрация дублей;
    • политика повторных отправок.
  3. Messaging Layer

    • личные сообщения;
    • список чатов и отдельный экран диалога;
    • статусы доставки (queued/sent/relayed/delivered).
  4. Data Layer

    • локальное хранилище (Room);
    • история сообщений и очередь исходящей доставки.
  5. Security Layer

    • идентификация пользователя;
    • шифрование сообщений (напр. E2E для приватных чатов);
    • защита от подмены/повтора пакетов.

Этапы разработки (Roadmap)

  1. Подготовка Android-проекта на Kotlin + Gradle.
  2. Реализация BLE-обнаружения и рекламы узлов.
  3. Реализация протокола пакетов (формат, TTL, ACK, дедупликация).
  4. Базовый mesh-relay между 3+ устройствами.
  5. Экран чатов и отправка текстовых сообщений.
  6. Локальная БД (Room) и история сообщений.
  7. Минимальное шифрование и валидация пакетов.
  8. Тестирование в школьном сценарии (коридоры/классы/этажи).
  9. Создание сайта проекта с описанием и кнопкой скачивания APK.
  10. Подготовка релиза и документации для пилотного запуска.

Задачи (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 и базовую схему хранения.
  • Добавить логирование сети и 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, увеличить версию, собрать debug APK и создать 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.
  • Для школы такая схема подходит как офлайн-сеть без интернета, но для больших нагрузок всё равно понадобятся дополнительные оптимизации маршрутизации, дедупликации и доставки.
Description
Mesh P2P сеть на базе BLE.
https://net.nnn-team.pro
Readme 186 KiB
Languages
Kotlin 84.6%
HTML 4.7%
Shell 3.9%
JavaScript 3.5%
Makefile 2.6%
Other 0.7%