2017.01.05
- 人×技術
Raspberry Piでローカルアクセスポイントを立てる
こんにちは、イシイです。
展示の場などにおいて、センサーから取得したデータをネットワーク化したコンピュータ間で共有するために、アクセスポイントがあると便利なケースがありますが、必ずしも無線ルーターが設置されているというわけではありません。そのため、今回のエントリーでは、Raspberry Piで自前のアクセスポイントを立てて、ネットワーク化されたコンピュータ間でopenFrameworksを使ってOSC通信を行う環境の構築を試してみました。
構築する環境
Mac(openFrameworks) --> OSC(Wi-Fi) --> Raspberry Pi 2(openFrameworks)
というような、無線ルーターを介さずに直接コンピュータ同士でやりとりを行う環境を構築してみます。今回使用したRaspberry Piは2ですが、3でもZeroでも検証済みです。OSは「Raspbian JESSIE」(2016-11-25-raspbian-jessie)を使用しました。なお、OSのインストール作業は割愛し、RaspbianOSは一通りインストールできているものとします。また、Wi-Fiドングル経由でインターネットに接続している環境を想定していますので、イーサネット使用時は適宜読み替えてください。
無線LAN USBアダプタ
Raspberry Pi 2でWi-Fiを使用するためにはWi-Fiドングルが必要になります。今回検証に使用したWi-FiドングルはPLANEX GW-USNANO2AとBUFFALO WLI-UC-GNM2です。
アクセスポイントを立てる
hostapdのインストール
アクセスポイントを利用できるようにするためにhostapdをインストールします。apt-getでインストールできるのですが、apt-getでインストールできるver2.3ではうまく動きませんでした。ただ、設定ファイルの雛形などはそのまま利用できるため、いったんapt-getでver2.3のものをインストールしてしまいます。
Raspberry Piでhostapdをインストールします。
sudo apt-get update
sudo apt-get install hostapd
これでいったんver2.3のものがインストールできました。
固定IP化
Raspberry PiのIPアドレスを固定化しておきます。/etc/network/interfacesを開き、wlan0の部分を下記のように編集します。
allow-hotplug wlan0
#iface wlan0 inet manual
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
ここでは192.168.1.1を指定していますが、IPアドレスは自由に設定してください。
hostapdの設定
設定ファイルの雛形を持ってきます。
cd /etc/hostapd/
sudo cp /usr/share/doc/hostapd/examples/hostapd.conf.gz ./
sudo gzip -d hostapd.conf.gz
これで、hostapd.confができるので、この設定ファイル/etc/hostapd/hostapd.confを編集します。 設定ファイルは以下のようにします。なお、該当以外の項目はデフォルトのままで大丈夫です。
interface=wlan0
driver=nl80211
ssid=4009
hw_mode=g
channel=2
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssidに設定したいSSID名を、wpa_passphraseにパスフレーズを記載します。なお、channelについては環境に応じて適宜使用チャンネルを変えてください。次にhostapd実行時にこの設定ファイルを読み込むように/etc/default/hostapdを開き、DAEMON_CONFのところを修正します。
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"
これで設定部分ができました。
hostapdの再インストール
前述の通り、ver2.3のhostapdでは正しく動かなかったため、hostapdの公式ページから最新のソースファイル(※エントリー作成時点でv2.6)を持ってきます。
cd
wget https://w1.fi/releases/hostapd-2.6.tar.gz
tar zxvf hostapd-2.6.tar.gz
apt-getで必要なパッケージをインストールし、.configにオプションを追加してmakeします。
sudo apt-get install libnl-genl-3-dev libssl-dev
cd hostapd-2.6/hostapd
cp defconfig .config
echo CONFIG_LIBNL32=y >> .config
make
コンパイルが終わったら、hostapdファイルを差し替えます。
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd_v2.3
sudo cp hostapd /usr/sbin/
これで試しにhostapdを実行してみると、指定したSSIDでアクセスポイントが立ち上がっているのが確認できます。
sudo ifdown wlan0
sudo ifup wlan0
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
sudo service hostapd status
DHCPサーバーの機能を持たせる
isc-dhcp-serverのインストール
アクセスポイントはできましたが、接続しに行ったコンピュータにIPアドレスを動的に払い出しするように、Raspberry PiにDHCPの機能を付与していきます。先程、hostapdを有効化してアクセスポイントモードになっているため、そのままだとインターネットに接続できません。そのため、インターネットに接続するために/etc/network/interfacesを開き、wlan0の部分の設定を元に戻します。
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#iface wlan0 inet static
#address 192.168.1.1
#netmask 255.255.255.0
ネットワークを再有効化します。
sudo ifdown wlan0
sudo ifup wlan0
これでインターネットに接続できるようになったので、まずはapt-getでDHCPサーバーのインストールを行います。
sudo apt-get install isc-dhcp-server
DHCPの設定
続けて、isc-dhcp-serverの設定ファイルを変更します。/etc/dhcp/dhcpd.confを開き、domain-nameをコメントアウト
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
↓
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
authoritativeのコメントアウトを外して有効にし、
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;
↓
authoritative;
末尾に下記の設定を追記します。なお、IPアドレスの払い出し範囲のRangeは適宜設定してください。
ping-check true;
subnet 192.168.1.0 netmask 255.255.255.0 {
option broadcast-address 192.168.1.255;
range 192.168.1.10 192.168.1.50;
}
isc-dhcp-serverのインタフェースの設定のため、/etc/default/isc-dhcp-serverを開き、インタフェースにwlan0を追記します。
INTERFACES=""
↓
INTERFACES="wlan0"
再度アクセスポイントモードに変更するため、/etc/network/interfacesの設定を元に戻します。
allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
ネットワークを再有効化します。
sudo ifdown wlan0
sudo ifup wlan0
DHCPサーバーを起動してみます。
sudo /etc/init.d/isc-dhcp-server start
sudo service isc-dhcp-server status
エラーなく起動すれば、DHCPサーバのインストールは完了です。
hostapdも立ち上げ
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
AP-ENAMLEDになれば、ローカル内でのアクセスポイントの構築作業は完了です。SSIDに指定したパスフレーズでつながり、DHCPによって指定したIPアドレス範囲内に動的にアドレスが割り当てられていることが確認できます。
SSIDのステルス設定
諸々稼働が確認できたら、SSIDをステルスにしておくのも良さそうです。/etc/hostapd/hostapd.confで
ignore_broadcast_ssid=0
↓
ignore_broadcast_ssid=1
にすることで、SSIDをステルスモードにできます。
Raspberry PiでopenFrameworksを動かす
メモリ割り当て
ネットワーク通信の検証実行アプリケーションとして、Raspberry PiでopenFrameworksを使ってみます。openFrameworks公式のページを参照すると、ビデオメモリが192MB推奨、コンパイル済のものであれば128MBでも良いと書いてあるので、いったん128MBを割当てます。
sudo raspi-config
で設定を開き、「7 Advanced Options」から「A3 Memory Split」で128MBを指定して再起動します。
openFrameworksのインストール
まずはパッケージをダウンロードし、解凍します。ダウンロードするのは、Raspberry Pi 2, 3, Zero共にlinux armv6版です。
cd
wget http://openframeworks.cc/versions/v0.9.3/of_v0.9.3_linuxarmv6l_release.tar.gz
mkdir openFrameworks
tar vxfz of_v0.9.3_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1
次にシェルを実行して必要パッケージをインストールします。
cd /home/[username]/openFrameworks/scripts/linux/debian
sudo ./install_dependencies.sh
接続先がうまくいかずに終わらないときは、トラブルシューティングを見る感じだと、/etc/apt/sources.listをミラーのどこかに変えてくださいとのこと。ひとまずミラーを変える前に、何度かトライしてみるのも良いと思います。諸々インストールできたらコンパイルしてみます。
make Release -C /home/[username]/openFrameworks/libs/openFrameworksCompiled/project
これでopenFrameworksを動かす環境が整いました。
Raspberry PiでOSC受信プログラムの実行
今回はRaspberry PiでOSC受信させるため、oscReceiverExampleを実行してみます。
cd /home/[username]/openFrameworks/examples/addons/oscReceiveExample
でアプリケーションのディレクトリに移動し、makeします。
make
make run
これで、Raspberry Pi上でOSC受信プログラムが動きました。
MacでOSC送信プログラムの実行
Mac側では、examples/addons/oscSenderExampleを使います。ofApp.hのホストとポートが、Raspberry Pi側と合っているかの確認をして実行します。
#define HOST "192.168.1.1"
#define PORT 12345
ネットワーク構築後の試験結果
これで、Raspberry Piで立てたローカル内のアクセスポイントでつながっているコンピュータ間でOSC通信ができました。
今回は実験用にMacからRaspbery Piへの1対1での環境で試してみましたが、この仕組を使ってRaspberry Piだけで構築した複数台ネットワーク間でセンサーデータをリアルタイム共有、みたいなこともできたりするので、活用幅がありそうです。