USB Networking за Nokia N900
Владимир | 06/19/2010От известно количество време съм собственик на Nokia N900 MID. В цялото словосъчетание като че ли Multimedia Internet Device е важната част, но не отразява дори с малко какво може устройството.
Накратко това е по скоро таблет със малко GSM чарколяцо отколкото телефон с браузър. За бонус играчката е доста отворена (по подразбиране си идва със шел към нея), базирана е на прилични стандарти и като цяло е готина занимавка.
Какво ще разглеждаме днес

Устройство: Nokia N900
Хардуер: ARM A8 Cortex SOC, 256MB RAM, 32GB Internal Flash, 3,5 inch 800×480 touchscreen дисплей, пълна qwerty клавиатура
Софтуер: Maemo 5, частично базиран на дебиан (кодово име Fremantle) – не не е Freemantle, и аз го бърках доста.
Възможности: Сърфиране из нета, пощенски клиент, таблет, мултимедийна станция (да поддържа и UPnP и DLNA), четене на документи, чат клиент, фотоапарат, бърза редакция на прости документи, календар и даже телефон. Поглеждайки всичката функционалност достъпна в устройството човек добива чувството че телефона е по скоро сложен защото са има място на платката отколкото че специално са си мислили да го слагат (но пък всеки може да си мисли каквото си иска). Едно от най приятните неща свързани с тази играчка е факта че можете съвсем спокойно да си инсталирате доста прилични количества софтуер, без почти никакъв риск. Ако официалният или community based софтуер не ви достига никой не ви спира да седнете и да си хакнете нещо което на вас ви трябва/харесва. Nokia предоставят всички необходими инструменти за разработка – включително виртуална машина със всичкия необходим софтуер и емулатор в който да си тествате софтуера който пишете.
Какво ще правим днес
Днес ще ви покажа как можете да използвате USB кабела за да се свържете със вашия телефон посредством SSH, да му дадете малко Internet (защото наоколо няма WI-FI а не ви се плаща на българските оператори кожодери) и как да убедите стандартните приложения че има интернет. Платформата върху която ще реализираме цялото упражнение (освен Телефона/Таблета/Играчката) е Ubuntu 9.04 (Jaunty) и Ubuntu 9.10 (Karmic). Все пак разполагам само с това под ръка.
Как ще протече целият процес
- Инсталиране на необходимият софтуер върху устройството
- Конфигуриране на USB мрежата от страна на устройството
- Конфигуриране на USB мрежата от страна на Компютъра
- Конфигуриране на автоматична активация/деактивация на USB мрежата от страна на устройството
- Конфигуриране на рутирането от страна на компютъра
- Обучаване на стандартните маемо приложения че имат интернет :)
Изхождаме от предположението че имате Wi-Fi под ръка. Не че иначе не е постижимо но ще отнеме повечко време и ще е доста неудобно. Въпреки че клавиатурата е удобна за писане, не е най-добрата когато става въпрос за специални знаци и *nix команди.
Инсталиране на необходимия софтуер върху устройството
За да си свършим задачките ще ни е необходим малко софтуер. В случая ще ни е необходим root достъп за да променим няколко системни файла. Цялата операция може да се осъществи от самото устройство, но смятам че е по удобно да я свършите с помощта на малко по голяма и удобна клавиатура като тази на вашият компютър/лаптоп.
За целта на занятието ще ни е необходим следният софтуер:
- rootsh – за да придобием root достъп от конзолата на устройството (ако изпитаме нужда)
- SSH сървър – налични са OpenSSH и Dropbear – по ваш избор. Аз лично предпочитам OpenSSH. Намира се в хранилището extras-testing
- personal-ip-address – това е аплет за един от десктопите който ще ви покаже ип адреса на устройството. Това е по скоро удобство
- libicd-network-null – това е модул за мрежовата подсистема който позволява създаване на фалшиви мрежови връзки. Устройството по подразбиране поддържа само wireless и gprs (официално). Намира се в хранилището extras-devel което по подразбиране не е въведено
За начало може да инсталирате само SSH сървъра и после останалата част ако прецените че ви е нужна. За да инсталирате SSH сървър е необходимо да добавите хранилището extras тестинг през нормалният пакетен мениджър на Maemo. Докато сте там може да си инсталирате и rootsh – полезен е. В процеса на инсталация ще бъдете попитани да си въведете новата root парола (без нея няма как да се логнете на играчката).
След като инсталирате софтуера пробвайте да се закачите :) трябва да се случи и вие вече сте root с абсолютни права върху устройството. Бъдете внимателни и не правете нищо лудо (като rm -rf /)
Конфигуриране на USB мрежата от страна на устройството
Все пак за да можем да имаме мрежа тя трябва да е конфигурирана и от двете страни на кабела. Сега след като вече сте се логнали в устройството е време да се захващаме за работа.
Отворете /etc/network/interfaces
Там трябва да откриете нещо подобно на:
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto usb0 iface usb0 inet static address 192.168.2.15 netmask 255.255.255.0 gateway 192.168.2.14
Ако не изглежда така постарайте се и нека заприлича. Важното в случая са редовете след auto usb0 адреса си го изберете както ви подхожда но го запомнете. Адреса в реда с gateway ще ни е необходим малко по късно за другият край на мрежата. Това е една добра конфигурация която ще разширим малко по късно.
Сега е време да изпробвате дали сте направили всичко правилно :)
ifup usb0 ifconfig
Ако в изхода от ifconfig идите нещо подобно на:
usb0 Link encap:Ethernet HWaddr FE:84:91:74:71:F7
inet addr:192.168.2.15 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3373 errors:0 dropped:0 overruns:0 frame:0
TX packets:7065 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:168768 (164.8 KiB) TX bytes:2344721 (2.2 MiB)
Всичко работи както би трябвало.
Конфигуриране на USB мрежата от страна на Компютъра
След като сте конфигурирали единият край на мрежата време е да конфигурирате и другия :) тоест вашият компютър лаптоп. Последно време започнах да оценявам удобствата на Gnome Network Manager така че ще покажа как се случват работите там.
Първата стъпка е да включите телефона си посредством USB кабела към вашата машина. На въпроса в какъв режим да се представя пред вашият компютър изберете PC-Suite mode. След кратко мислене във NetworkManager-а ще се появят две нови устройства. Жична мрежа и GSM модем. Би трябвало да изглежда по подобен начин. (извинявам се но вече при мен е конфигурирано)

