11/07/2011

Как выводить телефон с андроидом в интернет: Android phone USB-WiFi tethering in Linux

Наши местные доблестные айтишники решили radically improve the cable network quality, как они сами написали в извинительном письме. Что ж, как и было обещано - оно radically improved, то есть DHCP теперь не работает нигде. Что, естественно, очень радостно, ибо печать на сетевой принтер у нас доступна только через кабель. Ладно, не беда - у меня ж теперь Андроид, и оно может USB tethering, то есть вывод ноутбука в Интернет через подключение в андроид-телефоне. И сейчас оно запоёт!

Крибле, Крабле, Void!
Public, Static, Бумс!

повторить трижды и ударить в бубен - всё должно работать.



Часть 1. На андроидном телефоне
Нужно установить одну софтинку (app), которая называется Proxoid. Это позволит привязать телефон с андроидом на борту к вашему ноутбуку и выводить ноутбук в интернет через телефон. Для этого нужно:

1. На телефоне, идём на Андроид Маркет скачивать Proxoid отсюда.

2. Подключаем андроидный телефон по USB к ноутбуку, на экране выбираем USB Tethering.

3. После этого запускаем Proxoid, отмечаем галочкой Start the service.

4. Идём в меню телефона Menu --- Settings --- Applications --- Development --- USB debugging (включаем, ежели оно не включено).



Часть 2. На ноутбуке, который надо вывести в Интернет...
... придётся попыхтеть немножко дольше.
Говорят, во всяких Убунтах всё работает из коробки, но на Убунтах свет клином не сошёлся и на тот случай, если у вас что-то ещё, читаем дальше.

5. Создаём udev rules для нашего телефона (вниманию горячих парней! код производителя [Vendor ID] приводится для моего HTC Desire HD, у вас он может быть иным!). Используя ваш любимый текстовый редактор, создаём файл:
/etc/udev/rules.d/90-android.rules
и в него записываем:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", MODE="0666"
или, если вышеприведённое не заработает, можно попробовать это:
# ---
# Htc Desire USB tethering
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0ffe", MODE="0666", RUN+="/sbin/dhcpcd $env{INTERFACE}"
# ---
6. Перезагружаем udev, давая команду в консоли:
sudo /etc/rc.d/rc.udev reload

7. Вонзаем USB штепсель с телефоном, который уже вовсю бороздит просторы Сети и где уже должен быть запущен Proxoid, в USB порт ноутбука и в консоли набираем
dmesg
В моём случае оно выдало следующую простыню:
[ 362.620034] usb 8-2: new high speed USB device using ehci_hcd and address 6
[ 362.765132] usb 8-2: configuration #1 chosen from 1 choice
[ 362.770180] usb 8-2: New USB device found, idVendor=0bb4, idProduct=0ffe
[ 362.770183] usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 362.770185] usb 8-2: Product: Android Phone
[ 362.770187] usb 8-2: Manufacturer: HTC
[ 362.770188] usb 8-2: SerialNumber: SH184RX00820
[ 362.976060] usbcore: registered new interface driver cdc_ether
[ 362.992881] usb0: register 'rndis_host' at usb-0000:00:1d.7-2, RNDIS device, 52:b8:c0:f5:4d:e4
[ 362.992899] usbcore: registered new interface driver rndis_host
[ 363.040971] usbcore: registered new interface driver rndis_wlan
[ 539.108026] usb0: no IPv6 routers present
latitude@dot:~$
Красным подсвечено самое главное: у нас должен появиться сетевой интерфейс usb0
и если его не появилось, то придётся либо пнуть дистрибутивостроителей, либо собрать своё ядро Linux, включив там вот что:

Device Drivers ---
[*] Network device support ---
USB Network Adapters ---
[*] Multi-purpose USB Networking Framework
[*] CDC Ethernet support
[*] CDC EEM support
[*] Simple USB Network Links (CDC Ethernet subset)
[*] Embedded ARM Linux links

