Làm cách nào để tự động kết nối lại WiFi?


74

Tôi đang sử dụng pi của tôi để theo dõi đồng hồ đo điện của tôi. Dữ liệu được truyền đến PC bằng kết nối WiFi bằng bộ chuyển đổi USB Edimax EW-7811UN. Khi kết nối Wifi giảm (tắt qua đêm hoặc kết nối bị rung), bộ chuyển đổi USB vẫn bị tắt.

Có cách nào để tự động khởi động lại kết nối WiFi mà không cần cắm lại bộ điều hợp WiFi không?

Câu trả lời:


31

Tôi thích vô hiệu hóa hầu hết các công cụ daemon cấu hình và quản lý kết nối tự động và tự xử lý nó. Đây là tập lệnh (bash) sẽ duy trì kết nối miễn là mạng ở đó và bạn không gặp phải sự cố về trình điều khiển wifi hoặc sự cố về điện; ý tưởng là ping bộ định tuyến mỗi N giây và nếu thất bại, hãy kết nối lại:

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

Vì vậy, /etc/wifi.conftrong trường hợp này có thể chứa:

router_ip=192.168.0.1
log=/var/log/wifi.log
wlan=wlan0
eth=eth0
essid=someNetwork
check_interval=5

Tất cả điều này giả định một mạng không được mã hóa mở (nếu không, bạn sẽ phải thêm các lệnh thích hợp). Tôi đã sử dụng phương pháp này trên các máy linux khác nhau, bao gồm cả pi và nó hoạt động hoàn hảo; nó sẽ giữ cho một hệ thống trực tuyến vô thời hạn, ngay cả khi nó định kỳ đi ngủ (điều mà dù sao thì pi cũng không thể).

Một khoảng thời gian kiểm tra tốt là 3-5 giây; hoạt động này sẽ không ảnh hưởng đáng kể đến tài nguyên hệ thống.

Bạn hoàn toàn cần phải vô hiệu hóa cấu hình tự động mạng trước tiên ,. bao gồm ifplugdvà các trình nền mạng khác, hoặc điều này sẽ cản trở nỗ lực của bạn:

Làm cách nào tôi có thể tắt kết nối mạng được cấu hình tự động trên Raspbian?

Tôi thực tế đã sử dụng apt-get remove ifplugd.

Để bắt đầu kết nối mạng khi khởi động (vì tôi sử dụng pi không đầu), tôi có bộ này để chạy trên raspbian từ /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/wifilà kịch bản. Nếu bạn không biết cái gì niceđể làm, hãy đọc man nice.

Điểm quan trọng iflà nếu dongle wifi của tôi được cắm vào pi, mô-đun 8192cu sẽ được nạp bởi kernel vào thời điểm này - vì vậy wifi nên bắt đầu. Nếu không, thì giả sử rằng ethernet đã được cắm và nên được sử dụng (nếu không, dhclient sẽ ngừng hoạt động và không có quyền truy cập mạng).

Để làm việc này có lẽ bạn sẽ phải

Vì vậy, điều này nhận được một pi không đầu vào mạng khi khởi động và giữ nó ở đó. Nếu bạn muốn có một cách để chuyển sang eth trong khi chạy mà không cần đăng nhập, bạn có thể làm gì đó với các quy tắc udev để kéo dongle wifi ra.


Âm thanh đáng thử nghiệm. Không phải là một chương trình linux - làm cách nào để thiết lập tập lệnh chạy khi khởi động - đưa vào cron? Nó có thể / bắt buộc để thêm xoay vòng log không?
andig

1
@andig: Tôi đã thêm một vài đoạn về khởi nghiệp thông qua rc.local. Xoay vòng nhật ký WRT, đó là một câu hỏi riêng liên quan đến các tệp nhật ký nói chung (nhưng xem man logrotate). Ngay bây giờ kịch bản mà sẽ clobber (ghi đè) bất kỳ đăng nhập trước nếu nó tồn tại với cùng một con đường, không thêm. Để gỡ lỗi, đôi khi tôi đã sử dụng wifi.$$.logtệp wifi.conf để nhật ký cuối cùng (không có khả năng) bị ghi đè và tôi có thể so sánh phiên này với phiên khác sau khi tôi đã điều chỉnh một cái gì đó. $$là mấu chốt của quá trình "wifi".
goldilocks

Tôi lo lắng rằng đôi khi các tập lệnh shell có thể dễ hỏng và khó tìm cách khi có các bản cập nhật hoặc nếu phần mềm mạng khác được cài đặt. Chỉ cần một lưu ý thận trọng về phương pháp này.
jeremiah

3
@jeremiah: Đó là một nỗi sợ hãi tốt. Tôi đã viết kịch bản, điều chỉnh nó trong nhiều năm và cảm thấy tôi có một số hiểu biết về bối cảnh chung mà nó vận hành và do đó tôi cần phải đề phòng điều gì. Tuy nhiên, có lẽ khó truyền qua sự hiểu biết hơn các đoạn mã. Đối với tôi, đó chỉ là một cách tiếp cận khác để cố gắng làm việc với NetworkManager, bằng cách giảm tình huống xuống một số yếu tố rất cơ bản. Đây là một cái gì đó để cung cấp cho những người có quan điểm tương tự như "đây là những gì làm việc cho tôi" trên toàn bộ phổ distro linux trong trường hợp hệ thống độc lập đơn giản.
goldilocks

Vì vậy: Tôi biết về bài đăng này và có ý định cập nhật nó nếu một trong những luồng phân phối chính (debia và fedora và dẫn xuất) giới thiệu một cái gì đó gây rối với nó. Tôi cũng sẽ thêm một số điểm nhấn vào những điểm cần phải vô hiệu hóa và làm thế nào.
goldilocks

68

Vâng, có một giải pháp rất đơn giản:

  1. Chuyển đến /etc/ifplugd/action.d/và đổi tên ifupdowntập tin thànhifupdown.original
  2. Sau đó làm: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Cuối cùng: sudo reboot

Đó là tất cả. Kiểm tra điều này bằng cách tắt / bật AP của bạn; bạn sẽ thấy Raspberry Pi của bạn kết nối lại đúng cách.


2
Đây là câu trả lời đơn giản và hiệu quả nhất. Đã thử nghiệm trên 2 Rpi và nó hoạt động. Tìm thấy liên kết này từ: raspberrypi.org/phpBB3/ khăn
Mauvis Ledford

12
Xin lỗi cho một câu hỏi đơn giản - tại sao điều này làm việc?
Jeff Meatball Yang

@JeffMeatballYang, bắt đầu một chủ đề mới cho câu hỏi của bạn.
AndaluZ

6
Đối với tôi không có tập tin ifupdown ở đó, chỉ là một liên kết action_wpa -> ../../wpa_supplicant/action_wpa.sh, vậy có lẽ đây là mặc định bây giờ?
Zitrax

2
Đúng, như những người khác nói: điều này không hoạt động trên các bản phát hành dhcpcddựa trên, để chạy cái này trên RPI3, bạn cần apt-get install rcconfvà chuyển từ dhcpcdsangnetworking
test30

22

Gần đây tôi tình cờ thấy một ứng dụng giao diện điều khiển sắp xếp tất cả các cấu hình không dây. Bạn cũng có thể sử dụng công cụ này để cấu hình giao diện LAN.

sudo apt-get install wicd-curses

Nó sẽ cài đặt khá nhiều gói khác và chạy daemon của riêng nó trong nền nhưng nó chắc chắn giúp việc cấu hình mọi thứ dễ dàng hơn rất nhiều. Chạy nó với

sudo wicd-curses

nhập mô tả hình ảnh ở đây

Nếu bạn nhận được thông báo cho biết không có mạng nào được phát hiện, nhấn P(phải là vốn, vì vậy hãy sử dụng [SHIFT] p) và nhập wlan0 vào trường giao diện không dây và nhấn F10 để lưu.

  1. R để làm mới danh sách.
  2. Sử dụng các con trỏ trên bàn phím để điều hướng lên và xuống danh sách
  3. Nhấn chuột phải để định cấu hình kết nối không dây
  4. Nhấn xuống một vài lần và kiểm tra "Tự động kết nối với mạng này"
  5. Nhấn xuống một vài lần nữa và nhập mật khẩu của bạn vào trường khóa
  6. Nhấn F10 để lưu

nhập mô tả hình ảnh ở đây

Bạn có thể phải nhấn Cđể kết nối với điểm truy cập. Nếu bạn có dây, rất có thể sẽ giết giao diện LAN và kết nối không dây.

Nó cũng quản lý kết nối để nó sẽ kết nối lại với bất kỳ điểm truy cập không dây được cấu hình nào nếu nó bị mất vì bất kỳ lý do gì.

Tôi đã thử cắm bộ điều hợp WiFi và cắm lại. Mất khoảng 60 ~ 90 giây nhưng nó sẽ kết nối lại với WiFi (tôi nghĩ rằng phải rút mạng LAN)

Hy vọng nó giúp!


1
Không chắc cách thức chăm sóc kết nối ban đầu - kết nối ban đầu không phải là câu hỏi ở đây!
andig

Tôi đã cập nhật câu trả lời vì có một bước mà bạn phải kiểm tra kết nối tự động. Ngoài ra trong sở thích, bạn nên cuộn tất cả các cách xuống. Tùy chọn cuối cùng là tắt màn hình. Nó cũng cho biết Tự động thử kết nối với mạng cho Wifi (theo mặc định là BẬT). Tôi thậm chí có thể rút phích cắm bộ điều hợp WiFi trở lại và nó sẽ kết nối lại trong vòng 2 phút. (Tôi đã làm điều này mà không cần kết nối mạng LAN) Đây thực sự là cách tốt nhất tôi tìm thấy để định cấu hình và quản lý không dây. Bạn cũng nhận được phiên bản GUI vừa được gọiwicd
Piotr Kula

