« У китайцев появились Android Mini Collectibles | Русский голосовой поиск на Android » |
Reverse tethering на Android через USB
Говоря человеческим языком, подключение мобилы к сети по USB через компьютер.
Итак имеем, HTC Desire с рутованым Андроидом 2.2 и десктоп с линуксом. Комп подключен к локалке, где есть DHCP-сервер, смарт регулярно торчит в крэдле подключенном к компу, так что пусть через него нэт и получает. Для этого поднимаем на ББ бридж, через который смарт будет торчать в локалке. Насколько я понимаю, в винде для создания бриджа нужно выбрать два (или больше) интерфеса и по правой кнопке мыши сказать объеденить их. Но меня больше интересует эта процедура под линуксом.
Настройка ББ
На ББ настраивается бридж, к бриджу подключается сетевой интерфейс смарта.
Устанавливаем bridge-utils. Теперь нужно, собственно, создать бридж и подключить к нему сетевой интерфейс компьютера. Делаем
brctl addbr br0
brctl stp br0 off
brctl setfd br0 0.
ifconfig eth0 0.0.0.0
brctl addif br0 eth0
dhcpcd br0
Т.е. создаем бридж, отключаем лишний функционал, убираем IP у реального интерфейса, подключаем его к бриджу и получаем для бриджа сетевой адрес. По идее, после этого сеть на ББ должна работать так же, как и раньше, но уже через бридж. В зависимости от дистрибутива, тот же результат можно получить и с помощью "родных" средств настройки сети, но я попытаюсь изобразить дистронезависимый метод. Что бы это происходило при каждой загрузке, прописываем эти строки в /etc/rc.d/rc.local (для большинства) или /etc/conf.d/local.start (для Gentoo сотоварищи)
Теперь нужно к этому же бриджу подключить сеть смарта, но для начала ее нужно вообще увидеть. Не знаю почему, но у андроида используется недооткрытый протокол ActiveSync, тем не менее работать оно должно. Подключаем смарт к USB, тип подключения выбираем "Общий интернет" (или "Модем"), который обычно используется для строго обратной задачи. На компе при этом нужно выполнить 'modprobe rndis_host' (если не сработало на автомате), после чего 'ifconfig -a' должен показать новый сетевой интерфейс, обычно usb0. Теперь добавляем его к бриджу.
/sbin/ifconfig usb0 0.0.0.0 up
/sbin/brctl addif br0 usb0
Сейчас вывод 'brctl show' должен показывать, что к br0 подключены eth0 и usb0. При каждом передергивании USB у смарта usb0 будет пропадать и появляться и его каждый раз нужно подключать к бриджу. Чтобы это происходило на автомате, поправим udev. В каталоге /etc/udev/rules.d создаем файл 95-net-auto.rules с содержимым
SUBSYSTEM=="net" KERNEL=="usb0" RUN+="/etc/udev/ifup-usb0.sh"
а в каталоге /etc/udev файл ifup-usb0.sh с содержимым
#!/bin/sh
/sbin/ifconfig usb0 0.0.0.0 up
/sbin/brctl addif br0 usb0
Теперь, при каждом обнаруженни usb0, он будет подниматься и подключаться к бриджу. Собственно, на этом настройка большого брата закончена. Теперь девайс.
Настройка смарта
Дискламер: у меня Desire, посему проверено только на нем. Возможно на других аппарата интерфейс /sys будет другим, тогда нужно изменить (или вообще выкинуть) if.
Ставим Gscript (есть мнение, что ASE тоже подойдет) и скармливаем ему скрипт
#!/system/bin/sh
if grep 'ether:enable' /sys/devices/platform/msm_hsusb/usb_function_switch > /dev/null
then
ip addr del `ip addr show dev rmnet0 | grep -E "inet [0-9]{1,3}" | awk '{print $2}'` dev rmnet0
netcfg usb0 dhcp
fi
Теперь, если при подключении смарта в режиме модема выполнить этот скрипт, на нем должен появиться нэт. Точнее, он будет подключен в локалку. Но! Сеть-то работать будет, но некоторый софт ровнее других. Если Dolphin только ругается при запуске, но дальше замечательно работает, то маркет как раз ругаться не будет, найдет все что нужно, но ничего не сможет поставить. В последнем случае придется подключиться к сети (скажем, WiFi), поставить что нужно и отключиться - смарт при том опять перейдет на USB. Для оперативного запуска скрипта лучше вытащить ссылку на Home, благо возможность имеется. Хочется еще, чтобы срабатывало само по факту подключения, но пока не придумалось. В общем-то, пока основное применение для меня - подцепить на работе к компу, попасть в локалку и с помощью ES Explorer'а погонять файлы по самбе.
В основном по мотивам 4pda, какого-то блога и Xgu.
ЗЫ: На счет модуля rndis_host. Если на ходу дособрать модуль и подгрузить без перезагрузки системы, то ничего не получится. Придется все таки перегружаться с измененным ядром.
1 комментарий

Thank you for a very excellent text.
If you find out how to have full connectivity for market, htc updates, etc it would be wonderful to know.