私はpiを使ってパワーメーターをモニターしています。データはEdimax EW-7811UN USBアダプタを使ったWiFi接続でPCに転送しています。無線LANの接続が切れると(夜にスイッチを切ったり、接続が不安定だったり)、USBアダプタは無効のままになります。
WiFiアダプタを挿し直さなくても、自動的にWiFi接続を再開する方法はありますか?
しかし、それはとても簡単なことです。
1.etc/ifplugd/action.d/に行き、
ifupdownファイルの名前を
ifupdown.originalに変更します。 2.次に次のようにします。cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
とする。
3.最後にsudo reboot」とする。
以上で完了です。APの電源を切ったり入れたりしてテストしてみてください。Raspberry Piが正しく再接続されることを確認してください。
私は、ネットワークの自動設定や接続管理デーモンのほとんどを無効にして、自分で処理したいと思っています。 これは、ネットワークが存在し、Wifiドライバの不具合や電源の問題がない限り、接続を維持する(bash)スクリプトで、N秒ごとにルータにpingを打ち、失敗した場合は再接続するというものです。
#!/bin/bash
# make sure we aren't running already
what=`basename $0`
for p in `ps h -o pid -C $what`; do
if [ $p != $$ ]; then
exit 0
fi
done
# source configuration
. /etc/wifi.conf
exec 1> /dev/null
exec 2>> $log
echo $(date) > $log
# without check_interval set, we risk a 0 sleep = busy loop
if [ ! "$check_interval" ]; then
echo "No check interval set!" >> $log
exit 1
fi
startWifi () {
dhclient -v -r
# make really sure
killall dhclient
iwconfig $wlan essid $essid
dhclient -v $wlan
}
ifconfig $eth down
ifconfig $wlan up
startWifi
while [ 1 ]; do
ping -c 1 $router_ip & wait $!
if [ $? != 0 ]; then
echo $(date)" attempting restart..." >> $log
startWifi
sleep 1
else sleep $check_interval
fi
done
つまり、この場合の/etc/wifi.conf
には以下のような内容が含まれます。
router_ip=192.168.0.1
log=/var/log/wifi.log
wlan=wlan0
eth=eth0
essid=someNetwork
check_interval=5
これはすべて、暗号化されていないオープンなネットワークを前提としています(そうでない場合は、適切なコマンドを追加する必要があります)。 私はこの方法を、piを含む様々なLinuxマシンで使用してきましたが、完璧に機能しています。
適切なチェック間隔は3~5秒で、この活動はシステムリソースに大きな影響を与えません。
最初にネットワークの自動設定を無効にする必要があります。ifplugd
やその他のネットワークデーモンも含めて、そうしないと作業に支障をきたします。
How can I disable autoconfigured networking on Raspbian?.
実際には apt-get remove ifplugd
を使いました。
起動時にネットワークを開始するために(piをヘッドレスで使っているので)、/etc/rc.local
からraspbianで実行するように設定しています。
wifi_mod=`lsmod | grep 8192cu`
if [ "$wifi_mod" ]; then
echo "Starting wifi..."
/usr/bin/nice -n -10 /usr/local/bin/wifi &
else
echo "Starting ethernet..."
/sbin/ifconfig eth0 up
/sbin/dhclient eth0
fi
/usr/local/bin/wifi
がそのスクリプトです。 もし、nice
が何のためにあるのかわからなければ、man nice
を読んでください。
if`のポイントは、もし無線LANドングルがpiに接続されていれば、この時点で8192cuモジュールがカーネルにロードされるので、無線LANが開始されるはずです。 もしそうでなければ、イーサネットが接続されていて、使用されるべきだと仮定されます (もしそうでなければ、dhclient はただクラッシュアウトして、ネットワークアクセスができません)。
これが動作するためには、おそらく以下が必要でしょう。
それで、これは起動時にヘッドレスパイをネットワークに接続し、それを維持します。 もし、ログインせずに実行中にethに切り替える方法が欲しければ、無線LANドングルを引き出すためにudev rulesを使って何かをすることができます。