Формулировка задачи. У нас есть настольный компьютер и мобильные устройства под 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 (смартфоны не поддерживаются, но мы добавили её в обзор для разнообразия).
▍ Другие
Вместе с упомянутыми выше, список опенсорсных программ для пиринговой передачи файлов включает в себя следующие.
▍ Веб-сервисы (через браузер)
Благодаря открытому коду большинство этих сервисов можно разместить на своём хостинге. Если это веб-сервер в локальной сети, то по сути при передаче файлов трафик тоже будет внутренним, без выхода в интернет.
-
Web Wormhole
-
ToffeeShare
-
FilePizza
-
ShareDrop
-
Instant.io
-
file ai
-
Send Anywhere
-
JustBeamIt
-
Yt2fb.in
-
drop.lol
-
Filepush (передача через Web Push и WebRTC)
-
Wormhole
-
Pixeldrain
- Send (форк закрытого сервиса Firefox Send, который Mozilla прекратила поддерживать)
▍ Нативные программы
-
LANDrop
-
croc
-
Payload
-
p2pcopy
-
pcp
-
wormhole-william (реализация Magic-Wormhole)
- FlyingCarpet
▍ Вывод
По итогу можно сделать вывод, что прямая передача файлов между устройствами — довольно простая в реализации вещь. Аналогичная функция Android называется Quick Share, а благодаря опенсорсным инструментам можно легко передавать файлы между устройствами на разных платформах. Даже странно видеть, что кто-то в 2024 году вообще рассматривает AirDrop как конкурентное преимущество Apple, тем более у AirDrop проблемы с приватностью, а сама технология остаётся проприетарной. Если она отказываться работать по непонятной причине, у нас просто нет шансов выявить баг, в отличие от опенсорсных программ.
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
Комментарии (52)
rezedent12
01.04.2024 09:12+10На redmi 7A в версии mimu global 12.5.2 если сделать длинное нажатие по значку "Проводник" то появится меню с пунктом "FTP". И в нём можно запустить FTP-сервер.
crawlingroof
01.04.2024 09:12Та ну нафиг, сколько лет сяомился, не знал.
Спасибище тебе, человечище! Хотя adb самое простое.
gudvinr
01.04.2024 09:12+5инструменты синхронизации ПК и смартфона, такие как syncthing.
процесс можно 1) ускорить; 2) избавиться
от подключения к интернету. То есть файлы будут передаваться напрямую
между устройствами, как Apple AirDrop, только лучше.Так syncthing и работает без интернета, напрямую, если устройства в одной сети.
Если мультикаст UDP по какой-то причине не работает, то на все локальные IP-адреса рассылаются сообщения по HTTP.
Недавно у Spotify было обновление, он тоже офигенно отличился тем, что стал каждую секунду пакеты броадкастом рассылать, чтобы находить устройства в сети.
Спасибо конечно, но таких вредных приложений, которые мусор в сеть выпускают, нам не надо.
Вообще, для таких вещей (и не только для этих) есть KDE Connect, который вопреки названию, работает не только с KDE.
gmtd
01.04.2024 09:12Так syncthing и работает без интернета, напрямую, если устройства в одной сети.
В принципе, без центрального (сервер в Интернет) реестра ID устройства / IP он обнаружить другое устройство не может
gudvinr
01.04.2024 09:12+2Сможет. Global discovery - это опциональная функция, хоть и включена по-умолчанию.
Он умеет делать Local discovery через мультикасты/броадкасты
NutsUnderline
01.04.2024 09:12ip можно и помоь узнать, если мы говрим про свою локальную сеть то выдавать по dhcp статический, плюс локальный dns прекрасно работает
HerakHerakIvProd
01.04.2024 09:12+3А почему-бы просто не поставить ssh‑сервер и перекидывать файлы по классике через FileZilla? Пользуюсь им года с 2013
economist75
01.04.2024 09:12+4Сейчас сложно встретить компьютер без Python и тогда просто в нужной папке:
python -m http.server 8000
NutsUnderline
01.04.2024 09:12+5А если найду? :)
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 всех возможных чартов.
NutsUnderline
01.04.2024 09:12Спасибо, собственно я даже знаю где взять Python 3.12 для Windows 7 :) Но даже при этом он у меня не на всех машинах. НУ и мы тут не про программирование а про решение бытовых задач
Borz
01.04.2024 09:12на MacOS нет "изкоробки"
ЗанудаВКЛ: на линухах (да и на маке) не вездеpython
- местами ужеpython3
только доступен... и надо алиас делать вручную
unreal_undead2
01.04.2024 09:12+1На Linux не найдете
В базовой инсталляции Alpine точно есть?
NutsUnderline
01.04.2024 09:12Можем OpenWrt попробовать.. хотя пакадж такой там точно есть, но там и нормальный вебсрвер и ftp еще проще
NeoCode
01.04.2024 09:12Полезная статья, спасибо! А раз уж в заголовке AirDrop, то может уважаемое Сообщество посоветует какое-то приложение - универсальный комбайн под Android, работающий со всеми AirDrop-подобными протоколами, включая и сам AirDrop? Знаю что это разработка Эппла, но неужели никто до сих пор не отреверсил протокол и не сделал совместимое приложение для Android?
gudvinr
01.04.2024 09:12неужели никто до сих пор не отреверсил протокол и не сделал совместимое приложение для Android?
Да, потому что в AirDrop используется собственный проприетарный транспортный протокол, а не просто TCP/UDP поверх готового транспорта, как у всего, что в стаье есть
NeoCode
01.04.2024 09:12Скрипт на Питоне? Я думал что есть apk-имплементации для Android:) Интересно именно собрать все протоколы, используемые для обмена через Bluetooth, в одном мобильном приложении.
gudvinr
01.04.2024 09:12Имплементации нет, потому что для этого нужна имплементация транспортного протокола, что сделать в формате мобильного приложения не получится. Поэтому есть только скрипт для питона, и там явно написано, что работа возможна только в macOS и Linux
NeoCode
01.04.2024 09:12А почему не получится? Android же использует ядро Linux.
vilox
01.04.2024 09:12Если “имплементация транспортного протокола” д.б. в ядре Linux, то задача нерешаема “мобильным приложением”, т.к. ядро OS в Android можно заменить только вместе с прошивкой мобилки, что в общем случае нерешаемо. Игры с прошивками — это целый отдельный мир приложения интересов энтузиастов, туда нет захода уровня “поставь приложение”
grishkaa
01.04.2024 09:12+2Я отреверсил протокол гугловского Nearby Share/Quick Share и сделал NearDrop для macOS. Главное преимущество — ничего не надо ставить на телефон. Главный недостаток — андроид хочет для активации MDNS-сервиса, чтобы стать видимым для получения файлов, получить сигнал по блютусу (BLE), а с мака его не отправить, потому что там нельзя указать service data.
13werwolf13
01.04.2024 09:12+1как-то несправедливо проигнорирован как в теле статьи так и в комментариях kdeconnect, а очень зря ибо эта небольшая тулза полностью покрет как вышеописанную задачу так и в целом половину "божественной" экосистемы apple не привязывая юзверя к одному сомнительному вендору
shares-caisson
01.04.2024 09:12Tailscale для vpn'a и в нём есть taildrop, простенький кидатель файлов.
UnknownErrror
01.04.2024 09:12Как это, croc не поддерживается на андроиде? Ещё как поддерживается: в Термуксе!
NutsUnderline
01.04.2024 09:12+1Сколько занятных костылей увидел. Раньше помниться шататный софт для андройдов был в более менее серьезных производителей.
Ну или микроскопический ftp сервер (хоть на роутре запускай) и любой маломальский Total Cоmmander. Ну или более секурный sftp
Самое смешное что когда наделали уже толпу софтов производители флешек толком начали делать флешки с двумя разъемами.
Да и в самих смартфонах памяти полно стало, они сами могут как накопитель выступать, да и просто его к компу кабелем подключить можно
Подскажите кстати какой нить актуальный смартфон/планшет с USB3.0 host..
ganzmavag
01.04.2024 09:12+1В тексте этот момент упущен, поэтому спрошув комментариях: какие из этих приложений могут передавать папки?
NutsUnderline
01.04.2024 09:12+1ну вот к примеру упомянутый в коментах synthing точно может, через протокол sftp тоже можно
rinac
01.04.2024 09:12+2Поставил на телефон FTP сервер, один раз настроил на компьютере в FAR соединение и это просто работает.
Пробовал разные программы типа KDE connect, один раз работает, потом ничего не работает, иногда в третью субботу второго месяца високосного года вдруг опять начинает работать, я просто уже устал бегать по всем этим настройкам файервол и черт знает чего еще.
boulder
01.04.2024 09:12+1А под Android вообще есть SyncMe, которая обычные сетевые папки туда-сюда гоняет, даже без FTP.
Chanser
01.04.2024 09:12Не совсем по теме статьи (ибо не opensource и только для Windows), но считаю полезным упомянуть адаптацию встроенного в Android NearbyShare для Windows: QuickShare от Google
Плюсы: нативное решение от Google, на телефон ничего устанавливать не надо, работает в обе стороны, встраивается в Проводник
Минусы: полноценно работает только версия по ссылке; есть обновленная ипостась этого приложения от Samsung, которое называется так же, чем вносит путаницу, и которое работает не со всеми беспроводными чипами (only Intel)
Summary:
Для Linux выбрал бы LocalSend (пробовал, очень удобно, но Flutter иногда выдает труднорешаемые баги + непонятно как постоянно запущенный сервер влияет на батарейку телефона)
Для себя на Windows остановился на QuickShare от GoogleMike-M
01.04.2024 09:12Клиент QuickShare для ПК требует Bluetooth и Wi-Fi. У меня вместо первого и второго подключение через Ethernet (
Chanser
01.04.2024 09:12Тогда LocalSend ваш вариант (или аналоги для расшаривания в одной сети)
Android'овский NearbyShare, как и Apple'овский AirDrop архитектурно сделаны для возможности передачи данных в том числе вообще без подключения к сети
Themen
01.04.2024 09:12+1Я пользуюсь самописной :) https://www.npmjs.com/package/web-shared-folder
Просто поднимает сервер для расшаривания заданной папки. Всё скачивается и закачивается через веб-интерфейс. Но для закачки там правда ограничения на небольшие файлы. Если надо что-то крупное слить с телефона, то поднимаю уже на телефоне через termux.
DBalashov
01.04.2024 09:12+2На самсунге есть штатный File manager, который умеет SMB, OneDrive, Google Drive.
Если не штатный - есть File Manager который тоже умеет SMB.
Mike-M
01.04.2024 09:12В Android есть стандартная операция Share. В Windows есть стандартное контекстное меню Send To. Но нет софта, основанного на этих интуитивно понятных интерфейсах. Или есть?
slavius
Забыли самую простую и хабровую утилиту QRCP https://github.com/claudiodangelis/qrcp.
Про неё даже статья была https://habr.com/ru/companies/selectel/articles/556210/
Пользовал - нормальная скорость и удобство.
crawlingroof
не ту да ответил
drygdryg
miniserve также поддерживает эту возможность. Удобен тем, что выводит все IP-адреса, которые слушает веб-сервер.
miniserve <файлы> --qrcode