![](https://habrastorage.org/r/w1560/webt/ar/sa/fm/arsafm_pnxqxii4motie6gt981s.png)
Формулировка задачи. У нас есть настольный компьютер и мобильные устройства под Android. Задача простая — как быстро перебросить файлы с компьютера на телефоны и планшеты. Например, скачанные подкасты и HD-фильмы 1080p, файлы apk для установки, рабочие файлы с персоналки, бэкапы. Хранилище телефона можно использовать как резервный внешний диск или как «беспроводную» флешку, которая работает по Wi-Fi.
Конечно, можно это сделать через веб-сервисы Wormhole/PairDrop/FilePizza, через телеграм/вайбер или инструменты синхронизации ПК и смартфона, такие как syncthing. Да, это удобно и привычно. Но процесс можно 1) ускорить; 2) избавиться от подключения к интернету. То есть файлы будут передаваться напрямую между устройствами, как Apple AirDrop, только лучше.
На самом деле есть несколько способов прямой связи между устройствами, остаётся лишь выбрать самый удобный и эффективный из них.
▍ LocalSend
Например, маленькая опенсорсная программа LocalSend создана как раз для этого: передачи файлов и сообщений между устройствами в локальной сети без использования интернета. «Локальная сеть» подразумевает в том числе подключение к общественному хотспоту или если хотспот запущен на одном из смартфонов (без отдельного маршрутизатора).
![](https://habrastorage.org/webt/yj/nb/uv/yjnbuvy4tslxypyqo6bl-9j36m0.png)
Есть версии под 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, так что они автоматически исправятся во всех программах, которые используют этот фреймворк.
На главном экране три кнопки: «Получить», «Отправить» и «Настройки»:
![](https://habrastorage.org/webt/a4/oo/s9/a4oos9rcmcn5wtg3gygkonsq4qi.png)
Версия под Android такая же простая:
![](https://habrastorage.org/webt/jp/q1/qd/jpq1qd13ch4b6mub7nbcvmpcxdu.png)
Сразу после установки приложение рассылает по мультикасту 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.
Ставим программу в автозагрузку, указываем прятаться трей и включаем опция «Быстрое сохранение», чтобы все файлы принимались автоматически и сохранялись в указанную папку. Да, это немного неправильно с точки зрения безопасности, зато очень удобно. Опция отключена по умолчанию.
Теперь отправка файлов между девайсами становится банальной процедурой.
![](https://habrastorage.org/webt/md/a0/pr/mda0prpzcoq3chryqorhjpdpc60.png)
Коммуникация осуществляется по проприетарному протоколу 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>
). Или к серверу (отправителю) можно направить запрос на получение списка с метаданными файла.Кроме отдельных файлов, поддерживается отправка целиком папки, текста или содержимого буфера обмена. Скорость передачи ограничена максимальной скоростью сетевых интерфейсов в локальной сети на маршруте передачи (сетевая карта ПК — маршрутизатор — смартфон), а также дополнительными настройками.
Есть опция рассылки на несколько устройств в локальной сети (смартфоны, планшеты, ноутбуки), что очень удобно, если у вас большая семья, а вы хотите быстро поделиться файлами со всеми:
![](https://habrastorage.org/webt/ej/jt/5p/ejjt5pgt4ja2qawxisikzenzfde.png)
Как вариант, можно поделиться локальной ссылкой на файл:
![](https://habrastorage.org/webt/pj/qc/nw/pjqcnwew4ccudfq0lpgeje8k4g8.png)
По умолчанию LocalSend шифрует файлы при передаче (HTTPS). Если опция кажется излишней, можно отключить её в «Дополнительных настройках»:
![](https://habrastorage.org/webt/eu/o5/sm/euo5smjqujqafsyyflmguxzd5eo.png)
И вишенка на торте — отправка сообщений:
![](https://habrastorage.org/webt/ol/l2/fb/oll2fbilrpcxuwlowpuljvsktvu.png)
В большинстве случаев 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 запускается без предварительной установки, а интерфейс тут ещё проще: добавляем файлы в окно и выбираем устройство в локальной сети, на которое их отправить.
![](https://habrastorage.org/webt/ar/sa/fm/arsafm_pnxqxii4motie6gt981s.png)
▍ croc
Зачем графический интерфейс, если файлы можно отправлять из консоли? Так решили разработчики croc, улучшенной версии классического концепта Magic-Wormhole. В табличке из презентации 2016 года разные способы обмена файлами сравниваются по простоте и безопасности:
![](https://habrastorage.org/webt/zg/rp/qs/zgrpqsbk2bsikyfrkujlnolenik.png)
Это считается самая быстрая и функциональная консольная утилита для файлообмена между компьютерами под Linux, Windows и MacOS (смартфоны не поддерживаются, но мы добавили её в обзор для разнообразия).
![](https://habrastorage.org/webt/nb/iq/np/nbiqnpqfimn_4h_xfkxu8aneatm.gif)
▍ Другие
Вместе с упомянутыми выше, список опенсорсных программ для пиринговой передачи файлов включает в себя следующие.
▍ Веб-сервисы (через браузер)
Благодаря открытому коду большинство этих сервисов можно разместить на своём хостинге. Если это веб-сервер в локальной сети, то по сути при передаче файлов трафик тоже будет внутренним, без выхода в интернет.
-
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
![](https://habrastorage.org/webt/e6/sw/3m/e6sw3mjnuarjgfqyfuhiuk258p0.png)
▍ Вывод
По итогу можно сделать вывод, что прямая передача файлов между устройствами — довольно простая в реализации вещь. Аналогичная функция Android называется Quick Share, а благодаря опенсорсным инструментам можно легко передавать файлы между устройствами на разных платформах. Даже странно видеть, что кто-то в 2024 году вообще рассматривает AirDrop как конкурентное преимущество Apple, тем более у AirDrop проблемы с приватностью, а сама технология остаётся проприетарной. Если она отказываться работать по непонятной причине, у нас просто нет шансов выявить баг, в отличие от опенсорсных программ.
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
![](https://habrastorage.org/webt/jx/md/ye/jxmdyendyev6uxwdkpnkdl77zac.png)
Комментарии (52)
rezedent12
01.04.2024 09:12+10На redmi 7A в версии mimu global 12.5.2 если сделать длинное нажатие по значку "Проводник" то появится меню с пунктом "FTP". И в нём можно запустить FTP-сервер.
функция FTP на смартфоне redmi 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