Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで

Posted on Posted in 趣味的なIT・ネットの話題

2016/02/08:追記:下記の一連の記事は諸般の事情により奏効しない可能性が高いです。普通に使うのであればこちらの記事を参照してください。
Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで(改訂版)

ネットでいくら事前準備をしてもなかなか一筋縄ではいなかいのがこの世界の常。色々引っかかりましたので、メモを残します。
Raspberry Piの場合、設定がスムーズに行くワイヤレスアダプタを使うのが安全です。が、色々と試して見て、起動が安定するのがWN-G150UMだったという過去の経験から、今回もこれを使うことにします。

まずPiの最初にすることの定番作業として、アップデートをかけます。

sudo apt-get update
sudo apt-get upgrade

ファイルシステムのサイズがSDにあっていないので拡張します。
df -h

sudo raspi-config
から、
expand filesystem
を実行。
localeは変更しません。
timezoneをtokyoに設定。

各種記事からするとavahiをインストールするのが定番のようですが、サービスログから割り当てIPがわかるので、サービスを減らす観点から、今回は止めておきます。

起動安定化のため

/boot/config.txt

safe_mode_gpio=4
max_usb_current=1

WN-G150UMはドライバの追加インストールは不要だが、デバイスIDの指定が必要ということなので設定ファイルに追記。

http://marm.cocolog-nifty.com/jokanaan/2012/12/wn-g150um-on-ra.html

pi@navio-rpi ~ $ sudo vi /etc/udev/rules.d/network_drivers.rules

ACTION==”add”,SUBSYSTEM==”usb”, ATTR{idVendor}==”04bb”, ATTR{idProduct}==”094c”, RUN+=”/sbin/modprobe -qba 8192cu”

pi@navio-rpi ~ $ sudo vi /etc/modprobe.d/network_drivers.conf

install 8192cu /sbin/modprobe –ignore-install 8192cu $CMDLINE_OPTS; /bin/echo “04bb 094c” > /sys/bus/usb/drivers/rtl8192cu/new_id

アクセスポイント化する前にとりあえずクライアントとしてつながるかどうかを確認。

pi@navio-rpi ~ $ sudo nano /etc/network/interfaces

auto lo

iface lo inet loopback

iface eth0 inet dhcp

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

pi@navio-rpi ~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

# Default network

network={
ssid=”apname”
psk=”hogehoge”
}

IP取れました。

