読者です 読者をやめる 読者になる 読者になる

into the void

ソフトウェアに関する雑多な調査日記

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向けになっているので都合がいい。
手順としては次のようになる。

  1. Android NDKをダウンロードする
  2. toolchainにopensslのライブラリを追加する
  3. hostapdのMakefileを編集してビルドする
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を解凍したフォルダ名。

<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につながる。いい感じ。