こんにちは、イシイです。

展示の場などにおいて、センサーから取得したデータをネットワーク化したコンピュータ間で共有するために、アクセスポイントがあると便利なケースがありますが、必ずしも無線ルーターが設置されているというわけではありません。そのため、今回のエントリーでは、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-USNANO2ABUFFALO 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

thumb_1

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サーバのインストールは完了です。

thumb_2

hostapdも立ち上げ

sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf

AP-ENAMLEDになれば、ローカル内でのアクセスポイントの構築作業は完了です。SSIDに指定したパスフレーズでつながり、DHCPによって指定したIPアドレス範囲内に動的にアドレスが割り当てられていることが確認できます。

thumb_3 thumb_4

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受信プログラムが動きました。

thumb_5

MacでOSC送信プログラムの実行

Mac側では、examples/addons/oscSenderExampleを使います。ofApp.hのホストとポートが、Raspberry Pi側と合っているかの確認をして実行します。

#define HOST "192.168.1.1"
#define PORT 12345

thumb_6

ネットワーク構築後の試験結果

これで、Raspberry Piで立てたローカル内のアクセスポイントでつながっているコンピュータ間でOSC通信ができました。

thumb_7

今回は実験用にMacからRaspbery Piへの1対1での環境で試してみましたが、この仕組を使ってRaspberry Piだけで構築した複数台ネットワーク間でセンサーデータをリアルタイム共有、みたいなこともできたりするので、活用幅がありそうです。