1. はじめに
Wi-Fiルータは長時間稼働すると通信が不安定になることがあります。再起動で改善するケースは多いですが、毎回手動で電源を抜き差しするのは面倒です。そこで今回は、Androidスマホ+Termux+Pythonを使って、Wi-Fiルータの再起動を定期実行する方法を紹介します。
本記事は以下のWi-Fiルータを対象にしています。
- BUFFALO WSR-1166DHPL2
2. 手動で再起動する方法
Wi-Fiルータの再起動は、不安定さを解消する最も簡単なトラブルシューティング手段です。手動の場合は以下の方法があります。
-
電源を抜き差しする
電源ケーブルを抜いて10秒程度待ち、再度接続します。
※急ぎの場合はこの方法が確実ですが、頻繁に行うと物理的な劣化の原因に。 -
管理画面から再起動する
ブラウザでルータの管理画面(例:http://192.168.0.1)にアクセスし、ログイン後「再起動」ボタンをクリックします。
※機種によってメニュー名は「再起動」「リブート」「電源管理」など異なります。
再起動後はネットワークが復旧するまで数分かかる場合があります。また、再起動中はすべての接続が切れるため、タイミングに注意してください。
3. 自動化の方法
手動再起動は簡単ですが、毎回行うのは面倒です。以下の方法で自動化できます。
-
ルータ側のスケジュール再起動機能
一部のルータには「毎日○時に再起動」などのスケジュール設定機能があります。管理画面で設定できる場合は、これが最も簡単で安全です。 -
スマートプラグ+スケジューラ
電源制御が可能なスマートプラグを使い、スマホアプリやクラウドサービスでスケジュールを設定します。物理的に電源を切るため、ルータの管理画面に依存しない方法です。
※ただし、電源断はファームウェア更新中などに行うと故障の原因になるので注意。 -
LinuxからSSHで再起動(対応ルータの場合)
SSHログインが可能なルータなら、以下のようなコマンドで再起動できます。 これをcronで定期実行すれば完全自動化できます。
※SSH対応は業務用ルータや一部の高機能モデルに限られます。
ssh admin@192.168.0.1 "reboot"`
我が家で稼働しているBUFFALO製Wi-Fiルータ「WSR-1166DHPL2」には、残念ながら再起動機能もSSHも搭載されていませんでした。本記事では、Pythonを使って管理画面のHTTPリクエストを送信する方法で再起動を自動化します。
4. 手順
4.1 F-Droidのインストール
本記事ではPlayストアからではなく、F-Droid経由でアプリをインストールします。Google Play版のTermuxは長期間更新が止まっていたため、最新のAndroid環境では不具合が発生することがあります。公式Wikiでも、最新機能と安定性を確保するためにF-Droid版を推奨しています。
「Termux」でネット検索すると、F-Droidサイトの以下のページが見つかると思います。こちらのページを開いて画面をスクロールしていくと「F-DROIDをダウンロード」ボタンがありますので、このボタンをタップして.apkファイルをダウンロードしてください。
ダウンロードした.apkを開くと、F-Droidのインストールが始まります。アプリ選択が表示される場合は「パッケージインストーラ」を選択してください。機種によっては警告が表示されますので、適宜対処ください。
4.2 Termuxのインストール
インストールされたF-Droidを開いて「Termux」を検索します。以下2つをインストールしてください。「Termux:Boot」はインストール後に一度起動してください。
- Termux
- Termux:Boot
インストールに失敗する場合は、「Playプロテクトによるアプリのスキャン」を一時停止してからインストールしてください。
インストールできたら、アプリ2つの設定を以下のように変更します。以下はXiaomi製スマートフォン「Redmi 12 5G」の場合の設定項目です。
- 設定 - アプリ - バックグラウンドでの自動起動:許可
- アプリ情報 - バッテリー - バッテリーセーバー:制限なし
4.3 SSHデーモンの起動
Termuxを起動すると、ターミナル画面が表示されます。スマホの画面でぽちぽち作業を続けるのはしんどいので、SSHデーモンを起動してPCから接続することにします。まずは、Termuxのターミナルから以下のコマンドを実行してください。
pkg update
pkg upgrade
pkg install openssh
コマンド実行時には以下のような確認プロンプトが出ますが、すべてデフォルトの動作で問題ないので、とりあえずEnterキー(⏎)をタップしておけば大丈夫ですw
Do you want to continue? [Y/n]*** openssl.cnf (Y/I/N/O/D/Z) [default=N] ?
続いて、PCから接続するための準備をします。以下のコマンドを実行してユーザ名を確認します。ユーザ名はu0_axxxの形式になっています。
whoami
次に、スマホのIPアドレスを確認します。以下のコマンドを実行してinet 192.168.x.xと出力されている箇所を探してください。192.168.x.xの部分がIPアドレスです。
ifconfig
ここで、SSH接続のパスワードを設定しておきます。以下のコマンドを実行すると、新しいパスワードの入力を求められるので、同じパスワードを2回入力してください。入力中のパスワードは表示されないのでご注意ください。
passwd
それでは、いよいよPCからの接続です。以下のコマンドをスマホで実行してSSHデーモンを起動します。
sshd
PCのターミナルから以下のコマンドを実行し、設定したパスワードを入力すると、SSHでスマホのTermuxに接続できます。
ssh u0_axxx@192.168.x.x -p 8022
初回接続時は警告と以下のプロンプトが出ますので、yesと入力してください。
Are you sure you want to continue connecting (yes/no/[fingerprint])?
4.4 サービスの自動起動設定
ここから先はPCのターミナルからの操作です。ここでは、SSHデーモンとCRONデーモンがスマホ起動時に自動起動するように設定します。SSHはインストール済なので、以下のコマンドでCRONをインストールします。
pkg install cronie
次に、スマホ起動時に実行されるシェルスクリプトを準備します。以下のコマンドで~/.termux/boot配下にスクリプトを作成し編集します。
mkdir -p ~/.termux/boot
nano ~/.termux/boot/start_services.sh
編集画面が開いたら、以下をコピペしてください。
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
crond
sshd
「Ctrl + O」からの「Enter」で上書き保存します。保存後は「Ctrl + X」でエディタを終了してください。以下のコマンドで、保存したスクリプトに実行権限を付与します。実行権限を付与するオプションって「x」だったよなーとか考えてオプションに-xを記載すると、むしろ権限が削除されますので注意。(1敗)
chmod +x ~/.termux/boot/start_services.sh
ここまでで一旦スマホを再起動します。再起動からの数分で以下の通知が出ればOKです。
>_Termux
0 session (wake lock held)
4.5 Pythonスクリプトの準備
ここでは、Wi-Fiルータを再起動するPythonスクリプトを準備します。まずはPythonの実行環境を整えます。以下のコマンドで必要なものをインストールしてください。
pkg install python
pip install requests
pip install types-requests
pip install python-dotenv
続いて、Pythonスクリプトをコピペで作成します。
nano reboot_wsr-1166dhpl2.py
from dotenv import load_dotenv
import os
import requests
import re
# .envファイルを読み込む
load_dotenv()
ROUTER_IP = os.getenv("ROUTER_IP")
USERNAME = os.getenv("ROUTER_USER")
PASSWORD = os.getenv("ROUTER_PASS")
ROUTER_URL = f"http://{ROUTER_IP}"
LOGIN_URL = f"{ROUTER_URL}/login.html"
INIT_URL = f"{ROUTER_URL}/init.html"
session = requests.Session()
# 1. ログイン
login_payload = {
"nosave_Username": USERNAME,
"nosave_Password": PASSWORD,
"MobileDevice": "0",
"nosave_session_num": "",
}
resp = session.post(LOGIN_URL, data=login_payload)
print("Login status:", resp.status_code)
# 2. init.htmlを取得してセッション番号を探す
init_resp = session.get(INIT_URL)
match = re.search(r'name="nosave_session_num" value="(\d+)"', init_resp.text)
if not match:
print("セッション番号が見つかりません")
exit()
session_num = match.group(1)
print("取得したセッション番号:", session_num)
# 3. 再起動
reboot_payload = {"nosave_reboot": "1", "nosave_session_num": session_num}
try:
resp = session.post(INIT_URL, data=reboot_payload, timeout=5)
print("再起動リクエスト:", resp.status_code)
except requests.exceptions.Timeout:
print("ルータ再起動中。タイムアウトしましたが正常です。")
上記のスクリプトでは.envファイルを参照するので、こちらも準備します。お使いのルータ設定に合わせて記載してください。
nano .env
ROUTER_IP=192.168.xx.x
ROUTER_USER=xxxxx
ROUTER_PASS=xxxxxxxx
4.6 cronジョブの登録
定期実行のジョブはcrontabに記載するだけで動作します。ただ、crontabの記載はフルパスで書くのが基本です。ここでは、可読性を重視してPythonスクリプト実行用の.shファイルを作成します。
nano reboot_router.sh
#!/data/data/com.termux/files/usr/bin/bash
python "$HOME/reboot_wsr-1166dhpl2.py" >> "$HOME/reboot_router_$(date '+%Y-%m-%d').log" 2>&1
chmod +x reboot_router.sh
続いてcrontabを編集します。以下のコマンドで編集画面を起動して追加してください。こちらは、毎日午前2時に実行する場合の書き方です。
crontab -e
0 2 * * * /data/data/com.termux/files/home/reboot_router.sh
5. 注意事項
-
再起動中はネットワークが切れるのでタイミングに注意
cronで自動再起動を設定する場合、深夜など通信が不要な時間帯を選びましょう。 -
ファームウェア更新時は自動再起動を避ける
更新中に再起動が走ると失敗する可能性があります。Wi-Fiルータに設定されているファームウェア更新時刻を避けて、実行時刻を設定しましょう。 -
スマホ側の制約
Androidはバックグラウンドプロセスをkillすることがあるため、Termuxでの完全自動化は不安定です。wakelockやTermux:Bootで軽減していますが、完全回避は難しいです。
6. まとめ
-
手動と自動のメリット・デメリット
手動:安全性が高いが、忘れると再起動できない。
自動:便利だが、タイミングや更新時のリスクに注意。 -
自分の環境に合った方法を選択
「安定重視」なら手動。
「運用効率重視」ならcron+ログ管理。 -
今後の改善案
Flutterアプリでネイティブ常駐化すれば、kill問題を回避できる可能性あり。