Skip to content

Instantly share code, notes, and snippets.

@topshed
Last active August 21, 2018 13:37
Show Gist options
  • Save topshed/93f12c270e1f23c9cf58d6629519720a to your computer and use it in GitHub Desktop.
Save topshed/93f12c270e1f23c9cf58d6629519720a to your computer and use it in GitHub Desktop.
Raspbian bash script for wifi network switching if Internet drops
#!/bin/bash
# Checks for Internet connectivity and changes to an alternative wifi network if
# it detects a problem.
# Needs to have a wpa_supplicant file for each network:
#  wpa_supplicant_1 for SSID! and wpa_supplicant_2 for SSID2
# Can easily be extended to more than 2 possible networks

# function to bring down wireless interface, stop wpa_supplicant service and
# then bring up wlan0 again
reset_wifi(){
    /sbin/ifconfig wlan0 down
    sleep 1
    killall wpa_supplicant
    sleep 1
    /sbin/ifconfig wlan0 up
    sleep 1
}
# Logging information saved to a file
# useful for testing and debugging
echo "START" >> /home/pi/wifi.log
echo "Date:" `date`  >> /home/pi/wifi.log
echo "WLAN:" `/sbin/iwgetid` >> /home/pi/wifi.log
if /sbin/iwgetid | grep SSID1 > /dev/null; then
  echo "SSID1" >> /home/pi/wifi.log
  SSID="SSID1"
elif /sbin/iwgetid | grep SSID2 > /dev/null; then
  echo "SSID2"
  echo "SSID2" >> /home/pi/wifi.log
  SSID="SSID2"
else
  echo "unknown SSID"
  echo "unknown SSID" >> /home/pi/wifi.log
  SSID="UN"
fi
echo "$SSID" >> /home/pi/wifi.log
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
  echo "Net is up"
  echo "Net is up" >> /home/pi/wifi.log
else
  if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
    echo "Net is up (after retry)"
    echo "Net is up (after retry)" >> /home/pi/wifi.log
  else
    echo "Net is down (after retry)"
    echo "Net is down (after retry)" >> /home/pi/wifi.log
    if [ "$SSID" = "SSID1" ]; then
      echo "trying SSID2"
      echo "trying SSID2"  >> /home/pi/wifi.log
      reset_wifi
      cp /etc/wpa_supplicant/wpa_supplicant_2.conf /etc/wpa_supplicant/wpa_supplicant.conf
      /sbin/wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0

  elif [ "$SSID" = "SSID2" ]; then
      echo "trying SSID1"
      echo "trying SSID1"  >> /home/pi/wifi.log
      reset_wifi
      cp /etc/wpa_supplicant/wpa_supplicant_1.conf /etc/wpa_supplicant/wpa_supplicant.conf
      /sbin/wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0
    else
      echo "dunno"  >> /home/pi/wifi.log
      echo "dunno"
      if [ `date +%M` = 10 ] || [ `date +%M` = 30 ] || [ `date +%M` = 50 ] ; then
         echo "yep"
         echo "trying SSID1 anyway"
         echo "trying SSID1 anayway"  >> /home/pi/wifi.log
         reset_wifi
         cp /etc/wpa_supplicant/wpa_supplicant_1.conf /etc/wpa_supplicant/wpa_supplicant.conf
         /sbin/wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0
      else
         echo "trying SSID2 anyway"
         echo "trying SSID2 anyway"  >> /home/pi/wifi.log
         reset_wifi
         cp /etc/wpa_supplicant/wpa_supplicant_2.conf /etc/wpa_supplicant/wpa_supplicant.conf
         /sbin/wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0
      fi
    fi
  fi
fi
echo "END" >> /home/pi/wifi.log
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment