2015-08-03

Raspberry Piで無線LAN

Raspberry Pi に、USBの無線LANアダプタを接続します。本稿執筆時点の最新版 2015-05-05-raspbian-wheezy.img に基づいています。

参考

とりあえずlsusb

USB接続無線LANアダプタを用意します。初めに、Raspberry Piに接続したとき、認識されるか確認しましょう。

接続前

root@raspberrypi:/home/pi# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05af:0507 Jing-Mold Enterprise Co., Ltd

接続後

root@raspberrypi:/home/pi# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 0bda:8174 Realtek Semiconductor Corp. RTL8192SU 802.11n WLAN Adapter
Bus 001 Device 004: ID 05af:0507 Jing-Mold Enterprise Co., Ltd

Realtek Semiconductor Corp. RTL8192SU 802.11n WLAN Adapter というのが、明らかに今回の題材です。

コマンドラインで設定する方法

いきなり wpa_supplicant なんか使おうと思っても、慣れてないと絶対うまくいかないので、コマンド入力でやる方法から順を追って、コツを掴んでいく方がおすすめです。

ネットワークアダプタを列挙

まず ifconfig を実行してみます。

root@raspberrypi:/home/pi# ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:34:51:b5
          inet addr:192.168.0.234  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:374 errors:0 dropped:0 overruns:0 frame:0
          TX packets:206 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:38443 (37.5 KiB)  TX bytes:30427 (29.7 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)

wlan0     Link encap:Ethernet  HWaddr 00:22:cf:3e:f8:e6
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/etc/network/interfaces を見てみます。

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

自動的にwlan0/wlan1が立ち上がるようになっているようです。

上記、参考サイトRaspberry Piを無線LAN化 - ぱせらんメモに書かれているとおり、周囲のアクセスポイントをスキャンしてみます。

root@raspberrypi:/home/pi# iwlist wlan0 scan|grep ESSID
                    ESSID:"aterm-xxxxxx-g"
                    ESSID:"aterm-xxxxxx-gw"
                    ESSID:"203Za-xxxxxx"
                    ESSID:"auhome_xxxxxx-W"
                    ESSID:"auhome_xxxxxx"
                    ESSID:"106Fxxxxxxxx-x"
                    ESSID:"0024xxxxxxxx"
                    ESSID:"106Fxxxxxxxx"

接続してみる

iwconfigコマンドを実行します。

iwconfig wlan0 essid {接続先のSSID} key s:{パスフレーズ}

root@raspberrypi:~# iwconfig wlan0 essid MySSID key s:MyPassPhrase
root@raspberrypi:~# iwconfig wlan0
wlan0     unassociated  Nickname:"rtl_wifi"
          Mode:Managed  Access Point: Not-Associated   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

上記はうまくいってない例です。一度 ifdown しないと、うまくいかないことがあるようです。

root@raspberrypi:~# ifup wlan0
ifup: interface wlan0 already configured
root@raspberrypi:~# ifdown wlan0
root@raspberrypi:~#
では、もう一度やってみます。
root@raspberrypi:~# iwconfig wlan0 essid MySSID key s:MyPassPhrase
root@raspberrypi:~# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"MySSID"  Nickname:"rtl_wifi"
          Mode:Managed  Frequency:2.417 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:2331-6164-6131-3831-3924-0000-00   Security mode:open
          Power Management:off
          Link Quality=0/100  Signal level=100/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

コマンドライン編はここまで。

ここで dhclient wlan0 を実行して、IPアドレスが割り当てらたならば通信できるのですが、そもそも、この時点では、プロトコルや暗号に関して一切の設定を行っていません。従って、これ以上先に進めなくても、気にする必要はありません。

interfacesに設定を直接記述する方法

2015-05-05-raspbian-wheezy をインストールした直後の interfaces の内容を、もう一度見てみます。

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

eth0(有線LAN)とwlan1はしばらく使わないので消します。コメントアウトでも構いません。必要になったら後で戻します。ここでは、無線LANを使用するために必要な最小限に限って設定します。

wlan0のために最低必要な設定だけにすると以下のようになります。

auto lo
iface lo inet loopback

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-ssid "MySSID"
wpa-psk "MyPassPhrase"

iface default inet dhcp

参考サイトRaspberry Piを無線LAN化 - ぱせらんメモに書かれているとおり、必要なら、 wpa-proto や、その他設定を書き加えます。

wpa-driver wext は、使用するドライバを指定します。無くても動く場合もありますが、これを書いていなくてハマったという事例もあるようです。

wpa-scan-ssid 1 は、ステルスSSIDを使用する際に必要とのことです。普通のSSIDなら 0 でも構いませんが、常に 1 を設定しても特に問題はないかと思います。

wpa_supplicantを利用する方法

素のDebianの場合、wpasupplicantをインストールする必要があるかもしれません。

apt-get install wpasupplicant

Raspbianでは、初めから入っているはずですので、上のコマンドを実行する必要はありません。

/etc/network/interfaces

接続先の設定は wpa_supplicant.conf を参照するように変更します。

auto lo
iface lo inet loopback

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

/etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicant.conf に、最低限必要な設定は、以下の通り。

network={
    ssid="MySSID"
    psk="MyPassPhrase"
}

これは、wpa_passphraseコマンドが出力した結果そのものです。