có một lỗi đánh máy trong lệnh "sudo wicd-cruses" 'u' và 'r' được trao đổi
Gawcio

Sau khi cài đặt wicd-curses, RPi 3 của tôi bắt đầu đóng băng ngẫu nhiên. Chưa bao giờ đóng băng trước đó và đóng băng biến mất ngay lập tức sau khi tôi gỡ cài đặt nó. Coi chừng!
akhmed

1
Sau khi cài đặt wicd-curses, RPi 3 của tôi chạy Jessie Lite vẫn không bị đóng băng và không kết nối. Nhưng hôm nay tôi đã thử kết nối với một cổng ethernet và thấy giao diện sẽ bị mất vài giây sau khi khởi động. Tôi đã có thể kết nối tốt trước khi định cấu hình wicd-curses để kết nối với wifi.
Chris Jenks

14

Điều này có thể được giải quyết mà không có kịch bản thêm.

Trong / etc / mạng / giao diện đặt:

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

Việc chuyển vùng cho phép giao diện tự phục hồi.


Dòng cuối cùng dường như thêm địa chỉ IP thứ hai vào giao diện wlan0; đó là cố ý?
fche

Tôi chỉ kết thúc với một địa chỉ được gán DHCP. Nó sẽ không làm tôi hoàn toàn ngạc nhiên nếu các tập lệnh khởi động đã thay đổi hành vi - tập tin cấu hình này là phức tạp không cần thiết ...
David Sainty

2
Trên hộp pi2 của tôi, nếu wlan xuống đủ lâu để ba lần thử xác thực thất bại, ngay cả với "wpa-roam", nó sẽ không thử lại.
fche

Đây là câu trả lời duy nhất có hiệu quả với tôi trên RPi 3. Cảm ơn!
akhmed

1

netcfg

Hãy thử netcfg. Không có thêm thông tin chi tiết về phân phối nào bạn đang sử dụng, tôi không thể cung cấp thêm nhiều chi tiết, nhưng nó sẽ làm những gì bạn muốn.


4
Tôi đang sử dụng bản phân phối raspbian hiện tại: pi @ raspberrypi ~ $ man netcfg Không có mục nhập thủ công cho netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: lệnh không tìm thấy pi @ raspberrypi ~ $ apt-cache search netcfg pi @ raspberrypi ~ $
andig

0

Một giải pháp khác, như được trích xuất từ cái này .
Đầu tiên định cấu hình cài đặt wifi của bạn: sudo vi /etc/wpa_supplicant/wpa_supplicant.confthêm một phần như thế này:

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

Sau đó, cài đặt mạng của bạn với 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

Sau đó tạo tệp tập lệnh này ở đâu đó, ví dụ như trong /home/pi/reconnect.shvà cho +xphép nó được thực thi.

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

Sau đó đăng nhập với quyền root sudo suvà chỉnh sửa crontab của root với crontab -e.
Ở cuối tập tin này, thêm dòng này:

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

Điều đó có nghĩa là: "thực thi tập lệnh đó cứ sau 10 phút (với quyền root)"

Bây giờ, nếu bạn có kết nối thì tập lệnh sẽ thoát và không có gì xảy ra. Nếu bạn không thể ping bộ định tuyến của mình thì tập lệnh sẽ cố gắng kết nối lại với bộ định tuyến bằng wpa_supplicant.

Lưu ý rằng mọi thứ được lặp lại từ tập lệnh cron (trong trường hợp này chỉ khi bị ngắt kết nối) sẽ được gửi qua email đến root. Vì vậy, nếu bạn đã cấu hình bí danh thư và mô tả thư của mình thì bạn sẽ nhận được email bất cứ khi nào kết nối wifi của pi bị hỏng và sau đó quay lại một cách thành công nhờ vào tập lệnh.


0

Điều này làm việc cho tôi, sử dụng Raspian Jessie vào ngày 30.March.2017:

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


1
Hãy tóm tắt các giải pháp trong bài viết của bạn, trong trường hợp liên kết bị chết.
tlhIngan

CMB, chào mừng bạn đến với góc hương vị RPi của StackExchange. Chính sách trang web không khuyến khích liên kết chỉ các câu trả lời vì chúng có thể bị thối liên kết. Bạn không cần phải sao chép nội dung của liên kết, nhưng ít nhất một câu trả lời tốt nên mở rộng trên các điểm nổi bật có trong liên kết.
Jacobm001

Ngoài ra với nhận xét của Jacobm001 ở trên, phù hợp với chính sách của chúng tôi về các câu trả lời không có liên kết, nếu bài đăng này không được chỉnh sửa để chứa thông tin có thể là câu trả lời, tuy nhiên tối thiểu, trong 48 giờ, nó sẽ được chuyển đổi sang Community Wiki để đơn giản hóa việc có nó được sửa chữa bởi cộng đồng.
goobering
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.