Pull to refresh
2935.24
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Раздача файлов на смартфоны без интернета. Опенсорсные альтернативы AirDrop

Level of difficultyMedium
Reading time7 min
Views12K


Формулировка задачи. У нас есть настольный компьютер и мобильные устройства под Android. Задача простая — как быстро перебросить файлы с компьютера на телефоны и планшеты. Например, скачанные подкасты и HD-фильмы 1080p, файлы apk для установки, рабочие файлы с персоналки, бэкапы. Хранилище телефона можно использовать как резервный внешний диск или как «беспроводную» флешку, которая работает по Wi-Fi.

Конечно, можно это сделать через веб-сервисы Wormhole/PairDrop/FilePizza, через телеграм/вайбер или инструменты синхронизации ПК и смартфона, такие как syncthing. Да, это удобно и привычно. Но процесс можно 1) ускорить; 2) избавиться от подключения к интернету. То есть файлы будут передаваться напрямую между устройствами, как Apple AirDrop, только лучше.

На самом деле есть несколько способов прямой связи между устройствами, остаётся лишь выбрать самый удобный и эффективный из них.

▍ LocalSend


Например, маленькая опенсорсная программа LocalSend создана как раз для этого: передачи файлов и сообщений между устройствами в локальной сети без использования интернета. «Локальная сеть» подразумевает в том числе подключение к общественному хотспоту или если хотспот запущен на одном из смартфонов (без отдельного маршрутизатора).



Есть версии под Windows, macOS, Linux, Android (Play Store, F-Droid, APK), iOS и даже Fire OS. Большой набор поддерживаемых платформ и способов распространения — одно из главных преимуществ программы. То есть она поддерживает прямую передачу файлов даже между смартфонами iPhone и Android, на что не способен стандартный AirDrop.

Нам нужны первый и четвёртый варианты. Скачиваем EXE (12,4 МиБ) и APK (33,1 МиБ), устанавливаем их под Windows и Android.

Интересный факт. Программа использует фреймворк Flutter, а после сборки выходит так, что билд под Android весит в 2,67 больше, чем под Windows. То есть мобильное приложение намного «жирнее», чем версия для ПК. Хотя по логике должно быть наоборот… Казалось бы, программа простенькая, и раньше умещались в 400−500 КБ. Такие уж сейчас времена, что и процессоры в смартфонах становятся мощнее десктопных, и памяти много — вот и приложения разжирели.

Использование фреймворка Flutter несёт в себе и другие специфические недостатки. Например, под Linux есть проблема с уходом компьютера в спящий режим при запущенном LocalSend, а GUI-интерфейс потребляет большое количество вычислительных ресурсов. Flutter по сути постоянно перестраивает структуры данных для текущего вида со скоростью 60 FPS, непрерывно запуская тонны alloc/dealloc с постоянным выполнением кода.

Возможно, некоторые баги пофиксят в будущих версиях Flutter, так что они автоматически исправятся во всех программах, которые используют этот фреймворк.

На главном экране три кнопки: «Получить», «Отправить» и «Настройки»:



Версия под Android такая же простая:



Сразу после установки приложение рассылает по мультикасту UDP в локальной сети следующее сообщение:

{
  "alias": "Nice Orange",
  "version": "2.0", // protocol version (major.minor)
  "deviceModel": "Samsung", // nullable
  "deviceType": "mobile", // mobile | desktop | web | headless | server, nullable
  "fingerprint": "random string",
  "port": 53317,
  "protocol": "https", // http | https
  "download": true, // if the download API (5.2 and 5.3) is active (optional, default: false)
  "announce": true
}

Остальные LocalSend-серверы сразу видят нового «собрата» и отправляют ему соответствующие данные в ответ:

POST /api/localsend/v2/register

{
  "alias": "Secret Banana",
  "version": "2.0",
  "deviceModel": "Windows",
  "deviceType": "desktop",
  "fingerprint": "random string", // ignored in HTTPS mode
  "port": 53317,
  "protocol": "https",
  "download": true, // if the download API (5.2 and 5.3) is active (optional, default: false)
}

Соответственно, после установки программы на смартфоне и ПК все устройства сразу видят всех остальных.

Дефолтная группа для мультикаста 224.0.0.0/24, потому что некоторые Android-устройства работают строго с таким диапазоном. Мультикаст UDP идёт по порту 53317 с адреса 224.0.0.167.

Если мультикаст UDP по какой-то причине не работает, то на все локальные IP-адреса рассылаются сообщения по HTTP.

Ставим программу в автозагрузку, указываем прятаться трей и включаем опция «Быстрое сохранение», чтобы все файлы принимались автоматически и сохранялись в указанную папку. Да, это немного неправильно с точки зрения безопасности, зато очень удобно. Опция отключена по умолчанию.

Теперь отправка файлов между девайсами становится банальной процедурой.



Коммуникация осуществляется по проприетарному протоколу LocalSend Protocol v2 через REST API, все данные передаются по HTTPS, для каждого устройства на лету генерируется сертификат TLS/SSL.

Файлы передаются по HTTP. По умолчанию используется способ передачи от клиента на сервер, то есть на стороне получателя работает HTTP-сервер. Сначала отправляются метаданные, включая fileId:

POST /api/localsend/v2/prepare-upload

Запрос:

{
  "info": {
    "alias": "Nice Orange",
    "version": "2.0", // protocol version (major.minor)
    "deviceModel": "Samsung", // nullable
    "deviceType": "mobile", // mobile | desktop | web | headless | server, nullable
    "fingerprint": "random string", // ignored in HTTPS mode
    "port": 53317,
    "protocol": "https", // http | https
    "download": true, // if the download API (5.2 and 5.3) is active (optional, default: false)
  },
  "files": {
    "some file id": {
      "id": "some file id",
      "fileName": "my image.png",
      "size": 324242, // bytes
      "fileType": "image/jpeg",
      "sha256": "*sha256 hash*", // nullable
      "preview": "*preview data*" // nullable
    },
    "another file id": {
      "id": "another file id",
      "fileName": "another image.jpg",
      "size": 1234,
      "fileType": "image/jpeg",
      "sha256": "*sha256 hash*",
      "preview": "*preview data*"
    }
  }
}

Сервер отвечает с указанием sessionId и специфического токена для конкретного файла:

{
  "sessionId": "mySessionId",
  "files": {
    "someFileId": "someFileToken",
    "someOtherFileId": "someOtherFileToken"
  }
}

Ну а дальше клиент отправляет файлы на сервер через POST-запрос, причём несколько потоков можно запускать параллельно:

POST /api/localsend/v2/upload?sessionId=mySessionId&fileId=someFileId&token=someFileToken

Но возможен и альтернативный метод: если на стороне получателя нет сервера LocalSend, то сервер запускается на стороне отправителя и генерирует URL для подключения (http://<sender-ip>:<sender-port>). Или к серверу (отправителю) можно направить запрос на получение списка с метаданными файла.

Кроме отдельных файлов, поддерживается отправка целиком папки, текста или содержимого буфера обмена. Скорость передачи ограничена максимальной скоростью сетевых интерфейсов в локальной сети на маршруте передачи (сетевая карта ПК — маршрутизатор — смартфон), а также дополнительными настройками.

Есть опция рассылки на несколько устройств в локальной сети (смартфоны, планшеты, ноутбуки), что очень удобно, если у вас большая семья, а вы хотите быстро поделиться файлами со всеми:



Как вариант, можно поделиться локальной ссылкой на файл:



По умолчанию LocalSend шифрует файлы при передаче (HTTPS). Если опция кажется излишней, можно отключить её в «Дополнительных настройках»:



И вишенка на торте — отправка сообщений:



В большинстве случаев LocalSend работает «из коробки». В отдельных ситуациях нужно изменить настройки файрвола, чтобы он пропускал трафик программы: в частности, входящий трафик TCP, UDP на порт 53317. Кроме того, должна быть выключена настройка «Изоляция точки доступа» (AP Isolation), которая позволяет изолировать устройства, подключённые к одной сети. Эта настройка и так выключена по умолчанию в большинстве маршрутизаторов, но где-то кто-то может её активировать по какой-то причине.

Из минусов LocalSend можно отметить довольно низкую скорость передачи файлов — ниже, чем у LANDrop, а тем более croc.

Теоретически, если оба устройства поддерживают Wi-Fi, то можно было бы задействовать Wi-Fi Direct, то есть прямой пиринговый Wi-Fi. Будем надеяться, что со временем больше оборудования и программного обеспечения внедрит поддержку Wi-Fi P2P API, потому что сейчас эти интерфейсы мало кто использует.

▍ LANDrop


Ещё одно похожее приложение — LANDrop. Это тоже кроссплатформенная программа с клиентами под iOS, Android, macOS, Windows и Linux. По сравнению с LocalSend демонстрирует более высокую скорость передачи, портативный клиент под Windows запускается без предварительной установки, а интерфейс тут ещё проще: добавляем файлы в окно и выбираем устройство в локальной сети, на которое их отправить.



▍ croc


Зачем графический интерфейс, если файлы можно отправлять из консоли? Так решили разработчики croc, улучшенной версии классического концепта Magic-Wormhole. В табличке из презентации 2016 года разные способы обмена файлами сравниваются по простоте и безопасности:



Это считается самая быстрая и функциональная консольная утилита для файлообмена между компьютерами под Linux, Windows и MacOS (смартфоны не поддерживаются, но мы добавили её в обзор для разнообразия).



▍ Другие


Вместе с упомянутыми выше, список опенсорсных программ для пиринговой передачи файлов включает в себя следующие.

▍ Веб-сервисы (через браузер)


Благодаря открытому коду большинство этих сервисов можно разместить на своём хостинге. Если это веб-сервер в локальной сети, то по сути при передаче файлов трафик тоже будет внутренним, без выхода в интернет.

  1. Web Wormhole
  2. ToffeeShare
  3. FilePizza
  4. ShareDrop
  5. Instant.io
  6. file ai
  7. Send Anywhere
  8. JustBeamIt
  9. Yt2fb.in
  10. drop.lol
  11. Filepush (передача через Web Push и WebRTC)
  12. Wormhole
  13. Pixeldrain
  14. Send (форк закрытого сервиса Firefox Send, который Mozilla прекратила поддерживать)

▍ Нативные программы


  1. LANDrop
  2. croc
  3. Payload
  4. p2pcopy
  5. pcp
  6. wormhole-william (реализация Magic-Wormhole)
  7. FlyingCarpet



▍ Вывод


По итогу можно сделать вывод, что прямая передача файлов между устройствами — довольно простая в реализации вещь. Аналогичная функция Android называется Quick Share, а благодаря опенсорсным инструментам можно легко передавать файлы между устройствами на разных платформах. Даже странно видеть, что кто-то в 2024 году вообще рассматривает AirDrop как конкурентное преимущество Apple, тем более у AirDrop проблемы с приватностью, а сама технология остаётся проприетарной. Если она отказываться работать по непонятной причине, у нас просто нет шансов выявить баг, в отличие от опенсорсных программ.

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Tags:
Hubs:
Total votes 41: ↑40 and ↓1+57
Comments68

Articles

Information

Website
ruvds.com
Registered
Founded
Employees
11–30 employees
Location
Россия
Representative
ruvds