Как автоматически переподключить WiFi?

74

Я использую свой пи для мониторинга своих измерителей мощности. Данные передаются на ПК через WiFi-соединение с помощью USB-адаптера Edimax EW-7811UN. Когда соединение Wi-Fi обрывается (отключается ночью или нестабильно), USB-адаптер остается отключенным.

Есть ли способ автоматически перезапустить соединение WiFi без повторного подключения адаптера WiFi?

andig
источник

Ответы:

31

Я предпочитаю отключать большую часть работы демона автоматической настройки сети и управления соединениями и разбираюсь с этим сам. Вот скрипт (bash), который будет поддерживать соединение, пока есть сеть, и у вас нет проблем с драйвером Wi-Fi или проблемами с питанием; идея состоит в том, чтобы пинговать маршрутизатор каждые N секунд, и если это не удается, повторно подключите:

#!/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

Все это предполагает открытую незашифрованную сеть (в противном случае вам придется добавить соответствующие команды). Я использовал этот подход на разных машинах Linux, включая pi, и он работает безупречно; она будет поддерживать систему в сети неограниченное время, даже если она периодически переходит в спящий режим (чего пи в любом случае не может).

Достойный интервал проверки составляет 3-5 секунд; эта деятельность не окажет значительного влияния на системные ресурсы вообще.

Вам абсолютно необходимо сначала отключить автоконфигурацию сети . включая ifplugdи другие сетевые демоны, или это будет мешать вашим усилиям:

Как отключить автоматическую настройку сети на Raspbian?

Я ведь использовал apt-get remove ifplugd.

Для запуска сети при загрузке (так как я использую пи безголовый), у меня есть этот набор для запуска на 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.

Суть в том if, что если мой ключ wifi подключен к pi, модуль 8192cu будет загружен ядром в этот момент - так что wifi должен запуститься. Если нет, то предполагается, что ethernet подключен и должен использоваться (если это не так, dhclient просто вылетит, и нет доступа к сети).

Для этого вам, вероятно, придется

Таким образом, это загружает безголовый пи в сеть при загрузке и сохраняет его там. Если вам нужен способ переключиться на eth во время работы без входа в систему, вы можете сделать что-то с помощью правил udev для извлечения ключа Wi-Fi.

Златовласка
источник
Звучит достойно тестирования. Не будучи Linux-профессионалом, как мне настроить запуск скрипта при запуске в cron? Будет ли возможно / необходимо добавить ротацию журналов?
andig
1
@andig: я добавил несколько параграфов о запуске через rc.local. Ротация журнала WRT, это отдельный вопрос, который относится к файлам журнала в целом (но см. man logrotate). Прямо сейчас этот скрипт закроет (перезапишет) любой предыдущий журнал, если он существует с тем же путем, а не добавится. Для отладки я иногда использовал wifi.$$.logв файле wifi.conf, так что последний журнал (маловероятно) будет засорен, и я могу сравнить один сеанс с другим после того, как что-то настроил. $$PID процесса "Wi-Fi".
Златовласка
Я беспокоюсь о том, что иногда сценарии оболочки могут быть хрупкими и ломаться, чтобы увидеть пути, когда есть обновления или установлено другое сетевое программное обеспечение. Просто предостережение об этом подходе.
Иеремия
3
@jeremiah: Это хороший страх. Я написал сценарий, дорабатывал его годами и чувствую, что у меня есть некоторое понимание общего контекста, в котором он работает, и, следовательно, то, что мне нужно остерегаться. Тем не менее, это, вероятно, сложнее передать понимание, чем фрагменты кода. Для меня это просто альтернативный подход к работе с NetworkManager, сводящий ситуацию к некоторым элементарным элементам. Это то, что можно предложить людям с такой же точки зрения, поскольку «это то, что сработало для меня» по всему спектру дистрибутивов Linux в условиях простой автономной системы.
Златовласка
Итак: я знаю об этом посте и намерен держать его в курсе, если один из основных потоков дистрибутивов (debia и fedora и производные) представит что-то, что с ним будет связано. Я также добавлю некоторые акценты в пункты о том, что нужно отключить и как.
Златовласка
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
12
Извините за упрощенный вопрос - почему это работает?
Джефф Фрикадель Ян
@JeffMeatballYang, создайте новую ветку для вашего вопроса.
AndaluZ
6
Для меня там не было файла ifupdown, просто ссылка action_wpa -> ../../wpa_supplicant/action_wpa.sh, так что, может быть, сейчас это по умолчанию?
Цитракс
2
Да, как и другие говорят: это не работает на dhcpcdдистрибутивы основе для того, чтобы получить это работает на RPI3 вам нужно apt-get install rcconfпереходить от dhcpcdкnetworking
test30
22

Недавно я наткнулся на консольное приложение, которое разбирает все настройки беспроводной сети. Вы также можете использовать этот инструмент для настройки интерфейса локальной сети.

sudo apt-get install wicd-curses

Он установит довольно много других пакетов и запустит своего собственного демона в фоновом режиме, но он, несомненно, значительно упростит настройку всего. Запустить его с

