Androidで無線LAN通信してみる

システム3部鈴木です。

アットマークテクノ社製パネルコンピュータ、Armadillo-500 FXにAndroid1.5(cupcake)を載せて、無線通信する方法を説明します。
先日公開されたAndroid1.6(donut)では、今回のエントリーで行っているソースの修正は不要との話も耳に挟んでいるので、既に内容が風化しているかもしれません・・・。

今回の確認環境はこうなっています。

  • Armadilloユーザーランド: Atmark dist v20090318
  • Linuxカーネル : android-2.6.27 + patch (過去エントリー「LinuxカーネルとArmadilloユーザーランドをビルドする」を参照)
  • Androidユーザーランド:1.5(cupcake)
  • USB無線LANモジュール : Planex社 GW-US54Mini2
  • USB無線LANモジュールドライバ : Ralink RT2X00
  • 開発環境 : atde2 v20090403

無線LANモジュールにPlanex社 GW-US54Mini2を選んだ理由は、アットマークテクノ社の開発者サイトの記事、「Armadillo-500 FXでUSB無線LANモジュールを使う」で紹介されていたためです。
GW-US54Mini2にはGW-US54Mini2S/B/Gというバリエーションがあるようですが、いずれでも問題ありません。

さて。Androidにおいて、無線LAN(以下Wi-Fi)の利用には、wpa_supplicantというサービスを利用します。
cupcakeのソースに含まれているwpa_supplicant-0.5.10は上記の開発者サイトで利用しているRalink社純製のドライバに対応していないようなので、あらかじめカーネルに含まれている(ただしデフォルトではビルドされない)、Ralink RT2X00というドライバ(Ralink社純正ではなく、オープンソースの模様)を使用することにします。

Armadilloではないのですが、bc9というPDAにAndroidを載せてUSB無線LANアダプタを使用し、AndroidのGUI(設定画面)からWi-FiのON/OFFを可能にした、という記事が以下のサイト様にあったので、大いに参考にさせていただきます。
毎度この調子ですね。
bc9/Software/Android/Android_Wi-Fi

ほぼ上記のサイトに書かれている手順に従えばWi-Fi設定は完了しますが、若干の相違があるので、相違点のみ以下にまとめます。

Ralink RT2X00のビルド

参照サイトさんにconfigの設定が載っていなかったので補足します。
Ralink RT2X00ドライバをモジュールとしてビルドするには、menuconfigで下記のように設定します。
先に「Generic IEEE 802.11 Networking Stack (mac80211)」を<*>にしないとドライバの選択肢が表示されませんので注意です。

Linux Kernel Configuration
  Networking support  --->
    Wireless  --->
      <*> Generic IEEE 802.11 Networking Stack (mac80211)
  Dvice Drivers  --->
    Network device support  --->
      Wireless LAN  --->
      [*] Wireless LAN (IEEE 802.11)
      ...
      <M> Ralink driver support
      < >   Ralink rt2500 (USB) support
      <M>   Ralink rt2501/rt73 (USB) support
      [*]     Ralink rt2501/rt73 leds support

また、Ralink RT2X00 をロードするためには CRC ITU-T というライブラリが必要です。
デフォルトの設定ではモジュール{M}になっているので、静的組込{*}に変更します。

Linux Kernel Configuration
    Library routines  --->
        {*} CRC ITU-T V.41 functions

wifi.c ファイルの修正

ドライバのロードに関して、参照サイトさんではRalink RT2X00 ドライバをモジュールとしてビルドするように指示しているのですが、wifi.c の修正箇所にはドライバが静的に組み込まれていることを前提にしている部分があります。
これによってWi-Fiの設定が必ず初回にドライバのロード待ちでタイムアウトし、失敗するようです。
以下のように修正します。insmodが3連続しているのが目印です。
※ただし、まだ試していませんが、ドライバを静的に組み込むようにすれば元サイトどおりの修正でOKでしょう。

-   // Hack taken from EEPC WiFi path. We have statically linked the WiFi driver
-   // into the kernel, so we simply return and don't attempt to load the driver.
-   // So we set the driver property to ok, since we have already installed it.
-   property_set(DRIVER_PROP_NAME, "ok");
    if (check_driver_loaded()) {
        return 0;
    }
    insmod(RT2X00_LIB_DRIVER_MODULE_PATH);
    insmod(RT2X00_LIB_USB_DRIVER_MODULE_PATH);
    insmod(DRIVER_MODULE_PATH);
+   property_set(DRIVER_PROP_NAME, "ok");
    property_set("ctl.start", 0);
    sched_yield();

Androidユーザーランドの調整

検証の結果、必要なディレクトリが作成されていないと、 wpa_supplicant がエラーを出して設定が失敗するようなので、init.rc に必要なディレクトリの作成処理を追加します。 on boot の記述より前に追加します。

mkdir /data/misc/wifi 0770 system misc
mkdir /data/misc/wifi/sockets 0770 system misc
mkdir /data/system/wpa_supplicant 0770 system misc
mkdir /data/misc/dhcp 0770 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp

残る問題

以上の手順で設定することで、Android の GUI から Wi-Fiの設定が出来るようになります。
しかし、現在わかっているだけで以下の問題が残っています。

  • 起動後にUSB無線LANアダプタを挿さないと認識されない
  • APを見つけた後、接続の確立に必ず1度失敗する
  • しばらく通信しないと接続が切れている

タグ:

コメント / トラックバック2件

  1. Jeannie より:

    A minute saved is a minute enaerd, and this saved hours!

  2. Auth より:

    That’s way the beesstt answer so far!

コメントをどうぞ