オンボードWiFiが切れないようにする anchor.png

Rspberry Pi Zero Wが1日程度経つとWiFiでの接続が出来なくなることがある。

なぜ通信ができなくなるのかわかっていなかったので,しょうがないのでcronを使って毎日04/05にrebootしていた。

5 4 * * * /sbin/reboot

しかし,この対策ではこの時間前に通信ができなくなると,朝の04:05にならないと復帰しない ;(

なので,なぜWiFi通信が出来なくなるのか考えてみた。

  • WiFi内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう。
  • 環境による理由で無線LANアクセスポイントとの接続が切断してしまう。

これらの事が考えられたので,それぞれに対して対策を行ってみた。

Page Top

内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう anchor.png

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ディレクトリに作成する。
    Everything is expanded.Everything is shortened.
    -
    !
     
     
     
     
     
     
     
     
    
    #!/bin/bash
     
    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
    とする。
Page Top

環境による理由で無線LANアクセスポイントとの接続が切断してしまう anchor.png

今住んでいるところが6階建てのマンション(各階6部屋)なのだが,ある時インターネット対応マンションにするということで各部屋に安いWiFiルーターが設置された。

これが2G帯しか対応しないWiFiルーターで電波が混信しまくってしまう。いいかげんなシステム屋だとこんなひどい商売をしている。

このため,自前の無線LAN環境でのWiFi接続が不安定になり接続も切れてしまうことがある。どうも切れてしまうとRaspberry Piは自動でうまく再接続できないようだ。

なので,この対策を行った。

/root/reconnect_wifiファイルを以下のような内容で作成した。

Everything is expanded.Everything is shortened.
-
!
 
 
 
-
|
|
-
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
!
!
#!/bin/sh
 
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接続が切れることが無くなった。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 591, today: 1, yesterday: 4
Last-modified: 2023-04-01 (Sat) 11:59:10 (JST) (528d) by yuji