วิธีเชื่อมต่อ WiFi ใหม่โดยอัตโนมัติ


74

ฉันใช้ pi ของฉันเพื่อตรวจสอบมิเตอร์ไฟฟ้า ข้อมูลถูกโอนไปยังพีซีโดยการเชื่อมต่อ WiFi โดยใช้อะแดปเตอร์ Edimax EW-7811UN เมื่อการเชื่อมต่อ Wifi ลดลง (ปิดข้ามคืนหรือการเชื่อมต่อสั่นคลอน) อะแดปเตอร์ USB จะยังคงปิดใช้งานอยู่

มีวิธีการรีสตาร์ทการเชื่อมต่อ WiFi โดยอัตโนมัติโดยไม่ต้องเสียบอแด็ปเตอร์ WiFi ซ้ำหรือไม่

คำตอบ:


31

ฉันชอบที่จะปิดการใช้งานการกำหนดค่าอัตโนมัติของเครือข่ายและการจัดการการเชื่อมต่อสิ่งต่างๆและจัดการด้วยตัวเอง นี่คือสคริปต์ (ทุบตี) ที่จะทำให้การเชื่อมต่อของเครือข่ายตราบใดที่มีอยู่และคุณไม่มีไดรเวอร์ wifi หรือปัญหาด้านพลังงานที่ผิดพลาด แนวคิดคือการ ping เราเตอร์ทุก ๆ 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และ daemons เครือข่ายอื่น ๆ หรือสิ่งนี้จะรบกวนความพยายามของคุณ:

ฉันจะปิดการใช้งานเครือข่ายที่กำหนดค่าโดยอัตโนมัติบน 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เป็นสคริปต์ หากคุณไม่ได้รู้ว่าสิ่งที่สำหรับการอ่านniceman nice

ประเด็นifก็คือว่าถ้าดองเกิล wifi ของฉันเสียบเข้ากับปี่โมดูล 8192cu จะถูกโหลดโดยเคอร์เนล ณ จุดนี้ - ดังนั้น WiFi ควรเริ่มต้น ถ้าไม่เช่นนั้นจะสันนิษฐานว่าอีเธอร์เน็ตเสียบปลั๊กและควรใช้ (ถ้าไม่ใช่, dhclient จะเพิ่งอึและไม่มีการเข้าถึงเครือข่าย)

สำหรับการทำงานคุณอาจจะต้อง

ดังนั้นสิ่งนี้จะได้รับ pi ที่ไม่มีส่วนหัวบนเครือข่ายเมื่อบูตและเก็บไว้ที่นั่น หากคุณต้องการวิธีเปลี่ยนเป็น eth ในขณะที่ทำงานโดยไม่ต้องลงชื่อเข้าใช้คุณสามารถทำอะไรกับกฎ udevเพื่อดึง wifi dongle ออก


เสียงทดสอบที่คุ้มค่า ไม่ใช่การเป็นลินุกซ์ - ฉันจะตั้งค่าสคริปต์ให้ทำงานเมื่อเริ่มต้น - ใส่ลงใน cron ได้อย่างไร เป็นไปได้ / จำเป็นที่จะต้องเพิ่มการหมุนเวียนบันทึกด้วยหรือไม่
andig

1
@andig: rc.localผมเพิ่มวรรคสามเกี่ยวกับการเริ่มต้นขึ้นผ่าน การหมุนล็อก WRT นั่นเป็นคำถามแยกต่างหากที่เกี่ยวข้องกับล็อกไฟล์โดยทั่วไป (แต่ดูman logrotate) ตอนนี้สคริปต์นั้นจะอุดตัน (เขียนทับ) บันทึกก่อนหน้านี้หากมีอยู่ในเส้นทางเดียวกันโดยไม่ต้องต่อท้าย สำหรับการดีบักบางครั้งฉันใช้wifi.$$.logในไฟล์ wifi.conf เพื่อให้การบันทึกครั้งล่าสุด (ไม่น่าเป็นไปได้) ที่จะถูกปิดกั้นและฉันสามารถเปรียบเทียบหนึ่งเซสชันกับอีกเซสชันหนึ่งหลังจากที่ฉันปรับแต่งบางสิ่งบางอย่าง $$เป็น pid ของกระบวนการ "wifi"
goldilocks