[*] USB Support ---
[*] USB Modem (CDC ACM) support
[*] USB Wireless Device Management support
После этого при подключении телефона должен появиться "сетевой" интерфейс usbX, где X обычно это 0.

7.1. Теперь можно скрестить пальцы на удачу и набрать в консоли:
dhclient usb0
Если вам повезёт, то всё настроится, заиграет и запоёт вот так:

Internet Systems Consortium DHCP Client V3.1.1
Copyright 2004-2008 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

Listening on LPF/usb0/52:b8:c0:f5:4d:e4
Sending on LPF/usb0/52:b8:c0:f5:4d:e4
Sending on Socket/fallback
DHCPDISCOVER on usb0 to 255.255.255.255 port 67 interval 6
DHCPOFFER from 192.168.42.129
DHCPREQUEST on usb0 to 255.255.255.255 port 67
DHCPACK from 192.168.42.129
bound to 192.168.42.203 -- renewal in 20189 seconds.
После этого через ваш любимый броузер Интернет польётся широкой и быстрой рекой.
Если же оно не полилося - есть ещё способы.


Часть 3. Запасной парашют.
Много советов подразумевают перенаправление с использованием утилиты adb из Android SDK. Для этого, по советам сообщества Андроидов, делаем вот что.

1. Загружаем Android SDK посвежее и распаковываем. Нам в нём нужна утилита adb, но её в этом SDK нифига нет, вопреки советчикам из интернетов.

2. Запускаем:
$ sudo tools/android
из каталога android-sdk-linux_x86, который вы распаковали на предыдущем шагу.
и (см sdk.jpg) установить Platform-Tools вручную.

3. Теперь в каталоге android-sdk-linux_x86/platform-tools утилита adb должна появиться.

4. Даём команду:
./adb forward tcp:8080 tcp:8080
которая, по задумке, перенаправит всё в наше андроидное устройство.

5. Далее, в Proxoid по умолчанию выставлен пор 8080.
У меня лично всё заработало сразу и без выставления прокси в Фаерфоксе, но на всякий случай - приведу рецепт до конца.
Народ рекомендует добавить настройки прокси Фаерфоксу (или какой вы броузер пользуете): Edit --- Preferences --- Advanced ---- Network --- Settings далее выбрать ручные настройки:
HTTP Proxy выставить localhost
Port выставить 8080

После этого оно должно заработать.

