Raspberry Pi Zero WH での Wi-Fi 簡単接続 WPS(Wi-Fi Protected Setup)を設定する備忘録です。
はじめに
ここでは、Sayabo の備忘録として Raspberry Pi Zero WH の Wi-Fi 簡単接続 WPS 設定を記録していきます。
注記:この機能は、Raspberry Pi OS Bookworm 以降では利用できません。
記事内容につきましては、Sayabo の独自仕様や不備、不具合等が含まれる場合がございます。動作保証するものでは、ございませんので、ご参考にされる場合、自己責任にてお願いします。
公式の Wi-Fi 設定については、「The wireless/headless section.」を参照願います。
概要は、Raspberry Pi OS での WPS 用の Wi-Fi 設定から起動時の半自動通信(無線 LAN ルーターの WPS 接続)による接続までとなっています。
準備するもの
Raspberry Pi Zero WH 本体の他に必要となるものを準備します。
- 無線 LAN ルーター(親機)
なにはともあれ、無線 LAN ルーター(親機)が無いと始まりません。w
今回は、NTT のレンタル品「RS-500MI」にて動作検証してます。
基本的には、WPS 機能がついている機器ならば接続できると思われます。
接続検証は、していませんが WPS 機能がついている人気の無線 LAN ルーターには、以下の機種などがあります。
「AirStation WSR-5400AX6S」、「Aterm WX5400HP」、「Archer AX73」など(2022年時点)
無線 LAN ルーター(親機)の WPS 機能は、操作方法が機種により若干、異なりますので必ず操作説明書を参照願います。
今回は、ブルートフォース攻撃対策などのセキュリティを重視していません。利便性を第一に WPS の PIN も設定なしにします。
コマンドラインからの無線(Wi-Fi)LAN 設定
最新の Raspberry Pi は、ネットワーク設定を dhcpcd.conf に書くらしい?
今回は、Raspberry Pi Zero WH なので旧来の方式?/etc/network/interfaces に設定を書きます。
と言っても本当にこれが読み込まれているのか?わからないので念のため、みたいな (;・∀・)
[code language=”bash”]
$ cat /etc/network/interfaces
source-directory /etc/network/interfaces.d
[/code]
interfaces を確認すると source-directory は、interfaces.d だよとある。
なので /etc/network/interfaces.d ディレクトリ以下へネットワーク設定ファイルを書いていく
[code language=”bash”]
$ sudo vi /etc/network/interfaces.d/lo.conf
auto lo
iface lo inet loopback
[/code]
[code language=”bash”]
sudo vi /etc/network/interfaces.d/eth.conf
auto eth0
iface eth0 inet dhcp
[/code]
[code language=”bash”]
sudo vi /etc/network/interfaces.d/wlan.conf
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
[/code]
ここで重要なのは、「wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf」の記述です。
無線 LAN 設定は、「wpa_supplicant.conf」に書きます。
ちなみに、このファイルを Raspberry Pi OS がある MicroSD カードの /boot フォルダに置くと起動時に読み込まれて Wi-Fi 接続されます。
wpa_supplicant
wpa_supplicant は、クロスプラットフォーム(色々な OS 共通)の無線 LAN 用コマンドです。
wpa_supplicant.conf ファイルの基本設定例
[code language=”bash”]
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=<ここに 2文字の ISO3166-1 国コードを挿入(日本ならば JP)>
update_config=1
network={
ssid="< SSID 名 >"
psk="< パスワード >"
}
[/code]
となります。
無線 LAN ルーター(親機)から WPS ボタンなどによる接続では、子機となる Raspberry Pi 側での SSID、パスワード設定は、不要となります。
なので、先ほどの「wpa_supplicant.conf」にある network の項目を外します。
[code language=”bash”]
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=JP
update_config=1
[/code]
ctrl_interface、country、update_config の項目だけを残します。
そして、無線 LAN ルーター(親機)から WPS ボタンを押して有効な状態中に Raspberry Pi 側で以下の接続コマンドを叩きます。
[code language=”bash”]
$ sudo wpa_cli -i wlan0 wps_pbc
[/code]
これで WPS による無線 LAN 接続ができます。接続できましたでしょうか?
WPS 接続の半自動化
WPS で一度、接続されると「wpa_supplicant.conf」ファイルへ情報が書き込まれて次回からの Wi-Fi 接続は、この設定情報で接続されます。
自宅などで WPS 接続をするには、十分かと思われますが例えば、Raspberry Pi を配布して初めて使ってもらう場合など、利用者が WPS 接続のためのコマンドを叩けないと接続することができません。
また、親機が変更されると今までつながっていた接続情報が使えなくなります。
なので、利便性をあげるための「Raspberry Pi OS 起動時の WPS 接続を半自動化する」方法です。
流れ的には、「ラズパイの電源を入れる」-<「ラズパイの LED が点滅」-<「無線 LAN ルーターの WPS ボタンを押す」-<「WPS 接続完了!」となります。
Raspberry Pi OS 起動時にコマンドを実行するため「rc.local」ファイルを改変します。
先に設定例を公開します。
[code language=”bash”]
$ sudo vi /etc/rc.local
#!/bin/bash
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]
then
printf "My IP address is %s\n" "$_IP"
fi
# GPIO Reset SW
gpio=23
if [ ! -d /sys/class/gpio/gpio${gpio} ]
then
echo $gpio | sudo tee /sys/class/gpio/export
echo in > /sys/class/gpio/gpio${gpio}/direction
fi
reset_sw=`cat /sys/class/gpio/gpio${gpio}/value`
echo $gpio > /sys/class/gpio/unexport
if [ $reset_sw -eq 1 ]
then
sudo cp /etc/wpa_supplicant/wpa_supplicant.conf.org /etc/wpa_supplicant/wpa_supplicant.conf
sudo poweroff
exit 0
fi
# Set WPS
echo "none" > /sys/class/leds/led0/trigger
echo "heartbeat" > /sys/class/leds/led0/trigger
i=0
cnt=12
while [ $i -ne $cnt ]
do
str=`wpa_cli -i wlan0 status | grep wpa_state= | cut -d = -f 2 2>&1`
if [[ $str =~ .*COMPLETED.* ]]
then
sw=1
break
else
echo $str
wpa_cli -i wlan0 wps_pbc
fi
sleep 5s
i=`expr 1 + $i`
done
echo "Finish"
echo "none" > /sys/class/leds/led0/trigger
sleep 2s
echo "actpwr" > /sys/class/leds/led0/trigger
if [ $i -eq $cnt ]
then
# wifi 接続に失敗したら電源 OFF
poweroff
exit 0
fi
exit 0
[/code]
まずは、冒頭から「#!/bin/sh」を「#!/bin/bash」へ変更しています。好みですが「bash」の方が使いやすいからです。
「Print the IP address」の項は、初期設定のままです。改変しません。
「Print the IP address」の項と最後の「exit 0」の間に追記します。
WPS リセットスイッチ
「GPIO Reset SW」の項ですが GPIO による WPS のリセット方法です。
引用:Raspberry Pi Zero GPIO Pinout in detail:
今回は、Header pin 1 の 3.3V と Header pin 16 の BCM GPIO 23 番を使用します。
簡易的に Header pin 1 から Header pin 16 をジャンパー線で接続した状態(通電)をスイッチ ON とします。
ジャンパー線を外した状態(無通電)がスイッチ OFF となります。
「Print the IP address」の項へコメント説明します。
[code language=”bash”]
# gpio Reset SW
# BCM GPIO 23 を指定します。
gpio=23
# GPIO インターフェースが存在するか確認する。
if [ ! -d /sys/class/gpio/gpio${gpio} ]
then
# GPIO インターフェースが存在しなければ設定する。
echo $gpio | sudo tee /sys/class/gpio/export
# GPIO インターフェースを「入力」モードに設定する。
echo in > /sys/class/gpio/gpio${gpio}/direction
fi
# GPIO インターフェースから現在の値を取得します。
reset_sw=`cat /sys/class/gpio/gpio${gpio}/value`
# GPIO インターフェースを開放します。
echo $gpio > /sys/class/gpio/unexport
# GPIO インターフェースの現在値が ON(スイッチ)なのか?
if [ $reset_sw -eq 1 ]
then
# ON ならば WPS 設定のリセットを実行する。
sudo cp /etc/wpa_supplicant/wpa_supplicant.conf.org /etc/wpa_supplicant/wpa_supplicant.conf
# Raspberry Pi OS のシャットダウン(電断)
sudo poweroff
# 終了
exit 0
fi
[/code]
実装は、ジャンパー線の間に実物の電源スイッチ(ボタン)を設置すれば同じ処理です。
[code language=”bash”]
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf.org
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
[/code]
WPS 設定のリセット方法ですが「wpa_supplicant.conf.org」ファイルを network 項目なしで用意します。
「wpa_supplicant.conf.org」ファイルを「wpa_supplicant.conf」ファイルへ上書きしてリセットします。
OS 起動時の WPS 接続
WPS 子機側の Raspberry Pi Zero の起動にて Raspberry Pi OS が立ち上がりましたらラズパイ本体にあるグリーンの LED を点灯させます。
LED の点灯に WPS への接続を試みますので点灯している状態で無線 LAN ルーター(親機)の WPS ボタンを実行します。
「Set WPS」の項へコメント説明します。
[code language=”bash”]
# LED をリセットします。
echo "none" > /sys/class/leds/led0/trigger
# LED を heartbeat を点灯させます。
echo "heartbeat" > /sys/class/leds/led0/trigger
# 5 秒スリープを 12 回(60 秒)間、処理を続けます。
i=0
cnt=12
while [ $i -ne $cnt ]
do
# wpa_cli で無線接続の状態を確認して戻り値を取得します。
str=`wpa_cli -i wlan0 status | grep wpa_state= | cut -d = -f 2 2>&1`
# 接続済みか?
if [[ $str =~ .*COMPLETED.* ]]
then
# 処理を抜ける
sw=1
break
else
echo $str
# WPS への接続を実行する。
wpa_cli -i wlan0 wps_pbc
fi
# 5 秒スリープ
sleep 5s
i=`expr 1 + $i`
done
# LED をリセットします。
echo "Finish"
echo "none" > /sys/class/leds/led0/trigger
sleep 2s
echo "actpwr" > /sys/class/leds/led0/trigger
if [ $i -eq $cnt ]
then
# wifi 接続に失敗したら電源OFF
poweroff
exit 0
fi
[/code]
WPS の接続が失敗しても再度、ラズパイの電源を入れて試行できます。
以上です。
#bash #Debian #IoT #LAN #Network #Raspberry Pi #Raspberry Pi OS #wi-fi #WPS