ฉันกังวลว่าบางครั้งเชลล์สคริปต์อาจเปราะบางและแตกหักได้ยากเมื่อเห็นว่ามีการอัปเดตหรือติดตั้งซอฟต์แวร์เครือข่ายอื่น ขอให้ระมัดระวังในวิธีการนี้
jeremiah

3
@ Jeremiah: นั่นเป็นความกลัวที่ดี ฉันเขียนสคริป tweaked ในช่วงหลายปีที่ผ่านมาและรู้สึกว่าฉันมีความเข้าใจในบริบททั่วไปที่มันทำงานและดังนั้นสิ่งที่ฉันต้องระวัง อย่างไรก็ตามอาจเป็นเรื่องยากที่จะส่งผ่านความเข้าใจมากกว่าตัวอย่างโค้ด สำหรับฉันมันเป็นเพียงวิธีการทางเลือกในการพยายามทำงานกับ NetworkManager โดยลดสถานการณ์ให้เป็นองค์ประกอบพื้นฐานบางอย่าง นี่คือสิ่งที่จะให้คนที่มีมุมมองที่คล้ายกันว่า "นี่คือสิ่งที่ทำงานสำหรับฉัน" ข้ามสเปกตรัมลินุกซ์ในสถานการณ์ของระบบสแตนด์อะโลนที่เรียบง่าย
goldilocks

ดังนั้น: ฉันทราบเกี่ยวกับโพสต์นี้และตั้งใจที่จะให้มันอัปเดตหากหนึ่งในสตรีม distro สำคัญ (debia และ fedora และที่ได้รับ) แนะนำสิ่งที่ยุ่งกับมัน ฉันจะเพิ่มจุดเน้นบางอย่างเกี่ยวกับสิ่งที่ต้องปิดการใช้งานและวิธีการ
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

12
ขออภัยสำหรับคำถามง่าย ๆ - ทำไมจึงใช้งานได้
Jeff Meatball Yang

@JeffMeatballYang เริ่มกระทู้ใหม่สำหรับคำถามของคุณ
AndaluZ

6
สำหรับฉันไม่มีไฟล์ ifupdown ที่นั่นเพียงแค่ลิงค์action_wpa -> ../../wpa_supplicant/action_wpa.shดังนั้นนี่อาจเป็นค่าเริ่มต้นหรือไม่
Zitrax

2
อ๋อเหมือนคนอื่น ๆ พูดว่า: มันไม่ได้ทำงานบนdhcpcddistros ตามเพื่อที่จะได้ทำงานบน RPI3 ที่คุณต้องการapt-get install rcconfและเปลี่ยนจากdhcpcdเป็นnetworking
test30

21

ฉันเพิ่งสะดุดกับแอปพลิเคชั่นคอนโซลที่คัดแยกการกำหนดค่าไร้สายทั้งหมดออกไป คุณสามารถใช้เครื่องมือนี้เพื่อกำหนดค่าอินเตอร์เฟส LAN

sudo apt-get install wicd-curses

มันจะติดตั้งแพ็กเกจอื่น ๆ ไม่กี่ตัวและเรียกใช้ daemon ของตัวเองในพื้นหลัง แต่แน่ใจว่าทำให้การกำหนดค่าทุกอย่างง่ายขึ้นมาก เรียกใช้ด้วย

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 โดยอัตโนมัติ (เปิดใช้งานตามค่าเริ่มต้น) ฉันสามารถถอดปลั๊กอะแดปเตอร์ไร้สายกลับมาได้และมันจะเชื่อมต่อใหม่ภายใน 2 นาที (ฉันทำได้โดยไม่ต้องเสียบสาย LAN) นี่เป็นวิธีที่ดีที่สุดที่ฉันพบว่าตั้งค่าและจัดการระบบไร้สาย คุณยังได้รับรุ่น GUI ที่เรียกว่าwicd
Piotr Kula

มีการพิมพ์ผิดในคำสั่ง "sudo wicd-cruses" 'U' และ 'R' จะมีการแลกเปลี่ยน
Gawcio

หลังจากติดตั้งwicd-cursesแล้ว RPi 3 ของฉันก็เริ่มแช่แข็งแบบสุ่ม ไม่เคยถูกแช่แข็งมาก่อนและการแช่แข็งจะหายไปทันทีเมื่อฉันถอนการติดตั้ง ระวัง!
akhmed

