Androidを載せたbeagleboard-xmをWiFi APにするまで(其の九)
WiFiセキュリティがWEPのままではやっぱり不安なので、hostpadを入れてWPAが使えるようにした。
Andorid NDKを使ったhostpadのビルド
Android NDKをつかってhostpadをビルドした。
hostpadのソースはzd1211bのビルドのときに使ったLinuxUSB_AR2524-3.0.0.56.tgzに入っていたものを使った。.configなどながすでにzd1211向けになっているので都合がいい。
手順としては次のようになる。
Android NDKのダウンロード
hostpadのビルドはAndroid本家のサイトからダウンロードしてきたAndroid NDKを使う。beagleboard-xm用のAndroidソースコードからNDKをビルドすることもできるような気もするが、ちょっと手順がわからないのと、ユーザアプリのビルドであればNDKでも問題ないはずなので。
ダウンロードサイトは下記。ダウンロードしたときのバージョンはandroid-ndk-r7b。
http://developer.android.com/sdk/ndk/index.html
ダウンロードしたtarg.gzを適当なフォルダに解凍すればインストールは完了。
toolchainにopensslのライブラリを追加
hostpadのビルドにはopensslのライブラリが必要。beagleboard-xm用のAndroidソースツリーの中にはすでにopensslが入っていてビルドもされているので、これを使う。
具体的にはAndroidソースツリー内の
out/product/beagleboard/obj/lib/libssl.so out/product/beagleboard/obj/lib/libcrypto.so
をtoolchainのライブラリフォルダにコピーする。コピーする先は下記。Froyo(2.2)用のtoolchainなのでandroid-8。
<NDK_TOP>/platforms/android-8/arch-arm/usr/lib
hostpadのMakefileを編集
hostapdのMakfileをandroid NDKをつかってビルドできるように編集する。下記のサイトを参考にさせてもらった。
http://blog.kmckk.com/archives/2918551.html
主な変更個所は下記。
NDK_TOP=<Android NDKのインストールディレクトリ> CROSS=$(NDK_TOP)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- # beagleboard-xmにあわせて修正 TARGET_ARCH_CFLAGS = -mcpu=cortext-a8 -march=armv7-a SYSROOT=$(NDK_TOP)/platforms/android-8/arch-arm CFLAGS=-mandroid --sysroot=$(SYSROOT) LDFLAGS=-mandroid --sysroot=$(SYSROOT) $(LIBS) #opensslのincludeファイルの参照先。beagleboard-xmの方をみるように変更。 CFLAGS += -I<Androidソースのトップディレクトリ>/external/openssl/include #stripコマンドもクロスコンパイル環境用のコマンドに変える STRIP=$(CROSS)strip #hostapdのリンク。LDFLAGSを追加 hostapd: $(OBJS) $(CC) -o hostapd $(OBJS) $(LDFLAGS) $(LIBS) $(LIBPATH) $(STRIPCMD) hostapd
makeコマンドを実行してエラーなくhostapdができれば成功。fileコマンドでARM用にビルドされていることを確認する。
ビルドできていたらsdカード上の/system/bin/hostapdに書き込む。
$ file hostapd hostapd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
hostapd.confの編集
hostpadの設定ファイルを作って編集する。beagleboard-xmに/data/wifiapディレクトリをつくってここにhostpad.confを作って置いた。
interface=ath0 bridge=br0 logger_syslog=-1 logger_syslog_level=2 logger_stdout=1 logger_stdout_level=2 debug=3 wpa=3 wpa_pairwise=TKIP ssid=<SSID> wpa_key_mgmt=WPA-PSK wpa_passphrase=<パスワード>
hostpadでの接続とローミング動作の確認
hostapd経由でのWiFi APの起動を試した。WiFiドライバのスクリプトを下記のように修正して、Masterモードの設定とチャンネルまでを行うようにした。その他の認証方式、暗号化方式はhostpad.confを参照するようにする。
insmod /system/lib/modules/zd1211b.ko sleep 5 netcfg ath0 up sleep 5 iwconfig ath0 mode Master sleep 1 iwconfig ath0 channel <チャンネル> sleep 1 echo 1 > /proc/sys/net/ipv4/ip_forward ifconfig usb0 0.0.0.0 ifconfig ath0 0.0.0.0 /system/bin/busybox brctl addbr br0 /system/bin/busybox brctl addif br0 usb0 /system/bin/busybox brctl addif br0 ath0 ifconfig br0 up ifconfig br0 <IPアドレス> netmask 255.255.255.0
上記のスクリプトを実行した後で、hostpadを起動する。
/system/bin/hostapd /data/wifiap/hostapd.conf &
なぜかクライアントからつなぎにいくと最初の2回失敗して、3回目でつながるようになる、その後は他のクライアントからも一発でつながるようになる。?だが自宅で使う分には問題ないのでそのままにしておく。
試しにSSIDを前から使っているAPと同じにしてみたところ、iPhoneではうまくローミング機能が働いているようにみえる。一階で使っているときは前のAPにつながって、二階にもっていくと自作APにつながる。いい感じ。