Raspberry PiとスマートフォンをWiFiでアドホック接続

Raspberry PiとスマートフォンをWiFiで直接接続したい

 Raspberry Piとスマートフォン(iPhone/Android)を直接WiFiで接続したいときってありますよね?そんな場合。今までは

Raspberry Pi - (WiFi) - 無線LANルータ - (WiFi) - スマートフォン

 といった感じに間に無線LANルータをかましていました。こうすると無線LANルータをインターネットに繋ぐとRaspberry PiもスマートフォンもWiFi経由でインターネットに接続できるので便利です。ただ、当然無線LANルータが必要となります。ときにはインターネットに繋がなくてよいので、ルータなしで直接WiFi経由でRaspberry Piとスマートフォンを接続したいときありますよね。例えば、以下のようにWiFiでRaspberry Piとスマートフォンをダイレクトに繋ぐような構成です。

Raspberry Pi - (WiFi) - スマートフォン

 色々なサイトを見ると、Raspberry Piをルータ化している例は見つかるのですが、意外に上記のようなローカルでWiFiでアドホック接続する例が少なく、ネットの情報通りにやっても、少し情報が古かったり、環境が違ったりでそのままではできなかったりしたので、設定方法をメモ代わりに残しておきます。
 環境は、Raspberry Pi 2 + Raspbian Jessie。Raspberry Pi Zero + Raspbian Jessie LITEで確認しています。Raspberry Pi 3は今後確認予定です(ネットで探すと動かしている人はいるみたいです)。

必要なもの

Raspberry Pi 2 + Raspbian Jessieの場合

[asin:B00T356SFO:detail]
Raspberry Pi 2


[asin:B005DU4XSM:detail]
USB WiFiモジュール(BUFFALO WLI-UC-GNM2WiFi)


[asin:B00ESA34GA:detail]
USB WiFiモジュール(PLANEX GW-USNANO2A)

 PLANEX GW-USNANO2Aの方が消費電力少なくおすすめですが、BUFFALO WLI-UC-GNM2WiFiの設定に加えて一手間必要なので注意下さい。PLANEX GW-USNANO2Aの設定は本記事の後ろの方に追記してありますので、注意下さい。

Raspberry Pi Zero + Raspbian Jessie Zeroの場合

 以下参照ください。

 以降は一部の人には宇宙語になるので、興味ある方のみ続きをご覧ください。


設定方法

 Raspberry Piの基本的な設定は完了している前提とします。OSはRaspbian Jessie前提です。セットアップに関しては、以下記事参照下さい。

 大きく以下2つでRaspberry Piと直接WiFi接続可能です。

  • アクセスポイント化(hostapd)
  • DHCPサーバ化(dhcpd)

 正確にはアクセスポイント化だけでも接続できるのですが、クライアント(スマホ)で直接自分のIPアドレスを設定してやらなければいけなくて面倒くさいので、DHCPサーバ化をしています。なので多少手間かかっても直接接続できればよいという人はアクセスポイント化だけまず試してみてください。

アクセスポイント化(hostapd)

hostapdインストール・設定

 hostapdをインストールします。

$ sudo apt-get update
$ sudo apt-get install hostapd

 設定ファイルのひな形をコピー

$ cd /etc/hostapd/
$ sudo cp /usr/share/doc/hostapd/examples/hostapd.conf.gz ./
$ sudo gzip -d hostapd.conf.gz

 設定ファイルを作成・編集します。

$ sudo vi /etc/hostapd/hostapd.conf

 設定は以下。これ以外の項目はひな形のデフォルトのままでOKです。うまく動かないときは、全く修正しないデフォルトの状態でも一度試してみるのもよいかもしれません。

interface=wlan0
# bridge=br0
ssid=karaage
country_code=JP
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
ieee80211n=1
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

 ssidwpa_passphraseは自分の好きなようにつけてください。これがそのままRaspberry PiのSSIDとパスワードになります。他の設定項目の詳細は日本語でざっと見たいなら以下サイトが非常にわかりやすいです。(リンク切れのため削除)

 後は/etc/default/hostapdを以下コマンドで編集。

$ sudo vi /etc/default/hostapd

 以下のみ修正下さい。

DAEMON_CONF="/etc/hostapd/hostapd.conf"

 WiFiモジュールがBUFFALO WLI-UC-GNM2WiFiの場合はここまででよいのですが、PLANEX GW-USNANO2Aの場合はもう一手間必要です。本記事の後半に追記していますので、そちらの設定を忘れず実施下さい。

USB WiFiを固定IP化

 wlan0に固定IPを割り振ります。/etc/network/interfacesを以下のコマンドで編集

$ sudo vi /etc/network/interfaces

 上記ファイルのwlan0のところを以下のように修正下さい。

iface wlan0 inet static
address 192.168.0.20
netmask 255.255.255.0

 IPアドレスはお好みの数字でよいですが、ローカルネットワークだと192.168.0.* を使うのが基本です。wpa-confの設定は削除するかコメントアウトしておきましょう。設定を有効にするため一旦再起動してやりましょう。

$ sudo shutdown -r now
hosapd動作確認

 以下コマンドで起動

$ sudo hostapd /etc/hostapd/hostapd.conf

 iPhoneでWiFiに接続設定します。

f:id:karaage:20151020232229j:plain:w480
 karaageというSSIDが出ている!折角なら大塩平八郎のLANとかにすれば良かった!

 karaageを選択して、自分が設定したパスワードを入力。この後、自分のIPアドレスを手動で設定してやりましょう。Raspberry Piのアドレスの一番最後の数字を変えたものを設定します。例えば今回はRaspberry Piが192.168.0.20なので192.168.0.15とかね。