1
หลังจากติดตั้ง wicd-curses แล้ว RPi 3s ของฉันที่ใช้ Jessie Lite ยังไม่หยุดและยังคงเชื่อมต่ออยู่ แต่วันนี้ฉันลองเชื่อมต่อกับพอร์ตอีเธอร์เน็ตและพบว่าอินเตอร์เฟสจะหายไปในไม่กี่วินาทีหลังจากบูต ฉันสามารถเชื่อมต่อได้ดีก่อนกำหนดค่า wicd-curses เพื่อเชื่อมต่อ wifi
Chris Jenks

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 ของฉันหาก wlan ยาวพอสำหรับการรับรองความถูกต้องสามรอบพยายามที่จะล้มเหลวแม้จะมี "wpa-roam" ก็ไม่ลองอีกครั้ง
fche

นี่เป็นคำตอบเดียวที่ใช้ได้กับฉันใน RPi 3 ขอบคุณ!
akhmed

1

netcfg

ลองnetcfgดู หากไม่มีรายละเอียดเพิ่มเติมเกี่ยวกับการกระจายที่คุณใช้ฉันไม่สามารถให้รายละเอียดเพิ่มเติมได้อีกมากมาย แต่ควรทำในสิ่งที่คุณต้องการ


4
ฉันใช้ distro raspbian ปัจจุบัน: pi @ raspberrypi ~ $ man netcfg ไม่มีรายการคู่มือสำหรับ netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: คำสั่งไม่พบ pi @ raspberrypi ~ $ apt-cache ค้นหา netcfg pi @ raspberrypi ~ $ apt-cache
andig

0

ทางออกก็เป็นสารสกัดจากนี้
ขั้นแรกกำหนดการตั้งค่า 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

จากนั้นเข้าสู่ระบบเป็นรากsudo suและแก้ไขรากของ crontab crontab -eกับ
ในตอนท้ายของไฟล์นี้เพิ่มบรรทัดนี้:

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

ซึ่งหมายความว่า: "รันสคริปต์นั้นทุก ๆ 10 นาที (ในฐานะที่เป็นรูท)"

ตอนนี้ถ้าคุณมีการเชื่อมต่อแล้วสคริปต์จะออกและจะไม่มีอะไรเกิดขึ้น หากคุณไม่สามารถ ping เราเตอร์ของคุณได้สคริปต์จะพยายามเชื่อมต่อใหม่โดยใช้ wpa_supplicant

โปรดสังเกตว่าทุกอย่างที่ถูกสะท้อนจากสคริปต์ cron (ในกรณีนี้เฉพาะเมื่อถูกตัดการเชื่อมต่อ) จะถูกส่งไปยังรูท ดังนั้นหากคุณได้กำหนดค่าอีเมลแทนนามแฝงและ postscript ของคุณคุณจะได้รับอีเมลเมื่อใดก็ตามที่การเชื่อมต่อ wifi ของ pi ของคุณลดลงและกลับมาอีกครั้งขอบคุณสคริปต์


0

สิ่งนี้ใช้งานได้สำหรับฉันโดยใช้ Raspian Jessie เมื่อวันที่ 30.March.2017:

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


1
โปรดสรุปวิธีแก้ปัญหาในโพสต์ของคุณในกรณีที่ลิงก์เสีย
tlhIngan

CMB ยินดีต้อนรับสู่มุมรส RPi ของ StackExchange นโยบายเว็บไซต์กีดกันการเชื่อมโยงคำตอบเฉพาะเมื่อมันอยู่ภายใต้การเชื่อมโยงการเน่า คุณไม่จำเป็นต้องทำซ้ำเนื้อหาของลิงค์ แต่อย่างน้อยคำตอบที่ดีควรจะขยายในไฮไลท์ที่มีอยู่ในลิงค์
Jacobm001

เพิ่มเติมจากความคิดเห็นของ Jacobm001 ด้านบนเพื่อให้สอดคล้องกับนโยบายของเราเกี่ยวกับคำตอบลิงก์อย่างเดียวที่ไม่มีข้อมูลหากโพสต์นี้ไม่ได้รับการแก้ไขเพื่อให้มีข้อมูลที่สามารถยืนเป็นคำตอบได้ แต่น้อยที่สุดใน 48 ชั่วโมง แก้ไขโดยชุมชน
goobering
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.