LINUX.ORG.RU
ФорумMobile

Запилил безрутовый Reverse Tethering для Android

 , , , ,


14

5

[update]

Новая версия: https://github.com/vvviperrr/SimpleRT

Реализована поддержка сразу нескольких подключенных android девайсов, притом все девайсы находятся в одной виртуальной сети. Удобно напрямую обмениваться файлами с девайса на девайс.

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

Код полностью переработан, софтина стала намного стабильнее.

Потенциальные юз-кейсы (помимо очевидного - получения интернета):

  • анализ трафика
  • основа для стенда тестирования

[/update]

Позволяет раздать интернет с ПК на мобильный девайс через usb, без рута, без adb. Зачем оно местному анонимусу? В случаях, когда нет wi-fi, когда не ловит 3g/lte (или ловит, но скорость небольшая), но есть ПК с жирным каналом. Почему бы не воспользоваться им, да еще и попутно подзарядить девайс?

Софтина в 2-х частях, андроидная и десктопная. Андроиды поддерживаются от 4.0 и выше. Оси - только линукс и osx. По факту создается виртуальный туннель, на десктопе настраивается ip forward и nat. Можно использовать для передачи файлов с ПК на девайс и обратно (поднять туннель и запустить ftp/samba/etc сервер на девайсе). Хорошая альтернатива mtp (который под линуксом работает чуть лучше, чем никак).

Для передачи данных по usb используется Android Open Accessory API, т.е ПК выступает в роли аксессуара. Со стороны ПК - libusb, с простой реализацией AOA.

Андроидная часть - простой VpnService, без гуя. При первом коннекте девайс спросит, использовать ли софтину постоянно с этим «аксессуаром» и разрешает ли владелец перехват трафика. При последующих соединениях просто молча запустится тетеринг.

Есть минусы: некоторые приложения (например youtube) не хотят работать с сетью, если нет ни wi-fi, ни 3g соединения. Выход - смириться, либо перед запуском туннеля оставить один из видов соединения. Трафик все равно пойдет по туннелю (на нем дефолтный маршрут). Ну либо поднять рута, в xposed framework есть плагин, который исправляет ситуацию.

Конкуренты с маркета:

Естественно open source. Код далек от идеала, по факту это просто proof of concept. Но работает стабильно. Идеи, пожелания, рекомендации охотно принимаются на гитхабе.

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

https://github.com/vvviperrr/SimpleRT

пс. подгоните иконку тематическую.

upd. тема на hn - https://news.ycombinator.com/item?id=12198085

Перемещено Klymedy из development

★★★★★

Последнее исправление: vvviperrr (всего исправлений: 10)

Klymedy Falcon-peregrinus droserasprout

Странная ситуация вышла с f-droid. Какой-то чел успел раньше меня подать заявку, но указал на корневой репозиторий (а нужно было на диру со сборкой под андроид), а там либо сборка автоматизирована, либо админы не стали разбираться, хотя я и указал в каментах на ошибку. В общем тред провисел 3 дня и его молча закрыли.

Подал новую заявку:

https://f-droid.org/forums/topic/simplert-usb-reverse-tethering-utility-for-a...

vvviperrr ★★★★★
() автор топика
28 сентября 2016 г.
Ответ на: комментарий от vvviperrr

Да ужас слоупоки! Я как-то даже стесняюсь рекомендовать друзяшкам F-Droid, пока популярные свободные софтины стабильно отстают на три-четыре версии от плей-маркета. Надо бы разобраться, чем можно помочь этим ребятам.

droserasprout ★★
()
20 декабря 2016 г.

error: unknown type name ‘libusb_hotplug_callback_handle’

Уважаемый vvviper, очень нужно запустить Reverse Tethering на LG G3 Fulmics через USB. Цель, нужна одновременная зарядка телефона и хорошая скорость соединения с домашним сервером (не ниже 30-40 мбит/с) для просмотра VR фильмов больше 12-15 гигобайт. Есть Raspberry PI2 на raspbian. Возникла проблема, пытаюсь собрать после распаковки командой sudo make из директории simole-rt-cli, но выдает ошибку error: unknown type name ‘libusb_hotplug_callback_handle’ вот выложил фото https://yadi.sk/i/dTgglUo03498Mh не подскажите в чем может быть проблема ?

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

warhow
()
Ответ на: error: unknown type name ‘libusb_hotplug_callback_handle’ от warhow

P.S.

