hostapdとWifiClientの切り替え

Hostapd起動中は別途USBのWifiアダプタなどを使用しない限りWifiクライアントとして利用できないため、それを簡単に切り替えれるように設定します。

Hostapdを利用するために設定したファイルのうち、以下のファイルを編集します。

  • /etc/dhcpcd.conf
  • /etc/sysctl.conf
  • /etc/network/interfaces

今回はこれらのファイルに対し、AP化オン時オフ時それぞれのファイルを作成し、設定に対して上記のファイルを差し替えます。

なお、切り替え時は~/.ap_modeファイルの中身が1ならAP化オン、0ならAP化オフにし、sudo rebootすることで設定が反映されるようにします。

Hostapdオン時の設定ファイルの退避

新しく、~/以下に.apファイルを作成します。

$ cd
$ mkdir .ap/

その後、.ap/ディレクトリに移動し、その中にon_ap_configfiles/, on_wifi_configfiles/を作成します

$ cd ~/.ap
$ mkdir on_ap_configfiles/
$ mkdir on_wifi_configfiles/

なお、~/.ap/on_ap_configfiles/内に AP化オン時の設定ファイル~/.ap/on_wifi_configfiles/内に AP化オフ時の設定ファイルを保存します。

Hostapdの設定を行ってあることが前提 で、次のコマンドを実行し、AP化オン時の設定ファイルをコピーします

$ cd ~/.ap/on_ap_configfiles/
$ cp /etc/network/interfaces ./
$ cp /etc/dhcpcd.conf ./
$ cp /etc/sysctl.conf ./

/etc/dhcpcd.conf ファイルの編集

以下のコマンドで、dhcpcd.confファイルを~/.ap/on_wifi_configfiles/にコピーします

$ cd ~/.ap/on_wifi_configfiles/
$ cp ../on_ap_configfiles/dhcpcd.conf ./

このコピーしてきた(~/.ap/on_ap_configfiles/以下の)ファイルを編集します。

編集方法は簡単で、その他すべての設定ファイルについてもHostapd設定時に変更した点を戻せばいいだけです。

ファイルの末尾に記述した、

...
interface wlan0
static ip_address=192.168.42.1/24

以上の記述を以下のようにコメントアウトします

...
#interface wlan0
#static ip_address=192.168.42.1/24

/etc/network/interfaces ファイルの編集

以下のコマンドで、intefacesファイルを~/.ap/on_wifi_configfiles/にコピーします

$ cd ~/.ap/on_wifi_configfiles/
$ cp ../on_ap_configfiles/interfaces ./

このコピーしてきた(~/.ap/on_ap_configfiles/以下の)ファイルを編集します。

...
iface wlan0 inet manual
#   wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
...

この記述を、

...
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
...

このように、wpa_conf ...という記述のある行のコメントアウトを外します


/etc/sysctl.conf ファイルの編集

以下のコマンドで、sysctl.confファイルを~/.ap/on_wifi_configfiles/にコピーします

$ cd ~/.ap/on_wifi_configfiles/
$ cp ../on_ap_configfiles/sysctl.conf ./

このコピーしてきた(~/.ap/on_ap_configfiles/以下の)ファイルを編集します。

...
net.ipv4.ip_forward=1
...

この記述を、

...
#net.ipv4.ip_forward=1
...

コメントアウトします。


自動実行されるスクリプトファイルの作成

この設定を反映させるために、起動時に実行するスクリプトを書きます。

~/.ap/以下にtoggle_ap_wifi.shファイルを作成し、ここに以下のスクリプトを記述します。

#!/bin/bash

flg=`cat /home/pi/.ap_mode`

oldval=`sysctl net.ipv4.ip_forward | awk 'BEGIN{FS=" "}{print $3}'`

if [ -e /home/pi/.ap_mode -a $flg = '1' ] ; then
    cp /home/pi/.ap/on_ap_configfiles/interfaces   /etc/network/interfaces
    cp /home/pi/.ap/on_ap_configfiles/dhcpcd.conf  /etc/dhcpcd.conf
    cp /home/pi/.ap/on_ap_configfiles/sysctl.conf  /etc/sysctl.conf
else
    cp /home/pi/.ap/on_wifi_configfiles/interfaces   /etc/network/interfaces
    cp /home/pi/.ap/on_wifi_configfiles/dhcpcd.conf  /etc/dhcpcd.conf
    cp /home/pi/.ap/on_wifi_configfiles/sysctl.conf  /etc/sysctl.conf
fi

if [ $flg != $oldval ] ; then
  if [ $flg = '1' ] ; then
    systemctl enable hostapd
    systemctl enable isc-dhcp-server
  else 
    systemctl disable hostapd
    systemctl disable isc-dhcp-server
  fi
  echo 1
  reboot
fi

ここまでのディレクトリツリー

ここまでのディレクトリツリーを確認します。 以下のようになっていなかったら、再度手順を見直してください

- ~/
    - .ap_mode                <- 設定用ファイル(中身は 1 or 0)
    - .ap/
        - toggle_ap_wifi.sh   <- 自動反映用のスクリプト
        - on_ap_configfiles/
            - interfaces      <- AP化オン時の設定のもの
            - sysctl.conf     <- AP化オン時の設定のもの
            - dhcpcd.conf     <- AP化オン時の設定のもの
        - on_wifi_configfiles/
            - interfaces      <- AP化オフ時の設定のもの
            - sysctl.conf     <- AP化オフ時の設定のもの
            - dhcpcd.conf     <- AP化オフ時の設定のもの

自動実行されるように設定

/etc/rc.localに以下の記述をします

...

##### add this code
bash /home/pi/.ap/toggle_ap_wifi.sh
#####

exit 0

注意 : exit 0の直前に記述してください

その後、実際に~/.ap_modeファイルを作成し、

0

ないしは

1

と記述して、sudo rebootし、動作が正しいことを確認してください


注意 ) なお、この設定を施したあとに/etc/network/interfaces, /etc/dhcpcd.conf, /etc/sysctl.confファイルを変更する際は ~/.ap/on_ap_configfiles/,~/.ap/on_wifi_configfiles/内のファイルを両方変更してください