← На главную

Send file передаёт файлы между старыми телефонами через QR-коды

22.05.2026 11:11 · hackernews

Один HTML-файл, который работает полностью офлайн и передаёт данные между двумя устройствами через QR-коды. Инструмент создан для старых телефонов — у них часто сдохли BLE, NFC и другие радиомодули, но камера и браузер ещё живые.

Send file разбивает файл на чанки, шифрует в base64, упаковывает в QR и крутит их по циклу на заданном FPS. Сначала идёт заголовок, потом chunk1, chunk2… и так до бесконечности. Можно поставить паузу, возобновить или остановить. Опция Start from начинает цикл с конкретного фрейма — удобно, если приёмник пропустил кусок. А Show frame показывает ровно один кадр статично, чтобы переслать потерянный чанк вручную.

Receive file запускает камеру и ловит QR-коды. Заголовок детектится автоматически, прогресс-бар заполняется, а в сетке missing-chunks подсвечиваются индексы, которые ещё не доехали. Когда всё собрано, проверяется CRC файла и появляется кнопка Download.

Протокол простой: заголовок — QRX1|H|<total>|<filename>|<sizeBytes>|<crc32hex>, данные — QRX1|D|<idx>|<base64chunk>. Индексация с единицы. Base64 не содержит символа |, так что парсинг тупой — просто split('|'). Приёмник отслеживает чанки по индексу, игнорирует дубли и дедуплицирует заголовок по CRC.

Практические моменты для старых телефонов. Камере нужен HTTPS или localhost — file:// не даст разрешения на getUserMedia. Лучше запустить python3 -m http.server 8000 и открыть http://<ваш-ip>:8000/qrcode.html в локальной сети. На iOS Safari для доступа между устройствами дополнительно требуется HTTPS — поможет caddy или самоподписанный сертификат.

Если на каком-то кадре вылетает "code length overflow", надо уменьшить chunk size или понизить уровень ECC. Примерная скорость: 500 символов при 3 fps дают около 1.1 KB/s в base64, то есть 0.83 KB/s сырых данных. Файл на 100 КБ потребует примерно 2 минуты на один цикл, и обычно хватает 1–2 циклов. Если старые устройства плохо декодируют — снижайте FPS, поднимайте ECC до Q и ужимайте чанк до примерно 300 символов. Тогда QR-коды получаются меньше и не такие плотные.

Читать оригинал →