На сервере (винда) расшарены несколько папок с фильмами большого размера (жесткие диски подключены к нему). На Raspeberry эти папки смонтированы и файлы в них отлично видно и доступны. Так вот, цель получить к этим файлам доступ напрямую с LG G3. + сы в том, что файлы >4gb на fat32 не поместишь, а ntfs и extfat не вариант, так как не все программы умеют работать через плагин UMS от тотал командера и т.д. + телефон 2К быстро разряжается за 1.5-2 часа, а тут зарядка будет одновременно, хотя бы поддержка 0.5А + сеть вайфай не стабильна и фильмы с потоком больше 15 мбит/с на практике смотреть без пауз и буферизации не получается, а меньешго качества не хочется, так как всеже экран 2К

warhow
()
Ответ на: error: unknown type name ‘libusb_hotplug_callback_handle’ от warhow

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

по идее все и так заработает.

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

Софт хороший, но после нескольких использований пересел на аппаратное решение: планшет->usb otg кабель->usb ethernet адаптер (в моём случае вот такой https://www.aliexpress.com/item/USB-2-0-Network-Hub-Ethernet-RJ45-lan-network... )

Это удобнее именно для выхода в интернет и доступа к локалке с мобильного устройства на стабильной скорости без просадок и нет зависимости от наличия включённого ПК и запущенной там в данный момент ОС и софта. Зарядка при этом естественно не производится.

NightOperator ★★★
()
Последнее исправление: NightOperator (всего исправлений: 1)
Ответ на: комментарий от vvviperrr

Возможно. В моём случае на китаеплашете turbopad 802i так работает даже при физическом перемещении /system/xbin/su куда-либо. Единственное но - только если есть dhcp сервер в сети.

NightOperator ★★★
()
Последнее исправление: NightOperator (всего исправлений: 1)
Ответ на: комментарий от NightOperator

В моём случае так работает даже при физическом перемещении /system/xbin/su куда-либо

я имею ввиду, что не на всех девайсах ядро будет поддерживать этот драйвер, а если и будет - мало у кого из производителей есть гуй для настройки ethernet адаптера (видел только у китайцев), тут надо молиться, что network service конкретного девайса сможет автоматом натравить на езернет интерфейс dhcp клиент. на моих сони девайсах эти шнурки не работали.

vvviperrr ★★★★★
() автор топика
Ответ на: копия экрана от warhow

также выложил повторно что происходит при команде make

pi@raspberrypi /mnt/LINUX/SimpleRT/simple-rt-cli $ sudo make gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1. 0` -c src/linux-adk.c -o obj/src/linux-adk.o In file included from src/linux-adk.c:24:0: include/linux-adk.h:58:5: error: unknown type name ‘libusb_hotplug_callback_hand le’ src/linux-adk.c: In function ‘init_accessory’: src/linux-adk.c:106:5: warning: implicit declaration of function ‘usleep’ [-Wimp licit-function-declaration] Makefile:49: recipe for target 'obj/src/linux-adk.o' failed make: *** [obj/src/linux-adk.o] Error 1

warhow
()
Ответ на: копия экрана от warhow

libusb

Еще заметил что вместе с libusb-1.0-1 еще параллельно установлена версия 0.4, может это влияет как-то ?

Но есть проблема, пытался удалить версию 0.4, после этого не воспринимает распеберри apt-get команду.

warhow
()
Ответ на: libusb от warhow

внес небольшую правку, обнови сорцы с гитхаба.

на всякий случай вот, что установлено у меня:

viper@viper-debian:~$ dpkg --list | grep libusb
ii  libgusb2:amd64                         0.2.9-1                                    amd64        GLib wrapper around libusb1
ii  libusb-0.1-4:amd64                     2:0.1.12-30                                amd64        userspace USB programming library
ii  libusb-1.0-0:amd64                     2:1.0.21-1                                 amd64        userspace USB programming library
ii  libusb-1.0-0-dev:amd64                 2:1.0.21-1                                 amd64        userspace USB programming library development files
ii  libusb-1.0-doc                         2:1.0.21-1                                 all          documentation for userspace USB programming

и проверь у себя это

viper@viper-debian:~$ grep libusb_hotplug_callback_handle /usr/include/libusb-1.0/libusb.h 
typedef int libusb_hotplug_callback_handle;
						libusb_hotplug_callback_handle *callback_handle);
						libusb_hotplug_callback_handle callback_handle);

vvviperrr ★★★★★
() автор топика
Ответ на: raspbian ARM от warhow

нет. у меня на расберри все работает. писалось изначально как раз для расберри.

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

не изменилось

Пакеты установлены как у вас, только arm

На команду grep libusb_hotplug_callback_handle /usr/include/libusb-1.0/libusb.h ничего не выводит

на sudo make тоже самое что и раньше (с подправлеными сырцами)

warhow
()
Ответ на: не изменилось от warhow

На команду grep libusb_hotplug_callback_handle /usr/include/libusb-1.0/libusb.h ничего не выводит

в этом то и проблема. попробуй переустановить этот пакет, я хз.

vvviperrr ★★★★★
() автор топика
Ответ на: выложил файл libusb.h от warhow

Нашел в инете посвежее файл libusb.h в котором есть libusb_hotplug_callback_handle

заменил в /usr/include/libusb-1.0/ старый на новый

компиляция sudo make стала выдавать теперь вот такое с ошибкой

pi@raspberrypi /mnt/LINUX/SimpleRT/simple-rt-cli $ sudo make gcc obj/src/linux-adk.o obj/src/main.o obj/src/linux/tun.o -Wall -lm -lpthread `pkg-config --libs libusb-1.0` -o simple-rt obj/src/linux-adk.o: In function `init_accessory': /mnt/LINUX/SimpleRT/simple-rt-cli/src/linux-adk.c:97: undefined reference to `libusb_strerror' /mnt/LINUX/SimpleRT/simple-rt-cli/src/linux-adk.c:111: undefined reference to `libusb_strerror' obj/src/main.o: In function `tun_thread_proc': /mnt/LINUX/SimpleRT/simple-rt-cli/src/main.c:54: undefined reference to `libusb_strerror' obj/src/main.o: In function `accessory_thread_proc': /mnt/LINUX/SimpleRT/simple-rt-cli/src/main.c:83: undefined reference to `libusb_strerror' /mnt/LINUX/SimpleRT/simple-rt-cli/src/main.c:94: undefined reference to `libusb_strerror' obj/src/main.o: In function `register_callback': /mnt/LINUX/SimpleRT/simple-rt-cli/src/main.c:198: undefined reference to `libusb_hotplug_register_callback' obj/src/main.o: In function `deregister_callback': /mnt/LINUX/SimpleRT/simple-rt-cli/src/main.c:214: undefined reference to `libusb_hotplug_deregister_callback' collect2: ld returned 1 exit status Makefile:55: recipe for target 'simple-rt' failed make: *** [simple-rt] Error 1

warhow
()
Ответ на: комментарий от vvviperrr

Удалял libusb и заново ставил. В репозитори распдебиана все равно в файле libusb.h нет функции libusb_hotplug_callback_handle

нашел на сайте libusb.com этто файл посвежее где она есть и просто заменил вручную в папке /usr/include/libusb-1.0

теперь она не ругается на эту функция при выполнении sudo make , но ругается на другие (см. https://yadi.sk/i/oixlpaoJ34TUfj )

undefined reference to `libusb_strerror' In function `tun_thread_proc' undefined reference to `libusb_hotplug_register_callback' и т.д.

И еще смущает, при компиляции в выхлопе строчка gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1. 0` -c src/linux-adk.c -o obj/src/linux-adk.o разве DEFAULT_SOURCE не должен быть заменен на какойто путь ?

Вы можете выложить из своего распеберри скомпилированные файлы .o ведь пути то у нас совпадают (вы писали что изначально на нем работала).

warhow
()
Ответ на: комментарий от warhow

нашел на сайте libusb.com этто файл посвежее

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

Вы можете выложить из своего распеберри скомпилированные файлы .o ведь пути то у нас совпадают (вы писали что изначально на нем работала).

эта либа зависит например от libudev. возможно будет ругаться на что-то еще. еще раз говорю, ты занимаешься херней. в твоем дистрибутиве почему-то старая версия libusb. возьми с сайта расберри свежий образ расбиана, накати и установи libusb-1.0-0 и libusb-1.0-0-dev. и все будет работать.

И еще смущает, при компиляции в выхлопе строчка gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1. 0` -c src/linux-adk.c -o obj/src/linux-adk.o разве DEFAULT_SOURCE не должен быть заменен на какойто путь ?

нет

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

подвижки есть

1. Скачал самую последнюю версию 1.0-20 c https://sourceforge.net/projects/libusb/files/libusb-1.0/

переустановил вручную полностью ... sudo apt-get install libudev-dev sudo apt-get install libudev0 затем ./configure make make install make clean оказывается еще libudev не был установлен (его тоже поставил) ... и о чудо почти все ошибки ушли, но еще не все

2. У меня на распебери уже весит вебсервер, длна сервер и еще мелочи, не хочется с нуля переустанавливать, поэтому пока идет так ..

взгляните плиз на скрин, вылазиет предупреждение после sudo make по каким то функциям, но без error уже ... но далее sudo make install не идет ... https://yadi.sk/i/zd78rLP-34YqQz

подскажите куда копать ... думаю кроме меня пригодится еще новичкам если кто захочет повторить

warhow
()
Ответ на: подвижки есть от warhow

У меня на распебери уже весит вебсервер, длна сервер и еще мелочи, не хочется с нуля переустанавливать

я переустановить тебе предлагал для чистоты эксперимента. когда последний раз делал upgrade/dist-upgrade?

взгляните плиз на скрин

зачем ты скринишь? выкладывай логи прям сюда, если не большие.

у simplert нет цели install, бинарь появляется в текущей директории. его и запускай.

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

вот выхлоп последний после всех доработко

pi@raspberrypi /mnt/LINUX/SimpleRT $ sudo make gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1.0` -c src/linux-adk.c -o obj/src/linux-adk.o src/linux-adk.c: In function ‘init_accessory’: src/linux-adk.c:107:5: warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1.0` -c src/main.c -o obj/src/main.o gcc -g -std=c99 -D_DEFAULT_SOURCE -Wall -Iinclude `pkg-config --cflags libusb-1.0` -c src/linux/tun.c -o obj/src/linux/tun.o gcc obj/src/linux-adk.o obj/src/main.o obj/src/linux/tun.o -Wall -lm -lpthread `pkg-config --libs libusb-1.0` -o simple-rt

жалуется на In function ‘init_accessory’: и warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] в linux-adk.c

warhow
()
Ответ на: комментарий от warhow

да он уже исполняемый, просто запускай

chmod +x simple-rt chmod: changing permissions

тыж под рутом собирал

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от warhow

жалуется на In function ‘init_accessory’: и warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] в linux-adk.c

ничего страшного

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

Вот так вот получилось теперь

pi@raspberrypi /mnt/LINUX/SimpleRT $ ./simple-rt Run app as root!

я так понял она запустилась ?

только вот в процессах найти ее не могу

warhow
()
Ответ на: комментарий от vvviperrr

зачем мне тролить ? ... я хочу запустить программу, может наш диалог еще кому поможет даю команду pi@raspberrypi /mnt/LINUX/simple-rt $ sudo ./simple-rt выхлоп ./simple-rt: symbol lookup error: ./simple-rt: undefined symbol: libusb_hotplug_register_callback

как ее запусить от root ???? sudo ./simple-rt выводит ошибку а просто ./simple-rt пишет Run app as root!

warhow
()
Ответ на: комментарий от warhow

Получается что под не руут не запускается, а под рут выдает ./simple-rt: symbol lookup error: ./simple-rt: undefined symbol: libusb_hotplug_register_callback

помогите плиз

warhow
()
Ответ на: комментарий от vvviperrr

Уважаемый vvviperrr, спасибо вам. 1. Решил не мучатся, скачал свежий образ raspbebian MINIMAL без всяких ненужных наворотов и графинтерфейса. 2. Обновил все пакеты, установил libusb-1.0 3. Ваша программа сразу скомпилировалась без проблем ... и о чудо А. скорость стабильно 60 Мбит/с как в локалке так и в интернет ( у меня канал 80), но видимо распеберри чуток режет, хотя мне и 30 с лихвой хватит для просмотра 3D фильмов размером 20 гигобайт. Wi-Fi на практике с андроид смартфоном держит 10-15 даже на 802.n с частой буферизацией. Б. Одновременная зарядка телефона, это важно. В. Забыть о проблеме 4Gb ограничения fat32 android (плагины понимающие extfat и ntfs не подходят, не все VR плееры их поддерживают и они не решают проблемы пункта Б).

Спасибо вам, осталось решить только проблему во-первых при запуске приложения вашего оно работает в shh как единственное, и пока не отменишь его командная строка не появляется. Я так понимаю его как то надо запустить в фоновом режиме и желательно автостартом при загрузке, не подскажите как это реализовать ?

warhow
()
Ответ на: комментарий от warhow

Я так понимаю его как то надо запустить в фоновом режиме и желательно автостартом при загрузке, не подскажите как это реализовать

запускай его в фоне например из /etc/rc.local

/path/to/simple_rt &

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от vvviperrr

Спасибо, все получилось. Только если прописать в rc.local ссылку прямую /путь/simple_rt & то приложение при загрузке стартует, но при подключении по юсб телефона пишет что не может найти файл iface_up.sh

решил проблему прописав сначала путь в rc.local в итоге cd /путь/ sudo ./simple-rt & и все отлично запускается после перезагрузки

скорость 45-50 мбит/c, но стабильно, что важно. для лучшей подзарядки телефона лучше подключать через 2 юсб порта (один полноценный кабель 4 контакта, второй только питание 2)

warhow
()
Ответ на: комментарий от vvviperrr

4pda

Уважаемый, vvviperrr, на 4pda есть две темы http://4pda.ru/forum/index.php?showtopic=175743 и http://4pda.ru/forum/index.php?showtopic=618174

где ваш вариант был бы очень актуальным как один из лучших (linux) вариантов подключения смартфона/планшета по USB к ББ в режиме reverse tethering.

Можно в этих темах дать ссылку на вашу (эту страницу или в github) ? или может вы сами (естественно с напоминанием и от вашего имени).

warhow
()
Ответ на: комментарий от vvviperrr

маловато будет :)

Уважаемый, vvviperrr, не подскажите почему скорость в локальной сети режится 30-40 мбит/с ? Через этотже роутер гигабитный к томуже серверу с фильмами в этойже локалке другой комп держит 90-95 мбит/с скачивание, а при подключении скажем через Raspeberri PI телефона 25-35 мбит/с.

При непосредственно записи тествой файла с сервера локальной сети внутренней на внутреннюю память Raspeberry PI2 скорость тоже держит 65-70 мбит/с. Получается скорость режеться с 65-70 до 25-35 мбит/с Это из-за виртуального туннеля ?

Вчера столкнулся с проблемой, при передаче /просмотра фильма 3D стереопара full SBS 3840x1080 remux с BluRay постоянные были затыки. В свойствах файла показывает битрейт 28.5 мбит/с, что получается крайне много (потолок) для вышеописанной скорости соединения.

Посоветуйте, плиз, это виртуальный туннель и процессор ПИ2 режет так скорость или всеже можно как-то ее увеличить (шифрование никакого у вас не встроено в симплерт ?).

P.S. при просмотре этого мега файла с потоком 28.5мбит/с непосредственно с внутренней карты SD телефона на телефоне никаких затыков нет, тоесть проблема именно в скорости соединения. Пробовал переписывать туда сюда разными маршрутами и разными местами просто файлы большие, тоже скорость в основном 3.6 мбайта, редко выше, тоесть 30мбит/с ..... не такой и жирный канал получается

как бы его расширить ?

warhow
()
Ответ на: маловато будет :) от warhow

в догонку

нашел вот такую статью https://habrahabr.ru/post/246953/ Почему OpenVPN тормозит

там говорится о размере буфера отправки и приема соккета в ваших исходниках не нашел подобного, но увидел строчку закоментированную #define ACC_BUF_SIZE 4096 это я так понимаю размер какого то кэша если он закоментирован то значение берется из системы .... п

warhow
()
Ответ на: в догонку от warhow

#define

Это не коммент в используемом вами смысле.

anonymous
()
Ответ на: маловато будет :) от warhow

замерял скорость у себя между linux пк и android устройством (напрямую, без роутеров и расберри) - около 100мбит. у тебя же цепочка видимо как-то так выглядит: сервер_с_фильмами - роутер - расберри - телефон. настрой в своем плеере кеширование, например. еще можно попробовать поднять приоритет процессу simplert на расберри.

увидел строчку закоментированную #define ACC_BUF_SIZE 4096

она не закомментирована

разумеется, возможно я не эффективно использую bulk transfer (т.к макс usb 2.0 скорость 480мбит, а у меня в идеале около 100), но идей по оптимизации у мене нет.

vvviperrr ★★★★★
() автор топика
Последнее исправление: vvviperrr (всего исправлений: 2)
Ответ на: комментарий от vvviperrr

ping

вы можете показать выхлоп запущеного на андроид устройстве ping с длинной пакета 4096 на вашего ББ линукс и скажем с длиной пакета 32768 ? желательно с числами после точки, скажем 0.467 мс, а не 1 мс округление

закрались у меня мутные сомнения что 1СЕК / ping * размер пакета = пропускная способность .... и если ping будет НЕ меньше 1мс, то (1000мс/1мс)*4096байт=31 мбит/с (это по моей схеме Android to PI2 - роутер - сервер), а если у вас скажем напрямую пинг от андроида к ББ линукс <0.3 мс, то и (1000/0.3)*4096байт=13мбайт/с=100 с лизвой мегабит/с

warhow
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.