WiFiを自動的に再接続する方法は?


74

私は自分のpiを使用して電力計を監視しています。データは、Edimax EW-7811UN USBアダプターを使用したWiFi接続によってPCに転送されます。Wifi接続が切断される(夜間にオフになる、または接続が不安定になる)と、USBアダプターは無効のままになります。

WiFiアダプターを再接続せずにWiFi接続を自動的に再開する方法はありますか?

回答:


31

私は、ネットワークの自動構成と接続管理デーモンの大部分を無効にして、自分で対処することを好みます。以下は、ネットワークが存在し、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その他のネットワークデーモンを含めるか、これが作業の妨げになります。

Raspbianで自動構成されたネットワークを無効にするにはどうすればよいですか?

私は実際に使用しましたapt-get remove ifplugd

起動時にネットワークを開始するには(私はpiヘッドレスを使用しているため)、これをraspbianで実行するように設定します/etc/rc.local

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

そのポイントは、ifwifiドングルをpiに接続すると、この時点で8192cuモジュールがカーネルによってロードされるため、wifiが起動するはずです。そうでない場合は、イーサネットが接続されており、使用する必要があると想定されます(使用されていない場合、dhclientはただクラッカーを使用し、ネットワークアクセスはありません)。

これが機能するには、おそらくする必要があります

そのため、これは起動時にヘッドレスpiをネットワークに取得し、そこに保持します。ログインせずに実行中にethに切り替える方法が必要な場合は、wifiドングルを引き出すためのudevルールで何かを行うことができます。


テストする価値があります。Linuxのプロではない-起動時にスクリプトを実行するように設定するにはどうすればよいですか-cronに入れますか?ログのローテーションを追加することも可能/必要ですか?
-andig

1
@andig:経由での起動に関するいくつかの段落を追加しましたrc.local。WRTログローテーション。これは、一般的なログファイルに関連する別の質問です(ただし、をご覧くださいman logrotate)。今そのスクリプトがします壊し、それは同じパスに存在する場合、以前のログを(上書き)、追加しません。デバッグのためwifi.$$.logに、wifi.confファイルで時々使用しました。そのため、最後のログが(おそらく)破壊され、何かを微調整した後、あるセッションを別のセッションと比較できます。$$「wifi」プロセスのpidです。
goldilocks

更新があった場合や、他のネットワークソフトウェアがインストールされている場合、シェルスクリプトが壊れやすく、見分けがつかないことがあるのではないかと心配しています。このアプローチに関する注意点に注意してください。
エレミヤ

3
@jeremiah:それはいい恐怖です。私はこのスクリプトを書き、何年もかけて微調整しましたが、スクリプトが動作する一般的なコンテキストを理解しているので、注意する必要があることを感じました。ただし、コードスニペットよりも理解を伝えることはおそらく難しいでしょう。私にとっては、状況をいくつかの非常に基本的な要素に減らすことで、NetworkManagerで作業しようとする代替アプローチにすぎません。これは、単純なスタンドアロンシステムの状況で、Linuxディストリビューションスペクトル全体で「これが私にとって効果的なもの」と同様の観点を持つ人々に提供するものです。
goldilocks

だから:私はこの投稿を認識しており、主要なディストリビューションストリーム(デビアとフェドラと派生)のいずれかがそれを台無しにする何かを導入した場合、それを更新し続けるつもりです。また、無効にする必要があるものとその方法についての点にも重点を置きます。
goldilocks

68

さて、非常に簡単な解決策があります。

  1. ファイルに移動し/etc/ifplugd/action.d/て名前を変更しifupdownますifupdown.original
  2. それから: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. 最後に: sudo reboot

それで全部です。これをテストするには、APのオン/オフを切り替えます。Raspberry Piが正しく再接続されていることがわかります。


2
これが最も簡単で効果的な答えです。2つのRpiでテストされ、動作します。このリンクはraspberrypi.org/phpBB3/…
Mauvis Ledford 14年

12
単純な質問で申し訳ありません-なぜこれが機能するのですか?
ジェフミートボールヤン14

@JeffMeatballYang、あなたの質問に新しいスレッドを始めてください。
アンダルズ14

6
私にとってはifupdownファイルがなく、リンクだけだったaction_wpa -> ../../wpa_supplicant/action_wpa.shので、これが今のデフォルトでしょうか?
-Zitrax

2
うん、他の人のように言う:これは上で動作しないdhcpcd、ベースのディストリビューションを、これはあなたがする必要がRPI3上で実行されている得るためにapt-get install rcconfから切り替えるdhcpcdnetworking
test30

22

私は最近、すべてのワイヤレス設定を完全に整理するコンソールアプリケーションに出会いました。このツールを使用して、LANインターフェイスを構成することもできます。

sudo apt-get install wicd-curses

他のかなりの数のパッケージをインストールし、バックグラウンドで独自のデーモンを実行しますが、すべての設定が非常に簡単になります。で実行する

sudo wicd-curses

ここに画像の説明を入力してください

ネットワークが検出されないというメッセージが表示されたらP(大文字である必要があるため、[SHIFT] pを使用)、ワイヤレスインターフェースフィールドにwlan0と入力し、F10を押して保存します。

  1. R リストを更新します。
  2. キーボードのカーソルを使用して、リストを上下に移動します
  3. 右を押してワイヤレス接続を設定します
  4. 数回押して、「このネットワークに自動的に接続する」をチェックします
  5. もう一度数回押して、キーフィールドにパスワードを入力します
  6. F10を押して保存します

ここに画像の説明を入力してください

Cアクセスポイントに接続するために押す必要がある場合があります。有線接続されている場合、LANインターフェイスが強制終了され、ワイヤレスが起動します。

