オンボードWiFiが切れないようにする
Rspberry Pi Zero Wが1日程度経つとWiFiでの接続が出来なくなることがある。
なぜ通信ができなくなるのかわかっていなかったので,しょうがないのでcronを使って毎日04/05にrebootしていた。
しかし,この対策ではこの時間前に通信ができなくなると,朝の04:05にならないと復帰しない
なので,なぜWiFi通信が出来なくなるのか考えてみた。
- WiFi内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう。
- 環境による理由で無線LANアクセスポイントとの接続が切断してしまう。
これらの事が考えられたので,それぞれに対して対策を行ってみた。
内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう
iwconfigで確認してみたところ,
# iwconfig wlan0
wlan0 IEEE 802.11 ESSID:"marin"
Mode:Managed Frequency:2.427 GHz Access Point: 80:22:A7:5B:A6:02
Bit Rate=72.2 Mb/s Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
Link Quality=60/70 Signal level=-50 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
# iw dev wlan0 get power_save
Power save: on
Power Management:onになっていて,これだと一定時間が経過するとWiFiがサスペンドになってしまうようだ。
この対策をしてみる。(どちらでも良い)
- iwconfigでパワーマネージメントを無効にする
/etc/dhcpcd.exit-hookファイルを以下の内容で作成した。
[ -n ${disable_pm} ] || return 0
if [ “${interface}” = “wlan0” ]; then
case ${reason} in
CARRIER | NOCARRIER) iwconfig ${interface} power off ;;
STOP | STOPPED) iwconfig ${interface} power on ;;
esac
fi
これで,reboot後もPower Management:offになった。
これは,dhcpcdのフック機能を利用している。
- systemdでパワーマネージメントを無効にする
systemdを使ってもパワーマネージメントを無効にする事ができる。
この場合,まずservices/rpiwlan0poweroffディレクトリを作成する。
# cd ~
# mkdir -p services/rpiwlan0poweroff
# cd services/rpiwlan0poweroff
wlan0poweroff.shスクリプトファイルを以下の内容でservices/rpiwlan0poweroffディレクトリに作成する。
-
!
|
LOG_FILE="/var/log/wlan0poweroff.log"
echo "Setting wlan0 power management off in 5 sec..." > $LOG_FILE
echo "Current wlan0 power management configuration" >> $LOG_FILE
iwconfig wlan0|grep Power\ Management >> $LOG_FILE
sleep 5
echo "Setting wlan0 power management off..." >> $LOG_FILE
iwconfig wlan0 power off
iwconfig wlan0|grep Power\ Management >> $LOG_FILE
|
wlan0poweroff.shのパーミッションに実行権限を追加する。
# chmod +x wlan0poweroff.sh
wlan0poweroff.serviceファイルを作成する。
[Unit]
Description=wlan0 power management disable service
After=network.target
[Service]
ExecStart=/root/services/rpiwlan0poweroff/wlan0poweroff.sh
[Install]
WantedBy=multi-user.target
wlan0poweroff.serviceを/etc/systemd/system/にコピーする。
# cp wlan0poweroff.service /etc/systemd/system/
その後,サービスを有効に設定する。
# systemctl enable wlan0poweroff.service
これで,reboot後systemdによりパワーマネージメントを無効にする事ができる。
何らかの理由でパワーマネージメントを有効にしたい場合は,
# systemctl disable wlan0poweroff.service
とする。
環境による理由で無線LANアクセスポイントとの接続が切断してしまう
今住んでいるところが6階建てのマンション(各階6部屋)なのだが,ある時インターネット対応マンションにするということで各部屋に安いWiFiルーターが設置された。
これが2G帯しか対応しないWiFiルーターで電波が混信しまくってしまう。いいかげんなシステム屋だとこんなひどい商売をしている。
このため,自前の無線LAN環境でのWiFi接続が不安定になり接続も切れてしまうことがある。どうも切れてしまうとRaspberry Piは自動でうまく再接続できないようだ。
なので,この対策を行った。
/root/reconnect_wifiファイルを以下のような内容で作成した。
-
!
-
|
|
-
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
!
!
|
OSVER=`grep VERSION_ID /etc/os-release | awk -F '"' '{print $2}'`
ping -c 1 `ip route | grep default | awk '{print $3;}'` >/dev/null 2>&1
if [ $? != 0 ]
then
logger "wifi connection error was occured. trying reconecct..."
case $OSVER in
"8")
sudo sh -c "ifdown wlan0 && ifup wlan0" ;;
"9")
sudo systemctl restart dhcpcd ;;
"10")
sudo systemctl restart dhcpcd ;;
esac
sleep 10
if [ `ip route | grep default | wc -l ` -eq 0 ]
then
logger "wifi is not connected."
else
logger "wifi is connected."
fi
fi
|
実行パーミッションを設定する。
# chmod 755 /root/reconnect_wifi
それで,cronで毎分このスクリプトを実行するようにする。
*/1 * * * * /root/reconnect_wifi
これで,もしWiFi接続が切れても自動で再接続してくれるようになった。
この対策後はWiFi接続が切れることが無くなった。
新しくコメントをつける