|
現: 2023-04-01 (土) 12:59:10 yuji |
| + | * オンボードWiFiが切れないようにする [#rd6b783b] |
| + | Rspberry Pi Zero Wが1日程度経つとWiFiでの接続が出来なくなることがある。 |
| | | |
| + | なぜ通信ができなくなるのかわかっていなかったので,しょうがないのでcronを使って毎日04/05にrebootしていた。~ |
| + | 5 4 * * * /sbin/reboot |
| + | しかし,この対策ではこの時間前に通信ができなくなると,朝の04:05にならないと復帰しない ;( |
| + | |
| + | なので,なぜWiFi通信が出来なくなるのか考えてみた。~ |
| + | - WiFi内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう。~ |
| + | - 環境による理由で無線LANアクセスポイントとの接続が切断してしまう。~ |
| + | |
| + | これらの事が考えられたので,それぞれに対して対策を行ってみた。~ |
| + | |
| + | ** 内蔵WiFiインターフェースのwlan0が省電力設定のため一定時間経つとサスペンド状態になってしまう [#jb8d914c] |
| + | 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''ファイルを以下の内容で作成した。~ |
| + | #code(text,,nonumber){{ |
| + | [ -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''ディレクトリに作成する。~ |
| + | #code(bash,,nonumber){{ |
| + | #!/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''ファイルを作成する。~ |
| + | #code(text,,nonumber){{ |
| + | [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アクセスポイントとの接続が切断してしまう [#gbf5da55] |
| + | 今住んでいるところが6階建てのマンション(各階6部屋)なのだが,ある時インターネット対応マンションにするということで各部屋に安いWiFiルーターが設置された。~ |
| + | |
| + | これが2G帯しか対応しないWiFiルーターで電波が混信しまくってしまう。いいかげんなシステム屋だとこんなひどい商売をしている。~ |
| + | |
| + | このため,自前の無線LAN環境でのWiFi接続が不安定になり接続も切れてしまうことがある。どうも切れてしまうとRaspberry Piは自動でうまく再接続できないようだ。~ |
| + | |
| + | なので,この対策を行った。~ |
| + | |
| + | ''/root/reconnect_wifi''ファイルを以下のような内容で作成した。~ |
| + | #code(bash,,nonumber){{ |
| + | #!/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接続が切れることが無くなった。~ |