また、接続を管理するため、何らかの理由でドロップアウトした場合、設定済みのワイヤレスアクセスポイントに再接続します。

WiFiアダプターのプラグを抜き差ししてテストしました。約60〜90秒かかりますが、WiFiに接続し直します(ただし、LANのプラグを抜く必要があると思います)

それが役に立てば幸い!


1
再接続の処理方法がわからない-最初の接続はここでの質問ではありませんでした!
andig

接続を自動的に確認する必要があるステップがあるため、答えを更新しました。また、設定で下にスクロールする必要があります。最後のオプションは画面外です。また、Wifiのネットワークへの接続を自動的に試行します(デフォルトではオンになっています)。WiFiアダプターのプラグインを取り外して、2分以内に再接続することさえできます(LANをプラグインせずにこれを行いました)これは、ワイヤレスを構成および管理するのに最適な方法です。また、ちょうど呼び出されたGUIバージョンを取得しますwicd
ピオトルクラ

コマンド「sudoのwicd-cruses」「U」と「R」は交換されているにタイプミスがあります
Gawcio

インストール後wicd-curses、RPi 3がランダムにフリーズし始めました。以前は決して凍結せず、アンインストールするとすぐに凍結が消えました。気をつけて!
-akhmed

1
wicd-cursesをインストールした後、Jessie Liteを実行しているRPi 3はフリーズせず、接続したままです。しかし、今日はイーサネットポートで接続しようとしましたが、起動後数秒でインターフェイスが失われることがわかりました。Wicに接続するためにwicd-cursesを設定する前に、うまく接続できました。
クリスジェンクス

14

これは、余分なスクリプトなしで解決できます。

/ etc / network / interfacesに以下を配置します。

allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp

ローミングにより、インターフェイスは自己修復できます。


最後の行は、wlan0インターフェイスに2番目のIPアドレスを追加するようです。それは意図的ですか?
fche

DHCPで割り当てられたアドレスは1つしかありません。この設定ファイルが不必要に難解です... -ブートスクリプトがが行動を変更した場合、それは完全に私は驚かないだろう
デヴィッド・舜天

2
私のraspbian pi2ボックスでは、「wpa-roam」を使用しても、3サイクルの認証試行が失敗するほど十分にwlanがダウンした場合、再試行しません。
fche

これは、RPi 3で機能した唯一の答えです。ありがとう!
akhmed

1

netcfg

試してくださいnetcfg。使用しているディストリビューションに関する詳細がなければ、これ以上詳細を提供することはできませんが、必要なことを行う必要があります。


4
現在のraspbianディストリビューションを使用しています:pi @ raspberrypi〜$ man netcfg netcfgの手動エントリなしpi @ raspberrypi〜$ netcfg -bash:netcfg:コマンドが見つかりませんpi @ raspberrypi〜$ apt-cache search netcfg pi @ raspberrypi〜$
andig

0

別の解決策、から抽出されたとして、この1
まず、wifi設定を構成します。次のsudo vi /etc/wpa_supplicant/wpa_supplicant.confようなセクションを追加します 。

network={
   ssid="MyNetworkName"
   psk="MyPaz0rdz"
   key_mgmt=WPA-PSK
}

次に、ネットワーク設定sudo vi /etc/dhcpcd.conf

interface wlan0
inform 192.168.1.200 # the static ip for the wifi card
static routers=192.168.1.254 # your router's ip
static domain_name_servers=192.168.1.254 # your dns, usually=your router

次に、このスクリプトファイルをどこかに、たとえばに作成し、実行可能に/home/pi/reconnect.shする+x許可を与えます。

#!/bin/bash
router=`ip route | awk '/default/ {print $3}'`
/bin/ping -q -c1 $router > /dev/null

if [ $? -eq  0 ]
then
  true
  # echo "Network OK"
else
  echo "Network down, fixing..."
  # ifdown --force wlan0
  # sleep 5
  /bin/kill -9 `pidof wpa_supplicant`
  /sbin/ifup --force wlan0
  /sbin/ip route add default via $router dev wlan0
  /bin/mount -a
  echo "wlan0 reconnected at `date`"
fi

次に、でrootとしてログインしsudo su、でrootのcrontabを編集しcrontab -eます。
このファイルの最後に次の行を追加します。

10 * * * * /home/pi/reconnect.sh

つまり、「そのスクリプトを(ルートとして)10分ごとに実行する」という意味です。

接続があれば、スクリプトは終了し、何も起こりません。ルーターにpingできない場合、スクリプトはwpa_supplicantを使用してルーターに再接続しようとします。

cronスクリプトからエコーされるすべてのもの(この場合は切断されている場合のみ)がルートに電子メールで送信されることに注意してください。そのため、メールエイリアスとポストスクリプトを設定している場合、piのwifi接続がダウンしたときに電子メールを受信し、スクリプトのおかげで再び正常に戻ります。


0

これは、2017年3月30日にRaspian Jessieを使用して機能しました。

http://alexba.in/blog/2015/01/14/automatically-reconnecting-wifi-on-a-raspberrypi/


1
リンクが機能しなくなった場合に備えて、投稿で解決策を要約してください。
tlhIngan

CMB、StackExchangeのRPiフレーバーコーナーへようこそ。サイトポリシーでは、リンクが腐敗する可能性があるため、リンクのみの回答は推奨されません。リンクのコンテンツを複製する必要はありませんが、少なくともリンクに含まれるハイライトについては適切な回答を展開する必要があります。
Jacobm001

上記のJacobm001のコメントに加えて、情報なしのリンクのみの回答に関するポリシーに従い、この投稿が編集されていない場合でも、最小限の回答として立つことができる情報を含む場合、48時間以内にコミュニティWikiに変換され、コミュニティによって修正されました。
-goobering
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.