Формулировка задачи. У нас есть настольный компьютер и мобильные устройства под 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 ?

Комментарии (52)


  1. slavius
    01.04.2024 09:12
    +1

    Забыли самую простую и хабровую утилиту QRCP https://github.com/claudiodangelis/qrcp.

    Про неё даже статья была https://habr.com/ru/companies/selectel/articles/556210/

    Пользовал - нормальная скорость и удобство.


    1. crawlingroof
      01.04.2024 09:12

      не ту да ответил


    1. drygdryg
      01.04.2024 09:12

      miniserve также поддерживает эту возможность. Удобен тем, что выводит все IP-адреса, которые слушает веб-сервер.
      miniserve <файлы> --qrcode


  1. rezedent12
    01.04.2024 09:12
    +10

    На redmi 7A в версии mimu global 12.5.2 если сделать длинное нажатие по значку "Проводник" то появится меню с пунктом "FTP". И в нём можно запустить FTP-сервер.

    функция FTP на смартфоне redmi
    функция FTP на смартфоне redmi


    1. crawlingroof
      01.04.2024 09:12

      Та ну нафиг, сколько лет сяомился, не знал.
      Спасибище тебе, человечище! Хотя adb самое простое.


  1. gudvinr
    01.04.2024 09:12
    +5

    инструменты синхронизации ПК и смартфона, такие как syncthing.

    процесс можно 1) ускорить; 2) избавиться
    от подключения к интернету. То есть файлы будут передаваться напрямую
    между устройствами, как Apple AirDrop, только лучше.

    Так syncthing и работает без интернета, напрямую, если устройства в одной сети.

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

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

    Спасибо конечно, но таких вредных приложений, которые мусор в сеть выпускают, нам не надо.

    Вообще, для таких вещей (и не только для этих) есть KDE Connect, который вопреки названию, работает не только с KDE.


    1. gmtd
      01.04.2024 09:12

      Так syncthing и работает без интернета, напрямую, если устройства в одной сети.

      В принципе, без центрального (сервер в Интернет) реестра ID устройства / IP он обнаружить другое устройство не может


      1. gudvinr
        01.04.2024 09:12
        +2

        Сможет. Global discovery - это опциональная функция, хоть и включена по-умолчанию.

        Он умеет делать Local discovery через мультикасты/броадкасты


      1. NutsUnderline
        01.04.2024 09:12

        ip можно и помоь узнать, если мы говрим про свою локальную сеть то выдавать по dhcp статический, плюс локальный dns прекрасно работает


  1. HerakHerakIvProd
    01.04.2024 09:12
    +3

    А почему-бы просто не поставить ssh‑сервер и перекидывать файлы по классике через FileZilla? Пользуюсь им года с 2013


    1. unreal_undead2
      01.04.2024 09:12
      +1

      По классике - это скорее scp.


  1. economist75
    01.04.2024 09:12
    +4

    Сейчас сложно встретить компьютер без Python и тогда просто в нужной папке:

    python -m http.server 8000


    1. NutsUnderline
      01.04.2024 09:12
      +5

      А если найду? :)


      1. economist75
        01.04.2024 09:12

        На Linux не найдете - все со "змеёй".

        На Windows - придется еще проверить отсутствие python.exe на всех дисках. Дело в том что Python есть в огромном числе свободного и бесплатного ПО: OpenOffice, LibreOffice, InkScape итд (их десятки). Ну и если действительно нет то https://www.python.org/downloads/windows/

        Установка займет меньше времени, чем у меня ушло на написание этого комментария. Главное не забудьте поставить флаг Add Path при установке. Даже если прав на установку нет (ограниченная учетка или забыл пароль, злые одмины, GP) - заполучить Питон можно с portable-версией OpenOffice|LibreOffice (с офсайта 32bit или c X-LibreOffice 64bit). Это хороший путь в программирование на языке из Top-3 всех возможных чартов.


        1. NutsUnderline
          01.04.2024 09:12

          Спасибо, собственно я даже знаю где взять Python 3.12 для Windows 7 :) Но даже при этом он у меня не на всех машинах. НУ и мы тут не про программирование а про решение бытовых задач


        1. Borz
          01.04.2024 09:12

          на MacOS нет "изкоробки"

          ЗанудаВКЛ: на линухах (да и на маке) не везде python - местами уже python3 только доступен... и надо алиас делать вручную


        1. unreal_undead2
          01.04.2024 09:12
          +1

          На Linux не найдете

          В базовой инсталляции Alpine точно есть?


          1. NutsUnderline
            01.04.2024 09:12

            Можем OpenWrt попробовать.. хотя пакадж такой там точно есть, но там и нормальный вебсрвер и ftp еще проще


  1. Borz
    01.04.2024 09:12
    +3

    KDE Connect - и умеет несколько больше чем "пересылать файлики"


  1. Sasha_Black
    01.04.2024 09:12
    +3

    Warpinator забыли. А он даже работает! :-)


  1. NeoCode
    01.04.2024 09:12

    Полезная статья, спасибо! А раз уж в заголовке AirDrop, то может уважаемое Сообщество посоветует какое-то приложение - универсальный комбайн под Android, работающий со всеми AirDrop-подобными протоколами, включая и сам AirDrop? Знаю что это разработка Эппла, но неужели никто до сих пор не отреверсил протокол и не сделал совместимое приложение для Android?


    1. gudvinr
      01.04.2024 09:12

      неужели никто до сих пор не отреверсил протокол и не сделал совместимое приложение для Android?

      Да, потому что в AirDrop используется собственный проприетарный транспортный протокол, а не просто TCP/UDP поверх готового транспорта, как у всего, что в стаье есть

      https://github.com/seemoo-lab/opendrop


      1. NeoCode
        01.04.2024 09:12

        Скрипт на Питоне? Я думал что есть apk-имплементации для Android:) Интересно именно собрать все протоколы, используемые для обмена через Bluetooth, в одном мобильном приложении.


        1. gudvinr
          01.04.2024 09:12

          Имплементации нет, потому что для этого нужна имплементация транспортного протокола, что сделать в формате мобильного приложения не получится. Поэтому есть только скрипт для питона, и там явно написано, что работа возможна только в macOS и Linux


          1. NeoCode
            01.04.2024 09:12

            А почему не получится? Android же использует ядро Linux.


            1. vilox
              01.04.2024 09:12

              Если “имплементация транспортного протокола” д.б. в ядре Linux, то задача нерешаема “мобильным приложением”, т.к. ядро OS в Android можно заменить только вместе с прошивкой мобилки, что в общем случае нерешаемо. Игры с прошивками — это целый отдельный мир приложения интересов энтузиастов, туда нет захода уровня “поставь приложение”


  1. grishkaa
    01.04.2024 09:12
    +2

    Я отреверсил протокол гугловского Nearby Share/Quick Share и сделал NearDrop для macOS. Главное преимущество — ничего не надо ставить на телефон. Главный недостаток — андроид хочет для активации MDNS-сервиса, чтобы стать видимым для получения файлов, получить сигнал по блютусу (BLE), а с мака его не отправить, потому что там нельзя указать service data.


  1. 13werwolf13
    01.04.2024 09:12
    +1

    как-то несправедливо проигнорирован как в теле статьи так и в комментариях kdeconnect, а очень зря ибо эта небольшая тулза полностью покрет как вышеописанную задачу так и в целом половину "божественной" экосистемы apple не привязывая юзверя к одному сомнительному вендору


    1. Borz
      01.04.2024 09:12

      так и в комментариях

      чуть выше про него написал же


      1. 13werwolf13
        01.04.2024 09:12

        Штомш, звиняюсь. По какой-то причине я не увидел этот коммент.


  1. shares-caisson
    01.04.2024 09:12

    Tailscale для vpn'a и в нём есть taildrop, простенький кидатель файлов.


  1. alex-open-plc
    01.04.2024 09:12

    MyPhoneExplorer
    Недостаток: только для вынь+андроид.


  1. UnknownErrror
    01.04.2024 09:12

    Как это, croc не поддерживается на андроиде? Ещё как поддерживается: в Термуксе!


    1. unreal_undead2
      01.04.2024 09:12

      С термуксом и обычный/привычный scp работает )


  1. NutsUnderline
    01.04.2024 09:12
    +1

    Сколько занятных костылей увидел. Раньше помниться шататный софт для андройдов был в более менее серьезных производителей.

    Ну или микроскопический ftp сервер (хоть на роутре запускай) и любой маломальский Total Cоmmander. Ну или более секурный sftp

    Самое смешное что когда наделали уже толпу софтов производители флешек толком начали делать флешки с двумя разъемами.

    Да и в самих смартфонах памяти полно стало, они сами могут как накопитель выступать, да и просто его к компу кабелем подключить можно

    Подскажите кстати какой нить актуальный смартфон/планшет с USB3.0 host..


  1. ganzmavag
    01.04.2024 09:12
    +1

    В тексте этот момент упущен, поэтому спрошув комментариях: какие из этих приложений могут передавать папки?


    1. NutsUnderline
      01.04.2024 09:12
      +1

      ну вот к примеру упомянутый в коментах synthing точно может, через протокол sftp тоже можно


    1. Chanser
      01.04.2024 09:12
      +3

      Упомянутый LocalSend умеет.
      Второй скрин в статье, кнопка "папка"


      1. ganzmavag
        01.04.2024 09:12
        +1

        Причём я теперь увидел, что в тексте это тоже упомянуто, спасибо!


  1. rinac
    01.04.2024 09:12
    +2

    Поставил на телефон FTP сервер, один раз настроил на компьютере в FAR соединение и это просто работает.

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


  1. boulder
    01.04.2024 09:12
    +1

    А под Android вообще есть SyncMe, которая обычные сетевые папки туда-сюда гоняет, даже без FTP.


  1. Chanser
    01.04.2024 09:12

    Не совсем по теме статьи (ибо не opensource и только для Windows), но считаю полезным упомянуть адаптацию встроенного в Android NearbyShare для Windows: QuickShare от Google
    Плюсы: нативное решение от Google, на телефон ничего устанавливать не надо, работает в обе стороны, встраивается в Проводник
    Минусы: полноценно работает только версия по ссылке; есть обновленная ипостась этого приложения от Samsung, которое называется так же, чем вносит путаницу, и которое работает не со всеми беспроводными чипами (only Intel)

    Summary:
    Для Linux выбрал бы LocalSend (пробовал, очень удобно, но Flutter иногда выдает труднорешаемые баги + непонятно как постоянно запущенный сервер влияет на батарейку телефона)
    Для себя на Windows остановился на QuickShare от Google


    1. Mike-M
      01.04.2024 09:12

      Клиент QuickShare для ПК требует Bluetooth и Wi-Fi. У меня вместо первого и второго подключение через Ethernet (


      1. Chanser
        01.04.2024 09:12

        Тогда LocalSend ваш вариант (или аналоги для расшаривания в одной сети)

        Android'овский NearbyShare, как и Apple'овский AirDrop архитектурно сделаны для возможности передачи данных в том числе вообще без подключения к сети


        1. Mike-M
          01.04.2024 09:12

          Пока что ничего подходящего не нашел, к сожалению.


  1. Themen
    01.04.2024 09:12
    +1

    Я пользуюсь самописной :) https://www.npmjs.com/package/web-shared-folder

    Просто поднимает сервер для расшаривания заданной папки. Всё скачивается и закачивается через веб-интерфейс. Но для закачки там правда ограничения на небольшие файлы. Если надо что-то крупное слить с телефона, то поднимаю уже на телефоне через termux.


  1. grvelvet
    01.04.2024 09:12
    +3

    Ничем не пользуюсь, расшарил папку пк в локалку. На телефоне файловый менеджер с подключением к wlan. Остальное не нужно.


    1. SlavaHU
      01.04.2024 09:12
      +3

      Аналогично.

      CX File Explorer прекрасно запоминает подключения к сетевым папкам, будь то на NAS или на ПК.


  1. DBalashov
    01.04.2024 09:12
    +2

    На самсунге есть штатный File manager, который умеет SMB, OneDrive, Google Drive.

    Если не штатный - есть File Manager который тоже умеет SMB.


  1. Pynguino
    01.04.2024 09:12

    Еще проще создать локальный http сервер командой python3 -m http.server



  1. Mike-M
    01.04.2024 09:12

    В Android есть стандартная операция Share. В Windows есть стандартное контекстное меню Send To. Но нет софта, основанного на этих интуитивно понятных интерфейсах. Или есть?