忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

RaspberryPi5のWiFiをコマンドを使って再起動

RaspberryPi5(bookworm)のWiFiを画面操作をしなくても、リモートあるいは自動で
再起動するためのコマンドを調査しました。
結果的にはbookwormでも
sudo ifconfig wlan1 down
sudo ifconfig wlan1 up
にて指定したWiFi機能を再起動できることを確認しました。

前置き

ラズパイOSがbookwormになってWiFiの管理が画面操作で簡単にできるようになりました。
参考:elchika@airpocket様
Raspberry Pi OS BookwormでWi-Fi APを作る
bullseyeまでは機能を個別にインストールしたり設定ファイルを探して
編集したりといろいろ大変でしたが、bookwormでは標準機能としてAP化
(ラズパイをWiFiの親機として使用)可能になっており、APとSTも簡単な
マウス操作のみで切り替え可能です。

また、ラズパイに搭載されたWiFiの他にWiFiのドングルを使用することもでき、
参考:親子ボードゲームで楽しく学ぶ様
Raspberry Piで使える無線LAN子機の設定および消費電力と速度比較。
ドライバがインストールされていれば本体のWiFiと同様に画面操作で設定を管理できます。

ということで自分の環境では
wlan0
・AP(WiFi親機)
・PCやスマホ等でここに接続
・システムのデバッグ等に使用
wlan1
・ST(WiFi子機)
・M5Stackへ接続
・ロボットの制御指令等通信
といった使い方をしています。

※ラズパイ5ではUSBから各装置へ供給する電力に制限がかかっており、
ラズパイに5V6.2Aの電力供給しても出力制限されるので要注意
参考:日経クロステック様
「ラズパイ5」では電源に注意、純正以外の電源アダプターでは制限あり


コマンドでラズパイ5のWiFiを再起動

さて、本題

基本的には一度設定してしまえば起動時に自動的にアクセスポイントへ
自動接続してくれるようになるのですが、M5Stack(ESP32)等をAPとして使用
した場合通信中にM5Stackを再起動する等正規の手順を踏まずにWiFiが切断
された場合にラズパイがAPに自動再接続してくれないことがあります。
どうやら画面操作でWiFiのアイコンをクリックすると再接続してくれることも
あるようなのですが、サーバーの様に画面を接続せずに使用する場合はクリック
操作ができません。
このような事態に対応するためにラズパイからAPにpingを送信して応答が
来なかったらWiFiを再起動する方法を説明されている方々がいます。
参考:Qiita@gzock様
Raspberry PiでWi-Fi切断時、自動的に再接続されるようにする方法
参考:にせねこメモ様
Raspberry Piがwifiから切断されたら再接続する

自分の環境で試してみたところpingは問題無く動作するのですが、WiFiの再起動部分が
上手く動作しませんでした。また、WiFiを再起動するためにプログラムをインストール
したくはありません。
そこで、WiFi再起動のコマンドを探していると良さそうな情報が公開されていました。

参考:Qiita@MasanoriIwakura様
Raspberry Pi3 無線LAN設定
ifdown/ifupを使うと良いらしい

参考:Qiita@sosanagi様
Raspbian Stretchからifdown,ifupが使えなくなった話
ifconfig wlan0 down/upを使うと良いらしい

ということで自分の環境でもifconfigにてWiFi再起動を実行できました。
wlan1を再起動させたいのでターミナルから
sudo ifconfig wlan1 down
sudo ifconfig wlan1 up
の順でコマンドを実行してWiFiを再起動できれば成功です。
コマンドを単体で実行できることを確認出来たらスクリプトにします。

ifconfigを使った再起動スクリプトを公開されている方も見つけました。
Qaplaの覚書・メモ・備忘録・独言 様
Raspberry PI のWi-Fiが稀に切断される

※余談
ESP32をArduino環境を使ってAP化している場合
WiFi.softAPgetStationNum()
にて自APに接続されいる子機数を取得できます。
ただし、子機の電源を突然落とすなど正規の手順以外で切断した場合には
しばらくの間は接続されたままの扱いになり正確な子機数にはなりません。


最終的なコマンド(シェルスクリプト)

ファイル名
check_wlan1.sh
とか

/////////////////////////// ファイルの中身 ///////////////////////////
#!/bin/bash
#↑このファイルがシェルスクリプトとして実行されることを明示

#AP(今回は192.168.4.1)にpingを送信して応答待ち
ping -c 1 192.168.4.1

#直前の実行結果(0:成功、1失敗)をとりあえず変数へ格納しておく
#「=」の前後にスペースがあるとエラーになる

ping_result=$?

#条件分岐処理 (括弧や命令語の前後に半角スペースが無いとエラーになる)
#「!=」の前後にはスペースが必要

if [ $ping_result != 0 ]; then
    echo "NG"
    #wlan1を停止
    sudo ifconfig wlan1 down
    #1秒待機
    sleep 1.0
    #wlan1を起動
    sudo ifconfig wlan1 up
    echo "restart"
else
    #このechoを削除(コメントアウト)する場合はelseも一緒に削除する
    echo "OK"
fi

ファイルを作成したら実行できるように属性を変更しておき、
実行して再起動できれば成功。上手く動かない場合は

#!/bin/bash

sudo ifconfig wlan1 down
sleep 1.0
sudo ifconfig wlan1 up

だけの純粋な再起動スクリプトだけ作成して試すのが良いでしょう。

上手く動いたらスクリプトを繰返し実行させたり、スマホからスクリプトを実行できる
ようにすればWiFi途絶時にも画面無しで再接続できるようになります。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント