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
ssid
とwpa_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に接続設定します。
karaageというSSIDが出ている!折角なら大塩平八郎のLANとかにすれば良かった!
karaageを選択して、自分が設定したパスワードを入力。この後、自分のIPアドレスを手動で設定してやりましょう。Raspberry Piのアドレスの一番最後の数字を変えたものを設定します。例えば今回はRaspberry Piが192.168.0.20
なので192.168.0.15
とかね。
こんな感じ
これで設定完了
これでRaspberry PiとWiFi経由で接続されたことになります。例えば、iPhoneからServerauditorというアプリを起動してRaspberry PiのIPアドレスを入力してssh接続をしてみます。
こんな感じでログインできます。やったね!
ただ、これだと自分で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アドレスが割り振られるようになります。
こんな感じ。便利!
自動起動設定
自動的起動有効するためには、以下コマンドを実行ください。
$ 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を使った場合の設定に関しても追記しました。
理由は圧倒的に消費電力が小さいから。実測もしたからね(以下記事参照)
長時間使うようなケースだと、やはり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になっています。
まとめ
自分のやりたいことを探すのは、言葉を知らないと難しいですね。特にネットワーク周りは分かっているようで全然分かっていないので難しいです。こういうことを繰り返して少しずつ詳しくなっている気はしますが、もうちょい体系的に理解したほうがよいかなとたまに思います。
参考サイト
Raspberry Piにisc-dhcp-serverを設置、自動起動(20161028版) | Making Mugbot マグボットの作り方
関連記事
変更履歴
2016/12/01 Raspberry Pi Zeroでの動作確認追記
2016/11/09 小修正
2015/11/22 PLANEX GW-USNANO2Aを使ってアドホック接続する場合を追記