root@raspberrypi:~# wpa_passphrase MySSID MyPassPhrase
network={
        ssid="MySSID"
        #psk="MyPassPhrase"
        psk=a44e1ee40ca3c10a0368242a4f6172f00fc5d265cf5d60e412f9b01131589def
}

接続先のアクセスポイントとのやりとりがうまくいけば、上の4行だけで接続できますが、通常は、OSインストール直後の既存の wpa_supplicant.conf に、networkの定義を書き加える形となります。手を抜かずに、もう少し丁寧に記述するなら以下のようになります。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="MySSID"
    #psk="MyPassPhrase"
    psk=a44e1ee40ca3c10a0368242a4f6172f00fc5d265cf5d60e412f9b01131589def
    key_mgmt=WPA-PSK
    proto=WPA2
    pairwise=CCMP
    group=CCMP
    scan_ssid=1
}

最初の2行は、OSのインストール時に初めから書かれていたものです。コマンドラインの対話型設定ツール wpa_cli を使用するなら、この2行が必要です。

パスフレーズはpskで指定しますが、平文で記述する場合はダブルクォートで囲み、16進数で記述する場合はダブルクォートは使いません。パスフレーズを平文で書いてあるのが気持ち悪いという方は、16進数のpskだけ残して、平文のpskは消しましょう。

protoはWPAやWPA2を指定します。pairwiseとgroupはCCMPやTKIPを指定します。CCMPとは何かを調べたら、ブロック暗号のモードで、無線LANに関して言えば、AES暗号を利用するということのようです(暗号は私の専門ではないので、これ以上深追いしません。)。TKIPはWEPの代替の仕様だそうです。WEPよりTKIPの方がマシですが、どちらももはや時代遅れの様です。WPA(WPA1)とTKIPは、あわせて「WPA-TKIP」などと表記されます。その後継がWPA2で、現時点において最良とされているAES暗号を利用します。CCMPといった場合、WPA2-AESの事を指していると考えて良いと思います。(例によって、私の専門ではry)

通常スキャンでは表示されないSSID(ステルスSSID)を使用する場合、 scan_ssid=1 という設定が必要です。

起動

普通はここで Raspberry Pi を再起動します。

その前に、コマンド入力で、接続してみましょう。

service networking start を実行します。もしこれが失敗するようでしたら、先に service networking stop を実行してからやり直します。

完了まで、およそ40秒程度かかりますので、気長に待ちます。

root@raspberrypi:~# service networking start
[.....] Configuring network interfaces...Internet Systems Consortium DHCP Client 4.2.2
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.0.1
DHCPACK from 192.168.0.1
bound to 192.168.0.237 -- renewal in 5816 seconds.
ifup: interface wlan0 already configured
done.

service networking の stop と start を繰り返していると、たまに start が失敗します。 stop 直後、短時間のうちに start すると、失敗しやすいようです。

DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
Terminated
failed.

焦らず、もう一度 start すると、たいてい成功します。

接続確認

ifconfigでアドレスを確認して、pingを実行してみます。

root@raspberrypi:~# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.0.237  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1313 errors:0 dropped:2 overruns:0 frame:0
          TX packets:401 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:151115 (147.5 KiB)  TX bytes:63593 (62.1 KiB)

root@raspberrypi:~# ping www.google.co.jp
PING www.google.co.jp (216.58.221.3) 56(84) bytes of data.
64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=1 ttl=56 time=9.98 ms
64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=2 ttl=56 time=10.7 ms
64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=3 ttl=56 time=11.6 ms
64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=4 ttl=56 time=8.86 ms
^C
--- www.google.co.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 8.863/10.300/11.615/1.016 ms

もし、 eth0 と wlan0 が両方生きていて、しかも、どちらも同じネットワークに属している場合は、正しくルーティングが行われず、通信が誤動作するかもしれません。あるいは、どちらの経路で通信が行われているか、分からなくなることがあります。有線と無線を異なるネットワークにするか、 /etc/network/interfaces の eth0 の設定を消して、LANケーブルを抜いておくか、そのあたりを確認します。

service networking start で、正常に接続されることが確認できたら 、今度こそ Raspberry Pi を再起動します。

reboot

通信が安定しない場合

上のリンクで紹介した、「Raspberry Piで無線LANの反応が悪い時の対処法」に記載されているとおりですが、パワーマネジメント機能が有効になっていると、時々に通信が途切れるたり、反応がもたついたりなど、安定しないことがあります。Realtek社製のチップを使用している場合は、下記の方法でパワーマネジメント機能をオフにします。

まず、 lsusb コマンドを実行して、Realtek Wireless Adapter などと表示されているものがあるか確認します。つぎに、 lsmod コマンドを実行して、8192cuというモジュール名が表示されるか確認します。

とりあえず確認

root@raspberrypi:/home/pi# cat /sys/module/8192cu/parameters/rtw_power_mgnt
1

「1」と表示されたら、パワーマネジメント機能が有効になっています。

/etc/modprobe.d/8192cu.conf

ファイルを編集します。なければ新しく作ります。

options 8192cu rtw_power_mgnt=0

他にも、 rtw_enusbss=0|1 、 rtw_ips_mode=0|1 などの設定があるようですが、よくわかりません。フォーラムに少し説明が載っています。

再起動

root@raspberrypi:/home/pi# reboot

もう一度確認

root@raspberrypi:/home/pi# cat /sys/module/8192cu/parameters/rtw_power_mgnt
0

「0」と表示されたら、パワーマネジメントがオフになっています。これで通信が安定すると思います。