【Raspberry Pi Zero W】Wi-Fiクライアント/サーバ(AP)切り替え

概要

自宅ではWiFiのクライアント動作し、WiFiのない環境では自らWiFiのサーバ(アクセスポイント)になることで、いつでもラズパイにアクセスしたいと思い、以前、別の記事でWiFiドングルを2つ接続することで実現しました。
しかし、Zeroだと、USBポートも少ないし、消費電力的にも厳しいと思い、(手動ですが)簡単に切り替えられる仕組みを考えてみました。
自宅の環境(例えば、ファイルサーバ、Webサーバ等)をモバイルでも使用(公開)できて便利ですよ。

構成イメージ

 自宅
  Wifiルータ(アクセスポイント)
   └ Raspberry Zero W(WiFiクライアント:wlan0:192.168.1.2)
   └ 端末(Wi-fiクライアント:192.168.1.100~200)

 外出先
  Raspberry Zero W(アクセスポイント:wlan0:192.168.2.1)
   └ 端末(Wi-fiクライアント:192.168.2.100~200)

自宅設定(WiFiモード)

 それぞれだと思うので参考程度に。。

$ sudo vi /etc/network/interfaces
・・・
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
・・・
network={
        ssid="使用するSSID"
        psk="上記SSIDのパスワード"
}

外出先設定の構築(APモード)

外出先設定を上書きしてしまうので、まずはバックアップしてから編集し、同様にバックアップ。

$ sudo cp -p /etc/network/interfaces ~/wifi_interfaces
$ sudo vi /etc/network/interfaces
・・・
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
$ sudo cp -p /etc/network/interfaces ~/ap_interfaces

アクセスポイントとDHCPサーバの環境構築は別の記事参照。
違いはwlan1でなくwlan0。

切替

現在APモードとして動作している前提で、WiFiモードに切り替えます。

$ sudo systemctl disable hostapd
$ sudo systemctl disable isc-dhcp-server
$ sudo cp -p wifi_interfaces /etc/network/interfaces

$ sudo reboot

再起動後、WiFiモードになっていれば成功。次はその逆。

$ sudo systemctl enable hostapd
$ sudo systemctl enable isc-dhcp-server
$ sudo cp -p ap_interfaces /etc/network/interfaces

$ sudo reboot

再起動後、APモードになっていれば成功。
もう少し楽するため、スクリプト化。

$ vi ~/netch.sh
netch.sh
#!/bin/bash

if [ "$1" == "ap" ]; then
    sudo systemctl enable hostapd
    sudo systemctl enable isc-dhcp-server
    sudo cp -p /etc/network/interfaces /etc/network/interfaces.bak
    sudo cp -p ap_interfaces /etc/network/interfaces
elif [ "$1" == "wifi" ]; then
    sudo systemctl disable hostapd
    sudo systemctl disable isc-dhcp-server
    sudo cp -p /etc/network/interfaces /etc/network/interfaces.bak
    sudo cp -p wifi_interfaces /etc/network/interfaces
else
    echo "abort."
    exit
fi

cat /etc/network/interfaces

read -p "reboot ok? (y/N): " yn
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac

sudo reboot

WiFiモードにする場合

$ ./netch.sh wifi
・・・
reboot ok? (y/N):y

APモードにする場合

$ ./netch.sh ap
・・・
reboot ok? (y/N):y

応用

Raspberry Pi Zero W は Bluetooth が使用できるので、Bluetoothリモートシャッターで写真撮影を参考に、多少改造すれば、ボタン操作での切り替えも可能ですね。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.