pi@navio-rpi ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:f6:3c:22
inet addr:192.168.2.3 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3173 errors:0 dropped:0 overruns:0 frame:0
TX packets:1988 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230514 (225.1 KiB) TX bytes:429332 (419.2 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:37 errors:0 dropped:0 overruns:0 frame:0
TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4312 (4.2 KiB) TX bytes:4312 (4.2 KiB)

wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91
inet addr:192.168.0.108 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:140 errors:0 dropped:345 overruns:0 frame:0
TX packets:27 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:186351 (181.9 KiB) TX bytes:4399 (4.2 KiB)

インターフェースを再起動してつながるか再確認。

pi@navio-rpi ~ $ sudo ifdown wlan0
pi@navio-rpi ~ $ sudo ifup wlan0

pingコマンドはインターフェースを指定できます。

pi@navio-rpi ~ $ ping -I wlan0 192.168.0.1

同じネットワークにつながっているMacからルーター経由でのpingも通りました。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ping 192.168.0.108
PING 192.168.0.108 (192.168.0.108): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
64 bytes from 192.168.0.108: icmp_seq=2 ttl=64 time=20.403 ms
64 bytes from 192.168.0.108: icmp_seq=3 ttl=64 time=4.651 ms

ルーター化のためには8192cuに対応したhostapdをインストールする必要があるらしいです。
僕はこの「8192cu対応hostapd」をインストールするだけで良いと思っていて色々手こずったのですが、実際には、公式のhostapdをインストールして本体のバイナリだけ入れ替えるという作業が正しいようです。
ドライバもコンパイルする必要があるという情報もありましたが、コンパイルが通りませんでしたし、とりあえずOSに付いている奴で動きました。そのため以下のブラックリスト登録は行っていません。
echo “blacklist rtl8192cu” >> /etc/modprobe.d/blacklist.conf

pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 $ sudo apt-get install hostapd

RealtekのダウンロードサイトでダウンロードしたパッケージをSFTPでホームにアップロードしておきます。

pi@navio-rpi ~ $ ls
0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip

深めの階層にありますので降りていってmakeします。

pi@navio-rpi ~ $ cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 $ cd wpa_supplicant_hostapd/
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ tar zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ ls
COPYING README hostapd src wpa_supplicant
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ cd hostapd/
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ make

出来上がったものをコピー。実際には間違って/usr/sbinにもコピーしてしまいました。
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo cp hostapd hostapd_cli /usr/local/sbin/

設定ファイルの作成。ディレクトリの作成あたりは本家パッケージをインストールして入れば不要かもしれません。

pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo mkdir /etc/hostapd
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo touch /etc/hostapd/hostapd.conf
pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo nano /etc/hostapd/hostapd.conf

ssid=pi

interface=wlan0

driver=rtl871xdrv

hw_mode=g
channel=6

# 0 = allowed if not in deny list
macaddr_acl=0

hw_mode=g

wpa=2
wpa_passphrase=raspberry
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=TKIP
max_num_sta=8
wpa_group_rekey=86400

auth_algs=1
ignore_broadcast_ssid=0

wlan0に固定IPを割り当て。

pi@navio-rpi ~ $ sudo nano /etc/network/interfaces

auto lo

iface lo inet loopback

iface eth0 inet dhcp

auto wlan0
iface wlan0 inet static
address 192.168.10.1
netmask 255.255.255.0

hostapdの起動に先立ちWPASupplucantを停止しておく必要がある模様。

sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/

ここでhostapdを起動するとwlan0に割り振られているIPが無くなるという問題発生。以下の設定変更でifplugdの挙動を変更して、eth0に限定する。
/etc/default/ifplugd

変更前
INTERFACES=”auto”
HOTPLUG_INTERFACES=”all”
ARGS=”-q -f -u0 -d10 -w -I”
SUSPEND_ACTION=”stop”

変更後
INTERFACES=”eth0″
HOTPLUG_INTERFACES=”eth0″
ARGS=”-q -f -u0 -d10 -w -I”
SUSPEND_ACTION=”stop”

起動。-ddでログが多くなります。
この時点で他の無線LANデバイスから見えるようになります。DHCPがまだですが固定IPなら接続可に。
スクリプトから起動しないとダメという情報もありましたが動いています。
sudo hostapd /etc/hostapd/hostapd.conf -dd
pi@navio-rpi ~ $ ps ax | grep hostapd

デーモンにするための設定。
pi@navio-rpi ~ $ sudo nano /etc/default/hostapd
DAEMON_CONF=”/etc/hostapd/hostapd.conf”

クライアントに都度固定IPを割り振るのは面倒なのでDHCPサーバーをインストール
pi@navio-rpi ~ $ sudo apt-get install isc-dhcp-server

この時点では設定ファイルができていないので起動に失敗するのでは無いかと思います。あと、適用する先のインターフェースにipが設定されていない場合やはり起動に失敗します。

サーバー動作させる対象のインターフェースを指定
pi@navio-rpi ~ $ sudo nano /etc/default/isc-dhcp-server
INTERFACES=”wlan0″

DHCPサーバーの動作設定
pi@navio-rpi ~ $ sudo nano /etc/dhcp/dhcpd.conf
以下コメントアウト。
#option domain-name “example.org”;
#option domain-name-servers ns1.example.org, ns2.example.org;
以下追記
ping-check true;

subnet 192.168.10.0 netmask 255.255.255.0 {
option routers 192.168.10.1;
option broadcast-address 192.168.10.255;
option subnet-mask 255.255.255.0;
option domain-name “local”;
option domain-name-servers 8.8.8.8,8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
range 192.168.10.101 192.168.10.199;
}

不安定問題はまだ発生していないのですが、もし発生するようならpower managementのオフを設定します。
http://unix.stackexchange.com/questions/64392/intermittent-ping-times-on-a-raspberry-pi-wifi-access-point

今回の用途はクライアントをインターネットに出さないので、ルーターとしての設定は行いません。
再起動後wifiクライアントから接続できれば成功と。


Facebooktwittergoogle_pluspinterestlinkedinmail
納得したらすぐにシェア!