16 комментариев:

  1. Узнать idVendor, idProduct можно по команде
    # lsusb -v
    udev можно перезапускать по команде
    # udevadm trigger
    что проверено пока на генту. В общем, это какая-то копипаста отсюда, сброшенная неперевариваемым куском информации без минимального осмысления. После почти месяца с предыдущего поста ожидал большего.

    ОтветитьУдалить
  2. @iv_vl комментирует...

    Узнать idVendor, idProduct можно по команде
    Можно, просто на некоторых форумах я видел, что это не всегда срабатывает.

    В общем, это какая-то копипаста отсюда
    Во-первых, это не копипаста, а пошаговая инструкция, которая работает (в отличие от источника, в котором говорится reload udev and enjoy). Во-вторых, на linuxquestions я не попал по ссылкам (ктстати, спасибо за ссылку).


    сброшенная неперевариваемым куском информации без минимального осмысления.
    Хм... iv_vl, ты не прав. Неперевариваемые куски - это на форуме. Здесь описано в общем так, как я его (tethering) и настраивал. Перекопав кучу шлака про abd, которого, кстати, в Android SDK нифига нет!

    После почти месяца с предыдущего поста ожидал большего.
    А чего больше? Тетеринг работает, инструкция есть - потом, я могу её забыть, а тут не забуду.

    Кстати, а что ещё можно добавить, iv_vl?

    ОтветитьУдалить
  3. Вообще то все это уже сто лет как работает путем проставления одной галочки в телефоне "режим USB-модема". Этот пост какой-то трехлетней свежести

    ОтветитьУдалить
  4. @alexnov
    Этот пост какой-то трехлетней свежести
    Согласен. Я, например, если хочу выпустить ПК в инет через смартфон, то выбираю режим "Интернет-модем", а если наоборот, то "Сквозное подключение к интернету". Хотя для первого варианта мне намного комфортнее использовать "Wi-Fi роутер", благо данное приложение уже имеется в моём Wildfire S (на 99% уверен, что оно есть и в Desire HD, ведь в тех. параметрах вайфая у него /b/g/n).
    @virens
    В этом предложении, по-моему, не хватает закрывающей скобки после "Vendor ID":
    Создаём udev rules для нашего телефона (вниманию горячих парней! код производителя (Vendor ID приводится для моего HTC Desire HD, у вас он может быть иным!)

    ОтветитьУдалить
  5. А можно глупый вопрос: зачем такие сложности?
    Wi-Fi tethering поднимается парой кликов и не требует какого-либо конфигурирования.

    ОтветитьУдалить
  6. @alexnov комментирует...
    Вообще то все это уже сто лет как работает путем проставления одной галочки в телефоне "режим USB-модема".
    Алекс, после выставления этой галочки в моём Дебиане нифига не происходит. Совсем. Просто не у всех Убунта с горячо любимой Юнити и фенечками.

    Этот пост какой-то трехлетней свежести
    Как раз свежак, это ты зря. Вот пост про дистрибутивы в июле был баян дичайший. И ничё :-)


    @Vlsu комментирует...
    Согласен.
    Ай ладно.
    Не ну в самом деле: потроллить в комментах нельзя, побаянить в постах нельзя... Шо я вам, Комсомольская правда, что ли, чтоб каждый день свежие скандалы и интриги выдавать!? ;-)))


    Я, например, если хочу выпустить ПК в инет через смартфон, то выбираю режим "Интернет-модем"
    Vslu, у меня на ноутбуке - кастомное ядро RT, и когда я воткнул туда телефон, отметив эту галочку, в dmesg ничего не появилось. Вообще. Это потом я узнал, что для этого нужно USB Newtworking Framework и USB Modem. Их я, естественно, тогда вырубил.

    На изкоробочном ядре всё играет из коробки и нужно только ткнуть dhclient usb0. Этот пост - напоминание мне, что надо докрутить в ядре и почему оно может не работать.

    Тонны шлака про abd меня просто бесят - он вообще нахрен не нужен. Всё работает и без него.

    В этом предложении, по-моему, не хватает закрывающей скобки
    Это верно. Поправил, спасибо.

    ОтветитьУдалить
  7. @panda комментирует...
    А можно глупый вопрос: зачем такие сложности?
    Панда, как я уже прокомментировал выше - Убанта не у всех. Кое-кто собирает кастомное ядро для своих личных целей, и там иногда кое-что вырублено.

    Wi-Fi tethering поднимается парой кликов и не требует какого-либо конфигурирования.
    Ахха, расскажи это тем, кто пишет на андроидных форумах про Android SDK kit, и придуркам-копипастерам, которые это растащили по своим бложикам. Те инструкции устарели, и того abd в этом ките нихрена нет. Это заставило автора поматюгаться.

    Кстати, Панда, а где мне покликать в IceWM для USB Tethering, не подскажешь?

    ОтветитьУдалить
  8. @virens комментирует...
    Узнать idVendor, idProduct можно по команде...
    Можно, просто на некоторых форумах я видел, что это не всегда срабатывает.

    Если у железяки эти id ядром не определяются, то с udev будет то же самое. Поэтому lsusb, выдавая то, что видит ядро, как раз самый правильный способ.

    Неперевариваемые куски - это на форуме. Здесь описано в общем так, как я его (tethering) и настраивал.
    У вас получается, что USB Network Adapter заработает, если бездумно включить все опции в ядре в соответствующем разделе. Если добавить совершенно дикое правило udev, то даже какой-то скрипт запустится. Какое-то одно шаманство, прямо как в одной хорошо распространённой оси. Если цель udev правила перезапустить dhcpcd, то зачем там MODE="0666"? А зачем $env{INTERFACE}? Есть такая тулза env, а переменной INTERFACE я так и не нашел. У вас же есть преимущество - сам подключаемый прибор, с правилом можно было поиграться, чтобы этот кусок информации сдобрить.

    Тетеринг работает, инструкция есть - потом, я могу её забыть, а тут не забуду.
    Если рассматривать как настройку конкретного устройства под конкретную задачу, то добавлять нечего. Но это слишком по-гиковски.

    Кстати, а что ещё можно добавить, iv_vl?
    По линуксу скажу, что задета очень интересная область - создание правил udev, что было бы полезно даже новичкам. Например, когда и почему эти правила нужно создавать, дать ссылку на такой или сякой ресурс.

    ОтветитьУдалить
  9. НТС точно давно умеют быть usb-мудемом безо всяких сторонних приложений, как было упомянуто предыдущими ораторами. Гораздо более животрепетает вопрос обратный: как имея интернет в ноутбуке раздать его по usb-кабелю в телефон? Буду весьма признателен за ссылки или новый пост )

    ОтветитьУдалить
  10. @virens
    у меня на ноутбуке - кастомное ядро RT
    Так это же в корне меняет дело! Тогда такая инструкция вполне актуальна. Помню, как-то на древнем ядре пытался поднять usb-модем. Намучился изрядно. Но коннект установил (правда, только для одного порта, если воткнуть в другой, то это опять неопознанное устройство).

    Хотя в такой ситуации более актуальным мне кажется именно вайфай роутер. Подключиться к вайфай точке можно при помощи того же Network Manager. Кстати, с Айсом дружит "на ура": прописываем "nm-applet" в автозапуск и будет вам счастье :-)

    ОтветитьУдалить
  11. @darthdba
    как имея интернет в ноутбуке раздать его по usb-кабелю в телефон?
    Для этого при подключении к ноутбуку на экране смартфона нужно выбрать режим "Сквозное подключение к интернету".

    ОтветитьУдалить
  12. @virens комментирует...

    Ахха, расскажи это тем, кто пишет на андроидных форумах про Android SDK kit, и придуркам-копипастерам, которые это растащили по своим бложикам. Те инструкции устарели, и того abd в этом ките нихрена нет. Это заставило автора поматюгаться.
    Если я правильно помню, то не надо ничего трогать через SDK. Т.е. понятно, что у конкретного смартфона может быть кривая прошивка, не дающая Wi-Fi tethering, но это еще один повод задуматься об альтернативах (CyanogenMod или MIUI).
    У меня на LG включается именно парой кликов, после чего ноут обнаруживает новую Wi-Fi сеть.

    Кстати, Панда, а где мне покликать в IceWM для USB Tethering, не подскажешь?
    Без понятия, давно уже пользую только ubuntu "из коробки".

    ОтветитьУдалить
  13. Привет, этот пост попал в Топ каталога Russian Top Blogspot

    ОтветитьУдалить
  14. Анонимус рекомендует написать статью про совмесную работу с товарищами у которых ворд. Сам анонимус дошел до ручки : Вариант а) миктех+ tex4ht + исправление путей в файле tex4ht.env вывод mk4ht oolatex foo.tex требует перла и явы б) тоже самое но с техлайв под линукс и тоже правка файла в итоге получаем опенофис с mathml формулами но в ворд кроме как копи-пастой формул формулы не перегнать и бо он mathml хитро хранит но понимает, маттайп не предлагать

    ОтветитьУдалить
  15. @iv_vl комментирует...
    Если у железяки эти id ядром не определяются, то с udev будет то же самое.
    Согласен.

    У вас получается, что USB Network Adapter заработает, если бездумно включить все опции в ядре в соответствующем разделе.
    В общем - да. У меня поддержки USB Network, собственно, и не было. На дистрибутивном ядре всё поднялось само.

    Если рассматривать как настройку конкретного устройства под конкретную задачу, то добавлять нечего.
    В общем-то, в блоге большинство постов как раз об этом: у меня есть шелезяка, и я настраиваю её на своём оборудовании.
    Этот пост - из той же серии.

    По линуксу скажу, что задета очень интересная область - создание правил udev, что было бы полезно даже новичкам. Например, когда и почему эти правила нужно создавать, дать ссылку на такой или сякой ресурс.
    О, а вот это в самом деле правда. Надо будет написать про это. Спасибо за идею, iv_vl!


    @darthdba комментирует...
    НТС точно давно умеют быть usb-мудемом безо всяких сторонних приложений, как было упомянуто предыдущими ораторами.
    Он умеет, но без поддержки в ядре ничего не выйдет. О том и пост.

    Гораздо более животрепетает вопрос обратный: как имея интернет в ноутбуке раздать его по usb-кабелю в телефон?
    Пока с такой проблемой не сталкивался. Будет проблема - напишу.

    @Vlsu комментирует...
    Так это же в корне меняет дело! Тогда такая инструкция вполне актуальна.
    Ну в общем там так и написано, что если у вас не бубанта, то вот что надо включить в ядре. Собственно, оно там неспроста.

    Хотя в такой ситуации более актуальным мне кажется именно вайфай роутер. Подключиться к вайфай точке можно при помощи того же Network Manager.
    Нету, нету у меня этого вашего нетворк манагера! :-) То есть нет вообще. У меня дебиан, как это ни удивительно звучит, а не убунта :-)


    @panda комментирует...
    но это еще один повод задуматься об альтернативах (CyanogenMod или MIUI
    Хм... Панда, а я вот начал задумываться про прошивки после твоих постов. Попробовать, что ли?

    Без понятия, давно уже пользую только ubuntu "из коробки".
    А ты прокрути скроллингом вверх к началу страницы. Заголовок блога видишь? Вот. Там что-нибудь про Убунту есть? Дык а то :-)


    @Russian Top Blogspot комментирует...
    Привет, этот пост попал в Топ каталога Russian Top Blogspot
    Ну надо же! А то я смотрю, кто это за visibli тут шастает :-)


    @Анонимный комментирует...
    Анонимус рекомендует написать статью про совмесную работу с товарищами у которых ворд. Сам анонимус дошел до ручки
    Автор Анонимуса понимает и сочувствует. Автор сам доходил до ручки с нерадивыми товарищами, у которых ворд. И вроде неглупые люди, а как дети...

    Вариант а) миктех+ tex4ht + исправление путей в файле tex4ht.env вывод mk4ht oolatex foo.tex требует перла и явы
    Анонимус, а ты не напишешь автору на почту, как это удалось заставить этот Глюкакаликсис (tex4ht) работать? Автор пробовал, но у него плохо получалось.


    б) тоже самое но с техлайв под линукс и тоже правка файла в итоге получаем опенофис с mathml формулами
    Не работает этот ваш mathml ни рожна. Вообще.
    Автор в своё время тупо гнал формулы картинками из latef2rtf.

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

    ОтветитьУдалить
  16. @virens комментирует...
    Нету, нету у меня этого вашего нетворк манагера! :-) То есть нет вообще. У меня дебиан, как это ни удивительно звучит, а не убунта :-)

    Подключение-то к WiFi-сетям как делается? Неужто ручным ковырянием конфигов и перезагрузкой? Если проще, то и WiFi-tethering будет использовать легче и быстрее, чем usb-tethering.

    ОтветитьУдалить