sudo wicd-curses

введите описание изображения здесь

Если вы получили сообщение о том, что сети не обнаружены, нажмите P(должно быть заглавной, поэтому используйте [SHIFT] p) и введите wlan0 в поле беспроводного интерфейса и нажмите F10 для сохранения.

  1. R обновить список.
  2. Используйте курсоры на клавиатуре для перемещения вверх и вниз по списку
  3. Нажмите вправо, чтобы настроить беспроводное соединение
  4. Нажмите несколько раз и установите флажок «Автоматически подключаться к этой сети».
  5. Нажмите несколько раз еще раз и введите свой пароль в поле ключа.
  6. Нажмите F10, чтобы сохранить

введите описание изображения здесь

Возможно, вам придется нажать, Cчтобы подключиться к точке доступа. Если вы подключены, это, скорее всего, убьет интерфейс локальной сети и включит беспроводную связь.

Он также управляет соединением, поэтому он будет повторно подключаться к любым настроенным точкам беспроводного доступа, если он по какой-либо причине выпадет.

Я проверил подключение адаптера WiFi и его подключение обратно. Это займет около 60 ~ 90 секунд, но он снова подключится к WiFi (хотя я думаю, что локальная сеть должна быть отключена)

Надеюсь, это поможет!

Петр Кула
источник
1
Не уверен, как это позаботится о переподключении - здесь вопрос не был начальным!
andig
Я обновил ответ, потому что есть шаг, где вы должны проверить подключение автоматически. Также в настройках вы должны прокрутить весь путь вниз. Последний вариант - вне экрана. Он также говорит, что автоматически пытается подключиться к сети для Wi-Fi (по умолчанию он включен). Я даже могу вынуть подключенный адаптер Wi-Fi, и он снова подключится в течение 2 минут. (Я сделал это без подключения к локальной сети). Это действительно лучший способ настройки беспроводной сети и управления ею. Вы также получаете только что названную версию графического интерфейсаwicd
Петр Кула
в команде "sudo wicd-cruses" есть опечатка "u" и "r" поменялись местами
Gawcio
После установки wicd-cursesмой RPi 3 начал зависать случайно. Никогда не замораживался прежде, и замораживание исчезло немедленно, как только я удалил это. Осторожно!
Ахмед
1
После установки wicd-curses мои RPi 3s под управлением Jessie Lite не замерзли и остаются на связи. Но сегодня я попытался подключиться к одному через порт Ethernet, и обнаружил, что интерфейс будет потерян через несколько секунд после загрузки. Я смог нормально подключиться перед настройкой wicd-curses для подключения к wifi.
Крис Дженкс
14

Это можно решить без лишних сценариев.

В / etc / network / interfaces поместите:

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

Роуминг позволяет самовосстановлению интерфейса.

Дэвид Сэйнти
источник
Последняя строка добавляет второй IP-адрес в интерфейс wlan0; это намеренно?
Fche
У меня только один DHCP-адрес. Меня не удивило бы, если бы загрузочные скрипты изменили поведение - этот конфигурационный файл излишне таинственен ...
David Sainty
2
На моем raspbian pi2 box, если wlan отключается достаточно долго для трех неудачных попыток аутентификации, даже с "wpa-roam", он не пытается снова.
fche
Это единственный ответ, который работал для меня на RPi 3. Спасибо!
Ахмед
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

Другое решение, как извлечено из этого .
Сначала настройте свои настройки Wi-Fi: 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и отредактируйте crontab с помощью root crontab -e.
В конце этого файла добавьте эту строку:

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

Это означает: «выполнять этот скрипт каждые 10 минут (как root)»

Теперь, если у вас есть соединение, скрипт завершится, и ничего не произойдет. Если вы не можете пропинговать свой маршрутизатор, тогда скрипт попытается подключиться к нему с помощью wpa_supplicant.

Обратите внимание, что все, что отражено в скрипте cron (в данном случае только при отключении), будет отправлено пользователю root по электронной почте. Так что, если вы настроили свои почтовые псевдонимы и postscript, вы будете получать электронное письмо всякий раз, когда Wi-Fi-соединение вашего pi прерывается, а затем успешно возвращаться снова благодаря сценарию.

Leonardo
источник
0

Это сработало для меня, используя Raspian Jessie 30 марта 2017 года:

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

Колорадо МаунтинБой
источник
1
Пожалуйста, кратко изложите решение в своем посте, в случае, если ссылка не работает.
tlhIngan
CMB, добро пожаловать в RPC-пакет StackExchange. Политика сайта не поощряет ответы только на ссылки, так как они подвержены гниению ссылок. Вам не нужно дублировать содержимое ссылки, но хороший ответ должен по крайней мере расширить основные моменты, содержащиеся в ссылке.
Jacobm001
В дополнение к комментарию Jacobm001, приведенному выше, в соответствии с нашей политикой, касающейся ответов без информации, только если этот пост не будет отредактирован, чтобы содержать информацию, которая может выступать в качестве ответа, пусть и минимального, через 48 часов он будет преобразован в вики сообщества, чтобы упростить это исправлено сообществом.
goobering