f:id:karaage:20151020232232j:plain:w480
 こんな感じ

f:id:karaage:20151020232233j:plain:w640
 これで設定完了

 これでRaspberry PiとWiFi経由で接続されたことになります。例えば、iPhoneからServerauditorというアプリを起動してRaspberry PiのIPアドレスを入力してssh接続をしてみます。

f:id:karaage:20151020232236j:plain:w480 
 こんな感じでログインできます。やったね!

 ただ、これだと自分でIPアドレスを入力するの面倒くさいですね。適当な数字なら、勝手に設定して欲しいですよね。それを実現してくれるのがdhcpサーバです。次にRaspberry Piにdhcpdを入れてDHCPサーバ化してみます。

DHCPサーバ化(dhcpd)

 固定IP化してネットに繋がらない状態になっていたら、まずは一旦ネットに繋がるように/etc/network/interfacesを設定してやりましょう。

isc-dhcp-serverインストール・設定

 以下のコマンドでインストール

$ sudo apt-get install isc-dhcp-server

 以下のコマンドでisc-dhcp-serverの設定

$ sudo vi /etc/dhcp/dhcpd.conf

 authoritativeのコメントアウトを外して有効にしましょう(以下のように)。

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;


 そして以下のような設定を追記しましょう。

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.21 192.168.0.50;
  option broadcast-address 192.168.0.255;
}

 この設定により、Raspberry Piに接続したクライアントにdhcpdが192.168.0.21〜50までのIPアドレスを割り振るようになります。よくわからない人はとりあえずコピペしておいて下さい。徐々に理解していけばよいです。私も正直今だによく分かってないです。

isc-dhcp-server動作確認

 ここで再び/etc/network/interfacesを修正してUSB WiFiを固定IP化しましょう。設定内容はhostapdのときと同じでOKです。

 そしたら、以下コマンドを実行して/isc-dhcp-serverを起動します。

$ sudo /etc/init.d/isc-dhcp-server start

 エラーなくdhcpサーバが起動すればOK。次に以下コマンドでhostapdも立ち上げてやります。

$ sudo hostapd /etc/hostapd/hostapd.conf

 この後、hostapdのときと同様にWiFiでRaspberry Piに接続してみます。今度は、自分でIPアドレス設定しなくても、DHCPでIPアドレスが割り振られるようになります。

f:id:karaage:20151021000156j:plain:w480
 こんな感じ。便利!

自動起動設定

 自動的起動有効するためには、以下コマンドを実行ください。

$ sudo update-rc.d hostapd defaults
$ sudo update-rc.d isc-dhcp-server defaults

 以下コマンドで再起動して試してみましょう。再起動後、スマホからWiFiで接続できれば成功です。

$ sudo shutdown -r now

 自動起動を無効にする場合は以下コマンドでOK。

$ sudo update-rc.d hostapd remove
$ sudo update-rc.d isc-dhcp-server remove

PLANEX GW-USNANO2Aを使ってアドホック接続する場合

 PLANEX GW-USNANO2Aを使った場合の設定に関しても追記しました。

[asin:B00ESA34GA:detail]

 理由は圧倒的に消費電力が小さいから。実測もしたからね(以下記事参照)

 長時間使うようなケースだと、やはりBUFFALOよりPLANEXの方が良さそうだなと思い追記しています。

hostapd修正

 BUFFALOの例の通りにhostapdはインストールされている前提です。まずはhostapdをBUFFALOのWiFiモジュールでの設定を参考にインストールして下さい(本記事前半です)。
 apt-getで入るバイナリのhostapdはPLANEXのものには対応していないようなので入れ替えます。具体的には以下サイトからzipファイルをダウンロード。
http://www.adafruit.com/downloads/adafruit_hostapd.zip

 以下コマンドでファイルを解凍して、hostapdファイルを入れ替え。念のため元のファイルはhostapd_orgとしてバックアップをとっておきます。

$ unzip adafruit_hostapd.zip
$ sudo mv /usr/sbin/hostapd /usr/sbin/hostapd_org
$ sudo mv hostapd /usr/sbin/
$ sudo chmod 755 /usr/sbin/hostapd

 /etc/hostapd/hostapd.confを以下のように修正。

driver=rtl871xdrv

 これでPLANEXのWiFiモジュールでもhostapdが使えるようになるはずです。

無線LAN パワーマネジメント機能OFF

 パワーマネジメントOFFの対応した方が接続が安定するようなので設定行います。まずは、以下のコマンドを実行します。

$ cat /sys/module/8192cu/parameters/rtw_power_mgnt

 1が返ってきたらパワーマネジメントONになっています。消費電力は抑えられるのですが、たまに接続が不安定になってしまいます。Planexの無線LANは消費電力元々小さいので、OFFにしてやりましょう。

 下記コマンドで/etc/modprobe.d/8192cu.confファイルを作成

$ sudo vi /etc/modprobe.d/8192cu.conf

 ファイルの中身に下記を書き込む

options 8192cu rtw_power_mgnt=0

 再起動後、下記実行。

$ cat /sys/module/8192cu/parameters/rtw_power_mgnt

 0が返ってきたらパワーマネジメントOFFになっています。

まとめ

 自分のやりたいことを探すのは、言葉を知らないと難しいですね。特にネットワーク周りは分かっているようで全然分かっていないので難しいです。こういうことを繰り返して少しずつ詳しくなっている気はしますが、もうちょい体系的に理解したほうがよいかなとたまに思います。

関連記事

変更履歴

2016/12/01 Raspberry Pi Zeroでの動作確認追記
2016/11/09 小修正
2015/11/22 PLANEX GW-USNANO2Aを使ってアドホック接続する場合を追記