Raspberry Pi で WiFi 接続が切れる

有線LANで快調に動いていたサービスが、無線LANだとしばらくすると切れてしまう。
Raspberry Pi がハングアップしたとかではないらしい。有線LAN側からアクセスするとちゃんと動いている。
無線LANが切れているだけらしい。


# 環境


```
$  lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3
```

# 電波断?

アクセスポイントの不調で、一旦電波が途切れてしまうと復旧できていないのかな・・・

アクセスポイントの電波を止めてみます。

```
$ ifconfig wlah0
wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:2f:6d:99  txqueuelen 1000  (Ethernet)
        RX packets 3839  bytes 195589 (191.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 392  bytes 43210 (42.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


```
約3分後、電波をONにしてみます。
```
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.42.4  netmask 255.255.255.0  broadcast 192.168.42.255
        inet6 240d:1a:cc6:7500:245b:c92b:680e:efbb  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::f388:9c5d:a71f:f9c  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:2f:6d:99  txqueuelen 1000  (Ethernet)
        RX packets 3886  bytes 199207 (194.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 427  bytes 48612 (47.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```

ちゃんと自動で再接続できていますね。アクセスポイントの電波断を10分、1時間と長くしてみても同様でした。

# Power managemaent

```
$ iwconfig wlan0
wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
```          

Power Management の項目が ON になってますね。この状態だと約1日で落ちるらしいです。

ぐぐってみたら、
「Linux Mint 18.1でWi-Fiの省電力機構を無効化する - afnf.net」
https://blog.afnf.net/blog/91
では、様々な解決策を試してうまくいかず、最終的に `sudo pm-powersave false` でうまくいったとありました。
「Raspberry Piで時間が経過するとwifiが繋がらなくなる - Elsaの技術日記(徒然なるままに)」
https://elsammit-beginnerblg.hatenablog.com/entry/2021/02/16/213737
では、結局 cron で接続が切れたときに ` wlan0 up ` を行うようにしています。

これらの知見を元に、RaspberryPiで動く仕組みを考えてみます。

## 推測

いろんなページで悩んでいる方々がいろんな解決策を試していますがそれらが動いたり動かなかったりしているのは、電波状況により接続/再接続のタイミングで適用が効いたり効かなかったりしているのではないかな?

であるからワンショットで `$ sudo iwconfig wlan0 power off ` でmなんとかなるけど、それを /etc/rc.local に書いたりしても動いたり動かなかったりしているのではないかな?

## 設定

そんなことを考えて、以下のページに書いてある仕組みを導入しました。
https://forums.raspberrypi.com/viewtopic.php?t=336276


/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
```

再起動します。

```
$ iwconfig wlan0
wlan0     IEEE 802.11  ESSID:"hogehagehige"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: D4:F7:56:B4:90:66   
          Bit Rate=65 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=65/70  Signal level=-45 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
```
うまくいったみたいです