Wi-Fi 簡単接続 WPS の設定 for Raspberry Pi Zero WH

Raspberry Pi zero WH

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 に設定を書きます。

と言っても本当にこれが読み込まれているのか?わからないので念のため、みたいな (;・∀・)

$ cat /etc/network/interfaces

source-directory /etc/network/interfaces.d

interfaces を確認すると source-directory は、interfaces.d だよとある。

なので /etc/network/interfaces.d ディレクトリ以下へネットワーク設定ファイルを書いていく

$ sudo vi /etc/network/interfaces.d/lo.conf

auto lo
iface lo inet loopback
sudo vi /etc/network/interfaces.d/eth.conf

auto eth0
iface eth0 inet dhcp
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

ここで重要なのは、「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 ファイルの基本設定例

$ 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="< パスワード >"
}

となります。

無線 LAN ルーター(親機)から WPS ボタンなどによる接続では、子機となる Raspberry Pi 側での SSID、パスワード設定は、不要となります。

なので、先ほどの「wpa_supplicant.conf」にある network の項目を外します

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=JP
update_config=1

ctrl_interfacecountryupdate_config の項目だけを残します。

そして、無線 LAN ルーター(親機)から WPS ボタンを押して有効な状態中に Raspberry Pi 側で以下の接続コマンドを叩きます。

$ sudo wpa_cli -i wlan0 wps_pbc

これで 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」ファイルを改変します。

先に設定例を公開します。

$ 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

まずは、冒頭から「#!/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

引用: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」の項へコメント説明します。

# 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

実装は、ジャンパー線の間に実物の電源スイッチ(ボタン)を設置すれば同じ処理です。

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf.org

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

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」の項へコメント説明します。

# 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

WPS の接続が失敗しても再度、ラズパイの電源を入れて試行できます。

以上です。

Was this helpful?

0 / 0

コメントを残す 0

Your email address will not be published.