Време е да изберете опцията за редактиране на връзки, да изберете вашата връзка (най-вероятно е Auto USB0) и да я конфигурирате, както е показано в следващите две снимки:


За да проверим дали всичко е наред изключете кабела, включете го отново и изберете пак PC-Suite mode. Едно нещо за което трябва да внимавате е да не променяте мак адреса който е открит от Network Manager-a след малко ще обясним на телефона как да използва винаги него.
Сега вече трябва да можете да пингнете вашият телефон закачен през кабелчето :)
Конфигуриране на автоматична активация/деактивация на USB мрежата от страна на устройството
Сега след като вече имаме връзка между компютъра и телефона базирана на USB кабела време е да обучим телефона да не променя тази връзка и да я активира/спира автоматично всеки път когато изберете PC-Suite mode. За целта са необходими няколко стъпки:
- Обясняване на телефона винаги да използва същият мак адрес за да може връзката да се активира автоматично от страната на компютъра
- добавяне на автоматично активиране на интерфейса при влизане в PC-Suite Mode
- Добавяне на правилен gateway и рутинг при активиране на интерфейса
- автоматично деактивиране на интерфайса при излизане от PC-Suite mode
Обясняване на телефона винаги да използва същият мак адрес за да може връзката да се активира автоматично от страната на компютъра
Това е необходимо поради причината че при всеки рестарт на телефона мак адреса на usb интерфейса се генерира на ново. И като цяло е винаги различен. Приучаването се състои в дефинирането на опция за кернел модула който се грижи за този мрежов интерфейс (g_nokia). Логнете се като root на вашият телефон (това звучи яко) и изпълнете
echo > "options g_nokia host_addr=C6:EB:3E:B7:65:D7" > /etc/modprobe.d/g_nokia
Или всеки един мак адрес който ви харесва (например: C0:FF:EE:C0:FF:EE или 01:23:45:67:89:AB). Ако сменяте мак адреса ще се наложи да рестартирате телефона за да прихване новата настройка.
добавяне на автоматично активиране на интерфейса при влизане в PC-Suite Mode
При избиране на PC-Suite mode от менюто при включване се изпълнява скрипта /usr/sbin/pcsuite-enable.sh. За да активираме автоматично интерфейса трябва да добавим в края му необходимите ни команди. Намерете секцията:
kill -USR1 $SYNCD_PID logger "$0: sent SIGUSR1 to syncd" exit 0
и я заменете с:
kill -USR1 $SYNCD_PID logger "$0: sent SIGUSR1 to syncd" ifup usb0 echo "nameserver 8.8.8.8" >> /etc/resolv.conf echo "nameserver 8.8.4.4" >> /etc/resolv.conf exit 0
Реално добавяме 3 команди:
- ifup usb0 – автоматично ще вдигне нашият интерфейс
- echo „nameserver x.x.x.x“ >> /etc/resolv.conf – ще добави допълнителни сървъри за имена към стандартните (направил съм го с цел да се избягнат някои шантави и/или проблемни DNS сървъри. Посочените адреси са публичните DNS сървъри на google. Ако не ви харесват можете да ги замените с други по ваше усмотрение.
Добавяне на правилен gateway и рутинг при активиране на интерфейса
За да сме сигурни че телефонът няма да сътвори глупости от типа на използване на GPRS за разни глупости ще подменим пътят по подразбиране и gateway-а. За целта добавете в дефиницията за интерфейса в /etc/network/interfaces
up route del default up route add default gw 192.168.2.14
автоматично деактивиране на интерфайса при излизане от PC-Suite mode
При изваждане на USB кабела автоматично се изпълнява скрипта /usr/sbin/pcsuite-disable.sh където и ще добавим нашите инструкции за автоматично спиране на интерфейса.
Намерете секцията:
logger "$0: do nothing to pass USB certs" exit 0
и я заменете с:
logger "$0: do nothing to pass USB certs" ifdown usb0 echo "nameserver 127.0.0.1" > /etc/resolv.conf exit 0
Както е видно спираме интерфейса и възстановяваме статуквото с DNS сървърите. След тези операции вече при включване на usb кабела и избиране на PC-Suite mode автоматично ще се вдига интерфейс с настройки да взема интернет от машината за която е закачен, но за съжаление машината за която е закачен все още не знае как да му даде интернет.
Конфигуриране на рутирането от страна на компютъра
Колкото и да улеснява Network Manager-а при някои операции (видяхте колко бързо се справи с откриването и разпознаването на телефона) все пак той крие и доста недостатъци. Като факта че част от стандартните парадигми с които е свикнал един системен администратор не работят както се очаква. Стандартният администратор би дефинирал usb0 интерфейса по начин подобен на този за телефонната страна със команди във up клаузата които да пуснат ip_forward и да добавят необходимите iptables правила и ще установи че нещо не се получава … За да ви спестя заигравките оставаме изцяло в свена на Network Manager-a. Той поддържа възможност за изпълняване на скриптове при определени събития (като включване/изключване на интерфейс и др.)
Създайте следният файл: /etc/NetworkManager/dispatcher.d/99nokia-n900-routing със следното съдържание:
#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs when NetworkManager fiddles with interfaces.
# Author vvitkov
# ver: 0.1
# based on NM standard dispatcher for ifupdown
if [ -z "$1" ]; then
echo "$0: called with no interface" 1>&2
exit 1;
fi
# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"
export ADDRFAM="NetworkManager"
export METHOD="NetworkManager"
export VERBOSITY="0"
# Run the right scripts
case "$2" in
up)
export MODE="start"
export PHASE="up"
if [ $IFACE = 'usb0' ] ; then
iptables -A POSTROUTING -t nat -s 192.168.2.15/32 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
fi
;;
down)
export MODE="stop"
export PHASE="down"
if [ $IFACE = 'usb0' ] ; then
iptables -D POSTROUTING -t nat -s 192.168.2.15/32 -j MASQUERADE
echo 0 > /proc/sys/net/ipv4/ip_forward
fi
;;
pre-up)
export MODE="start"
export PHASE="pre-up"
;;
post-down)
export MODE="stop"
export PHASE="post-down"
;;
*)
echo "$0: called with unknown action \`$2'" 1>&2
exit 1
;;
esac
Изпълнете отново магическите действия изключване на кабел, включване на кабел, избор на PC-Suite mode и кратко изчакване. Вече от вашият телефон съвсем спокойно трябва да можете да пингвате разни машини в интернет като примерно www.google.com.
Обучаване на стандартните маемо приложения че имат интернет :)
Въпреки че телефона има интернет приложенията които идват с него все още не знаят за това. Те разчитат на D-Bus да ги информира за подобни събития и докато не бъдат информирани си мислят че нет няма. Трябва да коригираме това :)
За целта ще добавим нова фиктивна конекция която да активираме при вдигането на usb0 интерфейса на телефонът ни. За да можем да добавим фиктивната конекция ни е необходим пакета libicd-network-null който се намира в extras-devel хранилището за пакети. Тъй като ще използваме това хранилище само за един пакет не е нужно да го добавяме в стандартният пакетен мениджър.
- логнете се като root във вашият телефон
- добавете в края на /etc/apt/sources.list.d/hildon-application-manager.list следният ред deb http://repository.maemo.org/extras-testing/ fremantle free non-free
- обновете списъка с пакети: apt-get update
- инсталирайте необходимият пакет: apt-get install libicd-network-null
- премахнете добавеният ред и обновете списъка с пакетите отново
Вече имаме необходимата инфраструктура за създаване на фиктивна мрежова връзка. Изпълнете следното за да я добавите и активирате (на телефона):
gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/type DUMMY gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/name "USBnet" gconftool-2 -s -t string /system/osso/connectivity/IAP/DUMMY/autoconnect false killall icd2
С това дефинираме фиктивна връзка с вътрешен идентификатор DUMMY и име USBnet.
Единственото което остава да направим е да информирам D-Bus подсистемата при активирането на интерфейса да включи тази връзка и съответно при спирането на интерфейса да я изключи. Това се постига с добавянето на следните 2 реда към /etc/network/interfaces в секцията за usb0
up run-standalone.sh dbus-send --type=method_call --system --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:DUMMY uint32:0 down run-standalone.sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true
Заключение
Вече вашият телефон може да разполага с интернет посредством usb кабел. Тествайте сами и се убедете.
Част от информацията е взаимствана от: http://wiki.maemo.org/N900_USB_networking
Ако имате въпроси питайте
Редакция: Променен е начина на изпълнение за вдигане на USB интерфейса за да позволи модулно изпълнение на модификации



