Do you allow this site to use Cookies?

A script to allow the Raspberry Pi to connect to a know wifi router or automatically generate an Internet Hotspot Access Point if no network is found. You can then use SSH or VNC on the move and switch between the hotspot and network without a reboot.

 

Works with Raspbian Buster, Stretch and Jessie.

When i am home I like to have my Raspberry Pi connected to the home network and the internet but when I am out I would like to connect to it via a hotspot using a tablet, phone or laptop. Usually this means when you are out you can't use your Raspberry Pi. The alternative is set it up as an access point so you can connect to it while you are out but when you are home you have to connect it to you routers ethernet port to use it on your home network.

I wanted a Raspberry Pi that connects to my home networks Wifi when I am at home or generates a wifi Hotspot/Access Point when I am out.

I have done this in a previous script but, for my use, when it is in Hotspot mode it was not able to use the internet if you connect an ethernet cable. Which was fine for me but some users required this feature. So this article is how to setup a Raspberry Pi so it can automatically switch between a network wifi connection and an internet routed hotspot.

If you are using a Raspbery Pi Zero w that has no network port and don't need an internet routed Access Point then you can use the other Hotspot switch script Raspberry Pi - Auto WiFi Hotspot Switch - Direct Connection

If you would just like a permanent hotspot then you can use this guide Raspberry Pi - Hotspot/Access Point dhcpcd method

Aim:

  • When you're home:   On starting the Raspberry Pi it connects to your home routers wifi
  • When you're out: On starting, if any known wifi connection is not found it will generate a hotspot so a direct wifi connection can be made to the Raspberry Pi by a tablet, phone or laptop.
  • While in Hotspot mode:  if an ethernet cable is connected the Raspberry Pi, then it will have internet access along with any wifi device connected to the Hotspot.

Additional Features:

Using a Cron, a timer can be setup so the wifi connection can be regulary checked. It will switch between a wifi router and a hotspot without a reboot depending on the results. This is useful for

  • Raspberry Pi in car entertainment systems
  • Raspberry Pi Dash Cams
  • If the RPi looses wifi connection in your garden or near your home when using the camera or sensors.
  • You run a script or program at home connected to your router and wish to monitor it while you are out. As a hotspot is generated without a reboot the script/program is not interuppted.

It is also possible to run the script from a GPIO button so you can manually run the script to switch depending on where you are.

 

 Requirements:

This has been tested on Raspbian Buster, Stretch and Jessie. To see which version you have enter the command lsb_release -a

  • Raspberry Pi 3, RPi 3 B+, RPi4
  • Raspberry Pi 1 or 2 with a Wifi Dongle*,
  • Raspberry Pi Zero W and Zero with WiFi Dongle* (internet hotspot not useable as it has no ethernet port. I suggest you use the non internet version of the script Raspberry Pi - Auto WiFi Hotspot Switch - Direct Connection
  • Wifi already configured for your home router

*some WiFi dongles don't work in adhoc mode or don't work with with the nl80211 driver used in this guide for RPi4, RPi 3, RPi 3B+ & Pi Zero W inbuilt wifi, so you may want to check this first before starting.

This setup has been tested on Raspbian Jessie, Raspbian Stretch and Raspbian Buster using a RPi4, RPi3B+, RPi3, Pi Zero W and a RPI 2 . A connection has been made to the Hotspot using an Android Tablet, Ipad2, Raspberry PI and Windows 10. All worked fine with SSH.

Note:

Dnsmasq bug: in versions below 2.77 on Stretch and Jessie, there is a bug that may cause the hotspot not to start for some users. This can be resolved by removing the dns-root-data. It may be benificial to do this before you start the rest of the installation as it has been reported that doing it after installation for effected users does not work but you won't know if it is an issue until after the installation is complete.

check your version with : dpkg -s dnsmasq

versions 2.77 and above are ok. If not then try the command:

sudo apt-get purge dns-root-data

thanks to danny for highlighting this.

 

Note about Raspbian Buster and Stretch Network Device Names

For Raspbian Buster and Stretch there has been changes to how the network drivers are named, called Predictable Network Interface Names,  and may be different for the usual wlan0 and wlan1 for wifi and eth0 for ethernet connections. Though the official Foundation version of Raspbian seems to be keeping to the old standard names, at least at the time of writing,  this may not always be the case. For this guide I will use wlan0 as the device that is used.  

To check the device name for your setup enter the commmand iw dev and take a note of the "Interface" name. For wifi it should start with wl , replace your device name with any reference to wlan0 in the article, scripts and config files.

 

Step 1:

To start with hostapd hotspot client and dnsmasq lightweight dns server need to be installed.

Open a Terminal session.

Update Raspbian with the latest updates by entering the commands:

sudo apt-get update
sudo apt-get upgrade

 To install hostapd enter the command:

sudo apt-get install hostapd

enter Y when prompted.

To install dnsmasq enter the command:

sudo apt-get install dnsmasq

enter Y when prompted

The installers will have set up the programme so they run when the pi is started. For this setup they only need to be started if the home router is not found. So automatic startup needs to be disabled and by default hostapd is masked so needs to be unmasked. This is done with the following commands:

sudo systemctl unmask hostapd

sudo systemctl disable hostapd
sudo systemctl disable dnsmasq

Now the hostspot configuration file can be setup. This contains the name of the WiFi signal you will need to connect to (SSID) and the security password.

To edit the configuration files I will be using the nano text editor but if you prefer an editor with an point and click interface then replace nano with leafpad in the following instructions.

Hostapd Configuration

Using a text editor edit the hostapd configuration file. This file won't exist at this stage so will be blank. (Download here)

sudo nano /etc/hostapd/hostapd.conf


#2.4GHz setup wifi 80211 b,g,n
interface=wlan0
driver=nl80211
ssid=RPiHotspotN
hw_mode=g
channel=8
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP

#80211n - Change GB to your WiFi country code
country_code=GB
ieee80211n=1
ieee80211d=1
 
  • The interface will be wlan0
  • The driver nl80211 works with the Raspberry RPi 4, RPi 3B+, RPi 3 & Pi Zero W onboard WiFi but you will need to check that your wifi dongle is compatable and can use Access Point mode.

For more information on wifi dongles see elinux.org/RPi_USB_Wi-Fi_Adapters

  • The SSID is the name of the WiFi signal broadcast from the RPi, which you will connect to with your Tablet or phones WiFi settings.
  • Channel can be set between 1 and 13. If you are having trouble connection because of to many wifi signals in your area are using channel 8 then try another channel.
  • Wpa_passphrase is the password you will need to enter when you first connect a device to your Raspberry Pi's hotspot. This should be at least 8 characters and a bit more difficult to guess than my example.
  • The country_code should be set to your country to comply with local RF laws. You may experience connection issues if this is not correct. Your country_code can be found in /etc/wpa_supplicant/wpa_supplicant.conf or in Raspberry Pi Configuration - Localisation settings

To save the config file press ctrl & o and to exit nano press Ctrl & x

Now the defaults file needs to be updated to point to where the config file is stored.
In terminal enter the command
sudo nano /etc/default/hostapd

Change:
#DAEMON_CONF=""
to
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Check the DAEMON_OPTS="" is preceded by a #, so is #DAEMON_OPTS=""

And save.

DNSmasq configuration

Next dnsmasq needs to be configured to allow the Rpi to act as a router and issue ip addresses. Open the dnsmasq.conf file with

sudo nano /etc/dnsmasq.conf

Go to the bottom of the file and add the following lines (download here)


#AutoHotspot config
interface=wlan0
bind-dynamic 
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.50.150,192.168.50.200,255.255.255.0,12h

and the save (ctl & o) and exit (ctrl & x)

Step 2:

Now that hostapd and dnsmasq are configured we now need to make some changes to the interfaces file, setup ip_forwarding, dhcpcd.conf and create a service. Once these are done we can then add the autohotspot script.

The interfaces file is not required and should be empty of any network config. Depending which version of Raspbian you have this file may still contain network config.

Enter

sudo nano /etc/network/interfaces

If your file shows more than the standard top 5 lines like this


# interfaces(5) file used by ifup(8) and ifdown(8)
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

then make a copy of of your file and then remove any excess lines from the interfaces file.

To make a backup of your interfaces file use the command

sudo cp /etc/network/interfaces /etc/network/interfaces-backup

 ip forwarding

While the RPi is in hotspot mode ip forwarding needs to be on so the internet works when an ethernet cable is attached. The autohotspot script will switch ip forwarding on and off between network mode and hotspot mode but it needs to be on by default for the script to manage ip forwarding.

enter

sudo nano /etc/sysctl.conf

look for the line

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

and remove the # so it is

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

now save (ctrl & o) and exit (ctrl & x)

DHCPCD

dhcpcd is the software that manages the network setup. The next step is to stop dhcpcd from starting the wifi network so the autohotspot script in the next step takes control of that. Ethernet will still be managed by dhcpcd.

Open dhcpcd.conf with the command

sudo nano /etc/dhcpcd.conf

at the bottom of the file enter the line

nohook wpa_supplicant

now save (ctrl & o) and exit (ctrl & x)

 

autohotspot service file

Next we have to create a service which will run the autohotspot script when the Raspberry Pi starts up.

create a new file with the command

sudo nano /etc/systemd/system/autohotspot.service

Then enter the following text or download here


[Unit]
Description=Automatically generates an internet Hotspot when a valid ssid is not in range
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/autohotspotN
[Install]
WantedBy=multi-user.target

and save (ctrl & o) and exit (ctrl & x)

 

For the service to work it has to be enabled. To do this enter the command

sudo systemctl enable autohotspot.service

 

AutoHotspot Script

This is the main script that will manage your wifi connections between a wifi router and an Access Point.

It will search for any wifi connection that is setup on you Raspberry Pi by using the details found in /etc/wpa_supplicant/wpa_supplicant.conf

If no wifi signal is found for a known SSID then the script will shutdown the wifi network setup and create a Hotspot. If an ethernet cable that allows internet access is connect then the Hotspot will become a full internet access point. Allowing all connected devices to use the Internet. Without an ethernet connect the Raspberry Pi can be accessed from a wifi device using SSH or VNC.

 The script works with SSID's that contain spaces and by entering your routers MAC address it can be used with hidden SSID's.

Hidden SSIDs

If your routers SSID is not broadcast/hidden then find this section in the script

#Enter the Routers Mac Addresses for hidden SSIDs, seperated by spaces ie
#( '11:22:33:44:55:66' 'aa:bb:cc:dd:ee:ff' )
mac=()

and enter you routers MAC address in the brackets of mac=() as shown in the example. Make sure mutiple MAC addresses are seperated by a space.

 

 Creating the autohotspot script:

Create a new file with the command

sudo nano /usr/bin/autohotspotN

and add the autohotspot script. This can be downloaded from here

If you are using the linux firewall, firewalld then the ip tables in the script will cause issue but the required modifications are later in this guide.

 

 


#!/bin/bash
#version 0.95-41-N/HS-I

#You may share this script on the condition a reference to RaspberryConnect.com 
#must be included in copies or derivatives of this script. 

#Network Wifi & Hotspot with Internet
#A script to switch between a wifi network and an Internet routed Hotspot
#A Raspberry Pi with a network port required for Internet in hotspot mode.
#Works at startup or with a seperate timer or manually without a reboot
#Other setup required find out more at
#http://www.raspberryconnect.com

wifidev="wlan0" #device name to use. Default is wlan0.
ethdev="eth0" #Ethernet port to use with IP tables
#use the command: iw dev ,to see wifi interface name 

IFSdef=$IFS
cnt=0
#These four lines capture the wifi networks the RPi is setup to use
wpassid=$(awk '/ssid="/{ print $0 }' /etc/wpa_supplicant/wpa_supplicant.conf | awk -F'ssid=' '{ print $2 }' ORS=',' | sed 's/\"/''/g' | sed 's/,$//')
IFS=","
ssids=($wpassid)
IFS=$IFSdef #reset back to defaults


#Note:If you only want to check for certain SSIDs
#Remove the # in in front of ssids=('mySSID1'.... below and put a # infront of all four lines above
# separated by a space, eg ('mySSID1' 'mySSID2')
#ssids=('mySSID1' 'mySSID2' 'mySSID3')

#Enter the Routers Mac Addresses for hidden SSIDs, seperated by spaces ie 
#( '11:22:33:44:55:66' 'aa:bb:cc:dd:ee:ff' ) 
mac=()

ssidsmac=("${ssids[@]}" "${mac[@]}") #combines ssid and MAC for checking

createAdHocNetwork()
{
    echo "Creating Hotspot"
    ip link set dev "$wifidev" down
    ip a add 192.168.50.5/24 brd + dev "$wifidev"
    ip link set dev "$wifidev" up
    dhcpcd -k "$wifidev" >/dev/null 2>&1
    iptables -t nat -A POSTROUTING -o "$ethdev" -j MASQUERADE
    iptables -A FORWARD -i "$ethdev" -o "$wifidev" -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i "$wifidev" -o "$ethdev" -j ACCEPT
    systemctl start dnsmasq
    systemctl start hostapd
    echo 1 > /proc/sys/net/ipv4/ip_forward
}

KillHotspot()
{
    echo "Shutting Down Hotspot"
    ip link set dev "$wifidev" down
    systemctl stop hostapd
    systemctl stop dnsmasq
    iptables -D FORWARD -i "$ethdev" -o "$wifidev" -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -D FORWARD -i "$wifidev" -o "$ethdev" -j ACCEPT
    echo 0 > /proc/sys/net/ipv4/ip_forward
    ip addr flush dev "$wifidev"
    ip link set dev "$wifidev" up
    dhcpcd  -n "$wifidev" >/dev/null 2>&1
}

ChkWifiUp()
{
	echo "Checking WiFi connection ok"
        sleep 20 #give time for connection to be completed to router
	if ! wpa_cli -i "$wifidev" status | grep 'ip_address' >/dev/null 2>&1
        then #Failed to connect to wifi (check your wifi settings, password etc)
	       echo 'Wifi failed to connect, falling back to Hotspot.'
               wpa_cli terminate "$wifidev" >/dev/null 2>&1
	       createAdHocNetwork
	fi
}


FindSSID()
{
#Check to see what SSID's and MAC addresses are in range
ssidChk=('NoSSid')
i=0; j=0
until [ $i -eq 1 ] #wait for wifi if busy, usb wifi is slower.
do
        ssidreply=$((iw dev "$wifidev" scan ap-force | egrep "^BSS|SSID:") 2>&1) >/dev/null 2>&1 
        echo "SSid's in range: " $ssidreply
        echo "Device Available Check try " $j
        if (($j >= 10)); then #if busy 10 times goto hotspot
                 echo "Device busy or unavailable 10 times, going to Hotspot"
                 ssidreply=""
                 i=1
	elif echo "$ssidreply" | grep "No such device (-19)" >/dev/null 2>&1; then
                echo "No Device Reported, try " $j
		NoDevice
        elif echo "$ssidreply" | grep "Network is down (-100)" >/dev/null 2>&1 ; then
                echo "Network Not available, trying again" $j
                j=$((j + 1))
                sleep 2
	elif echo "$ssidreply" | grep "Read-only file system (-30)" >/dev/null 2>&1 ; then
		echo "Temporary Read only file system, trying again"
		j=$((j + 1))
		sleep 2
	elif ! echo "$ssidreply" | grep "resource busy (-16)"  >/dev/null 2>&1 ; then
               echo "Device Available, checking SSid Results"
		i=1
	else #see if device not busy in 2 seconds
                echo "Device unavailable checking again, try " $j
		j=$((j + 1))
		sleep 2
	fi
done

for ssid in "${ssidsmac[@]}"
do
     if (echo "$ssidreply" | grep "$ssid") >/dev/null 2>&1
     then
	      #Valid SSid found, passing to script
              echo "Valid SSID Detected, assesing Wifi status"
              ssidChk=$ssid
              return 0
      else
	      #No Network found, NoSSid issued"
              echo "No SSid found, assessing WiFi status"
              ssidChk='NoSSid'
     fi
done
}

NoDevice()
{
	#if no wifi device,ie usb wifi removed, activate wifi so when it is
	#reconnected wifi to a router will be available
	echo "No wifi device connected"
	wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1
	exit 1
}

FindSSID

#Create Hotspot or connect to valid wifi networks
if [ "$ssidChk" != "NoSSid" ] 
then
       echo 0 > /proc/sys/net/ipv4/ip_forward #deactivate ip forwarding
       if systemctl status hostapd | grep "(running)" >/dev/null 2>&1
       then #hotspot running and ssid in range
              KillHotspot
              echo "Hotspot Deactivated, Bringing Wifi Up"
              wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1
              ChkWifiUp
       elif { wpa_cli -i "$wifidev" status | grep 'ip_address'; } >/dev/null 2>&1
       then #Already connected
              echo "Wifi already connected to a network"
       else #ssid exists and no hotspot running connect to wifi network
              echo "Connecting to the WiFi Network"
              wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1
              ChkWifiUp
       fi
else #ssid or MAC address not in range
       if systemctl status hostapd | grep "(running)" >/dev/null 2>&1
       then
              echo "Hostspot already active"
       elif { wpa_cli status | grep "$wifidev"; } >/dev/null 2>&1
       then
              echo "Cleaning wifi files and Activating Hotspot"
              wpa_cli terminate >/dev/null 2>&1
              ip addr flush "$wifidev"
              ip link set dev "$wifidev" down
              rm -r /var/run/wpa_supplicant >/dev/null 2>&1
              createAdHocNetwork
       else #"No SSID, activating Hotspot"
              createAdHocNetwork
       fi
fi

and save (ctl & o) and exit (ctl & x)

 

For the autohotspotN script to work it needs to be executable. This is done with the command

sudo chmod +x /usr/bin/autohotspotN

Thats it, you are ready to go. Now test that everything is working ok.

Thanks to Willem Me and Tino for there contributions to the development of this script.

Firewalld: 

if you are using the firewall firewalld then you will need to replace the hotspot activation and deactivation functions so it works ok with the firewall.  In the autohotspotN script locate the createAdHocNetwork() section and the KillHotspot() funtion and replace it with this code


createAdHocNetwork()
{
    ip link set dev "$wifidev" down
    ip a add 192.168.50.5/24 brd + dev "$wifidev"
    ip link set dev "$wifidev" up
    dhcpcd -k "$wifidev" >/dev/null 2>&1
    firewall-cmd --direct -add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
    firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o "$wifidev" -m state --state RELATED,ESTABLISHED -j ACCEPT
    firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i "$wifidev" -o eth0 -j ACCEPT
    systemctl start dnsmasq
    systemctl start hostapd
    echo 1 > /proc/sys/net/ipv4/ip_forward
}

KillHotspot()
{
    echo "Shutting Down Hotspot"
    ip link set dev "$wifidev" down
    systemctl stop hostapd
    systemctl stop dnsmasq
    firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
    firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i eth0 -o "$wifidev" -m state --state RELATED,ESTABLISHED -j ACCEPT
    firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i "$wifidev" -o eth0 -j ACCEPT
    echo 0 > /proc/sys/net/ipv4/ip_forward
    ip addr flush dev "$wifidev"
    ip link set dev "$wifidev" up
    dhcpcd  -n "$wifidev" >/dev/null 2>&1
}

 Thank you to Z-WolF for supplying this update.

Testing the Hotspot

To test that the RPi is setup ok reboot the RPI. When the desktop returns you should have the wifi icon wif by the clock.
For those setting this up on a headerless RPi then you should see the pi on your routers network. 

To test the hotspot works ok edit the ssid name of your router in the wpa_supplicant file.

enter

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

and add 'off' to the end of your routers ssid. For example:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB
network={ ssid="mySSID1" psk="myPassword" key_mgmt=WPA-PSK }

change to

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB
network={ ssid="mySSID1off" psk="myPassword" key_mgmt=WPA-PSK }

save (ctrl & o) and close (ctrl & x) the file

Now reboot the Raspberry Pi.

Once the RPi is up and running the wifi icon near the clock should now be a red cross networkdown This means it is an access point, it could also mean your network is down but other devices should detect the hotspot. On a Tablet, phone or Laptop scan for wifi signals. You should see one for RPiHotN.

Select this as the wifi signal to connect to. The password is what you setup in the hostapd.conf file. From my example it is 1234567890

rpiHotspot android

Local wifi signals in range on Android

For SSH and VNC the connection ip is 192.168.50.5 also if you have setup the Rpi as a webserver use the same ip to see the webpage.

For ssh use ssh This email address is being protected from spambots. You need JavaScript enabled to view it..5

For vnc use 192.168.50.5::5900

If you now connect an ethernet cable to the Raspbery Pi and your router and wait a few seconds the hotspot will allow connected wifi devices to use the internet as well as the RPi.

 Once you are happy the setup is working ok change the wpa_supplicant.conf file back to your routers ssid. From the next reboot the autohotspotN script will manage your wifi connection.

 

If you find this guide useful and wish to show your appreciation then you are welcome to make a donation or share a link to this article. There is no obligation to do so, this guide is free for use and support is available to everybody as long as I know the answer :)

RaspberryConnect.com

 

Setting up a Timer

If the autohotspotN script is set to be run at set intervals, when you go out of range of your home router it will automatically generate a hotspot and then when you get back in range it will deactivate the hotspot and connect to the routers wifi. If you run a program in the background or use programs like tmux then any software you are running will keep working.

If you have an active ssh or vnc session running when the switch happens it will be lost.

Using a Cron job, tasks can be set off automatically at certain times, dates or intervals. For my use running the script every 5 minutes is fine but this can be changed to your needs. To setup a cron task enter the command

crontab -e

At the bottom of the file enter the command

*/5 * * * * sudo /usr/bin/autohotspotN >/dev/null 2>&1

There is a space after each entry and * except the first *.

The first * position is for minutes. If you want it to check every minute just use * instead of */5

If you want to use hours, say every 2 hours enter it as

* */2 * * * sudo /usr/bin/autohotspotN >/dev/null 2>&1

 Save the cron tab with ctrl & o and close it with ctrl & x

The cron job will automatically start straight away.

Note on Permissions:

by default the pi user does not need to enter a password to use the sudo command. If you are not using the default pi user and while doing this guide you have had to enter a password every time sudo is needed then you will find the the cron job will not work as it wont have permission to run the autohotspotN script.

To fix this you can give the user permission to run the script without a password.
Enter the command

sudo visudo

enter your password
at the bottom of the file add the following line, where username is the user that will be using the script:

username ALL= NOPASSWD: /usr/bin/autohotspotN

Now you will be able to run the script with sudo with the cron.

Thanks to Jim for pointing this out as an issue for some users.

 

If you are not using the default PI user and you are still have issues then check your default Paths from CRON for your user. It will need /sbin/ for iw.

Adding the path line to the cron will tell it were to look, PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Thanks to Atanas Atanasov for highligting this for non PI users

 

Disable Cron Timer

If you no longer need the timer running edit the cron with

crontab -e

and put a # infront so it is now

#*/5 * * * * sudo /usr/bin/autohotspot

The script will now only work at boot up or if you manually run the autohotspotN script with the command

sudo /usr/bin/autohotspotN

 

Script Removal

If you don't wish to continue using the autohotspotN script then the Raspberry Pi can be revered back to a standard wifi setup with the following steps.

Disable the script with the command

sudo systemctl disable autohotspot

Then disable ip forwarding

sudo nano /etc/sysctl.conf

look for the entry

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

and add a # as follows

# Uncomment the next line to enable packet forwarding for IPv4
# net.ipv4.ip_forward=1

In the /etc/dhcpcd.conf file remove the line that was added

nohook wpa_supplicant

If you had previous config in your /etc/network/interfaces file and made a backup you can restore your original interfaces file with the command

sudo mv /etc/network/interfaces-backup /etc/network/interfaces

Then reboot

The autohotspotN script will no longer have control of your wifi. Dnsmasq and hostapd can be uninstalled if you no longer need them.

 Trouble Shooting

  • If you get no wifi connection or no hotspot then it is most likley the autohotspotN script is not executable or the service has not been enabled

redo the follow commands

sudo chmod +x /usr/bin/autohotspotN

 

sudo systemctl enable autohotspot.service

 

  • You are in range of your router but it only creates a hotspot. If there is an issue with connecting to the router, such as the password is wrong. The script will fall back to the hotspot so you still have some type of connection. Check your password in the wpa_supplicant.conf file. 
  • You can connect to the hotspot via an Android Phone but you can't get a ssh connection. Some users have found this issue where Android uses there data connection rather than the wifi. Disabeling data has allowed them to use ssh.   
  • If this setup is not working as expected you can check the script for errors by running it manually in a terminal window with the command, sudo /usr/bin/autohotspotN ,you can also check the service status with, sudo systemctl status -l autohotspot ,and if the hotspot has failed try, sudo systemctl status -l hostapd
  • You need to add a new wifi network to the RPi but it is in Hotspot mode so you are unable to scan for new wifi signals. You will need to add the new network to /etc/wpa_supplicant/wpa_supplicant manually. Enter the following details replacing mySSID and myPassword with the correct details. If your router has a hidden SSID/not Broadcast then include the line;  scan_ssid=1
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={ ssid="mySSID1" psk="myPassword" key_mgmt=WPA-PSK }

 

 


Add comment


Comments  
# Jakabya 2019-09-23 21:25
So I finished following the set up, and everything works amazing. I can access the pi with a laptop and get on the network. Then I tried to use x11 forwarding on the ash and it wasn't working. I tried ssh -X and then starting the x server and I also tried just ssh -X. Neither worked. The x11 doesn't work over this. Funny thing is that before it was running on the hotspot, and if I switch it to the wifi, then the x11 works, any ideas?
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-23 22:36
Hi Jakabya
I have just tested this with a Pi on Raspbian Buster in Hotspot mode. From an Ubuntu Desktop PC I connected using ssh -X .5 and then loaded leafpad through ssh and got the window to appear on the PC. So it is working with my setup.
Have you checked if vnc is working as a test?
Reply | Reply with quote | Quote | Report to administrator
# Steven 2019-09-21 22:25
So I finished the tutorial, and it should work, but doesn't. Yes the file is executable, I tried running it, I check to see if dnsmasq is running and if hostapd is running, they both are. I checked the ip for the wlan0 and it is the changed up, so I have no idea what it could be, everything seems to be working on the pi, but on my phone and laptop, no WiFi hotspot. I don't know what it could be. Using rpi3 w/ raspberrian
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-21 23:47
Hello Steven

If you don't see the RpiHotspotN SSID on other devices then the issue is most likely with hostapd.
If everything looks fine on the PI, did you change the password in the /etc/hostapd/hostapd.conf file?
if so double check it has at least 8 characters.

Hostapd fails if the config file is not complete at /etc/hostapd/hostapd.conf also if the /etc/default/hostapd file does not have the path to the hostapd.conf file correctly or the password is too short.

I take it when your router is on the Pi connects to the router wifi fine it's just when it goes to the hotspot you can't find the RpiHotspotN ssid on other devices?

If this doesn't help, if you run hostapd manually you can get further feedback.
Let the pi generate the hotspot then stop hostapd with
sudo systemctl stop hostapd
then run it manually with
sudo hostapd -d /etc/hostapd/hostapd.conf

It will give you more details about what is going and any issues.

Please email me any errors you have from any of the sudo systemctl status hostapd and for autohotspot and I will look into it for you. admin at this site

Roboberry
Reply | Reply with quote | Quote | Report to administrator
# Steven 2019-09-22 02:36
Ok, so I had it working kind of. So what I had to do to get it to display the SSID on other divices was get rid of the line in /etc/hostapd/hostapd.conf that specifies the driver. The only problem with that is that now my other devices can see the SSID but can not connect to it. I am typing in the passkey right and it just times out. I am using a raspberry pi 3 b and I was wondering if specifying the correct driver would fix this. When I had the one in that you specified it gave me an error in line 2: invalid/unknow driver then the driver name. I can not seem to find the name of the driver the raspberry pi 3 b. Any help would be great
Reply | Reply with quote | Quote | Report to administrator
# roboberry 2019-09-22 10:46
Hi Steven
Hostapd will show errors for the driver if the driver is stated or not, but it i the one used by all PI's with wifi built in. The driver is in the Linux core and is what this version of hostapd uses. So as long as you are using the PI3's wifi then the driver setup is fine. Some external usb wifi dongles use a different wifi chipset and so have to use a modified version of hostapd but for the PI the standard one is the only one that works.

I have played with the config to reproduce your issue.
If hostapd is still enabled then it will start before the hotspot and cause a bad configuration. You will see that hostapd is running fine in sudo systemctl status hostapd. The RpiHotspotN ssid exists but no device can connect. On the pi the ip for wlan0 will not be 192.168.50.5
to fix: sudo systemctl disable hostapd

In /etc/default/hostapd if the bottom line of DAEMON_OPTS="" has no # and has an entry after =, this will cause no SSID to be issued but hostapd is running.

Also if Hostapd is masked it will not run at all so there will be no SSID generated.

I feel there is another issue with hostapd rather than the driver as it doesn't need to be stated in the config for the Pi's. It's there for usb wifi.

Did you create hostapd.conf from the download link or copy the details from the webpage? if the webpage can you delete hostapd.conf and then redo it copying the text from the download above that section in the article.

Can you send me the output of sudo systemctl status hostapd when the hotspot is running.
Does wlan0 have ip 192.168.50.5 and is it the only ip for wlan0?

Does the autohotspotN script conect to your router fine. Any further details would be useful.

Thanks
Reply | Reply with quote | Quote | Report to administrator
# Steven 2019-09-22 15:51
I found the proper driver for the wifi, put it in the code, and it works, kind of. It works well enough that my phone can connect to it, but my laptop can not connect to if for some reason, when I manually run hostapd and then try to connect, the laptop will connect, then disconnect over and over again. This will continue for almost forever until I tell the laptop to stop or the hostapd to stop. Any ideas?
Reply | Reply with quote | Quote | Report to administrator
# roboberry 2019-09-22 16:54
Hi Steven
Can you give me details of what driver you have installed please. I don't know why you need anything other than the default pi setup. I have used hostapd on all wifi pi's across that last 4 versions of the Raspbian OS without needing to install additional drivers.
Your laptop is failing because it is receiving wifi coms from the pi it doesn't understand. I have had the same in the past which is due to a config issue.Both dnsmasq and dhcpcd trying to control the wifi.

I will need more info about your setup, could you send me the info requested in the previous reply please as this will help me understand what your pi is doing.
Your new issue can be related to dhcpcd still running on wlan0. Can you confirm you only have the hotspot ip showig and not two ip addresses.

Can you also let me know if you copied the files from the webpage or from the download links. Are you viewing the website on the pi during the setup? Have any files been opened and saved on a windows machine?
Reply | Reply with quote | Quote | Report to administrator
# Steven 2019-09-22 18:28
About the drivers, I had a typo in there, sorry. There is only one ip address, and i hand coppied it, ik not the most efficient. wlan0 has ip of 10.0.0.5 in ifconfig.

As for the rest of the info...

First I run sudo /usr/bin/autohotspot
just to make sure that the hotspot is running

then I run sudo systemctl status hostapd
I get back the following:

loaded:loaded (/etc/init.d/hostapd)
active: active (running) since sun 2019-09-22
CGroup: /system.slice/hostapd.service
1452 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf


Sep 22 08:04:30 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f IEEE 802.11: disassociated
Sep 22 08:04:31 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f IEEE 802.11: associated
Sep 22 08:04:31 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f RADIUS: starting acount session 5D8729C4-00000005
Sep 22 08:04:34 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f WPA: pairwise key handshake completed (RSN)

Sep 22 08:04:35 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f IEEE 802.11: disassociated
Sep 22 08:04:35 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f IEEE 802.11: associated
Sep 22 08:04:35 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f RADIUS: starting acount session 5D8729C4-00000005
Sep 22 08:04:35 Jakabya hostapd[1452] : wlan0: STA 9c:b7:0d:0a:32:2f WPA: pairwise key handshake completed (RSN)
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-22 19:19
Hi Steven

Thanks for the info. The disassociated and associated lines show that there is a connection issue in hostapd.

The IP of 10.0.0.5 is for the direct hotspot designed for the pi zero, but this comment is posted on the internet enabled hotspot for Pi 1,2,3 & PI4 which has an ip of 192.168.50.5.

Can you check that in /etc/dnsmasq.conf the last line for dhcp-range matches dhcp-range=10.0.0.50,10.0.0.150,12h
and in the /usr/bin/autohotspot contains this section

createAdHocNetwork()
{
echo "Creating Hotspot"
ip link set dev "$wifidev" down
ip a add 10.0.0.5/24 brd + dev "$wifidev"
ip link set dev "$wifidev" up
dhcpcd -k "$wifidev" >/dev/null 2>&1
systemctl start dnsmasq
systemctl start hostapd
}

if the IP in the autohotspot script doesn't match the range on the dnsmasq.conf file then that will cause the issue if seeing the hotspot but not being able to connect to it. If you wanted the internet routed autohotspot then the ip should be 192.168.50.5

Let me know if you setup matches and which hotspot article has been installed.
Are you using Raspbian Buster or Stretch?
Reply | Reply with quote | Quote | Report to administrator
# Jason 2019-09-13 04:57
I have followed the instruction and everything works fine when testing. However, when rebooted and no wifi signal is present, the hotspot is created with a 169.x.x.x address instead of 192.168.50.5. Any idea why? I am running Buster on a Pi 3. Same results on a Pi 4. I never ran into this on Stretch. Thanks, Jason
Reply | Reply with quote | Quote | Report to administrator
# roboberry 2019-09-13 08:31
Hi Jason.
The 169 ip is generated when the dhcp server is not working correctly. For the hotspot dnsmasq is used over dhcpcd. dhcpcd is used for normal network wifi. I think dhcpcd is still running which should mean your wifi has two ip addresses. If you enter 'ip addr' in terminal do you see two ip addresses assigned to wlan0? one will be 192.168.50.5 created by the autohotspotN script and the 169.x.x.x number.

If so go into /etc/dhcpcd.conf and check the nohook wpa_supplicant line is correct. I have entered it as nohooks before which does cause this issue.

An earlier version of this script didn't stop dhcpcd from running during the hotspot which works fine unless you're using a streaming service that connects before the hotspot get generated. The stream fails when the hotspot starts so it's best to disable dhcpcd for wlan0 while the hotspot is working. dhcpcd is still used for ethernet. Let me know if you still have an issue.
Reply | Reply with quote | Quote | Report to administrator
# Jason 2019-09-13 13:20
When I run hostname -I, I have 2 ip addresses. One for my eth0 10.x.x.x, and the other is wlan0 169.x.x.x. So here is the interesting part......I reflashed the SD with Buster (July 19). Before I have done both apt-get update & upgrade before installing the hotspot and got the 169.x.x.x. address. This time, after the fresh install, I only ran sudo apt-get update and then installed the hotspot. All worked as expected. After running sudo apt-get upgrade, the hotspot is still working as it should. I suspect something has changed in the dhcpcd package that is causing the 169.x.x.x assignment if you run 'upgrade' before installing the hotspot. Jason
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-13 14:07
Hi Jason,
Interesting i will take a look and see what has changed. Thank you.
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-15 22:20
Hi Jason. I have reinstalled Buster then done a full update before setting up the hotspot. I also got the same issue of the 169 ip address. What seems to be happening is the service for dnsmasq was enabled even though I had disabled it during the hotspot setup.

This was causing the 169 ip as the hotspot was not able to generate it's IP as dnsmasq was running.
Once the dnsmasq service was disabled again it all worked correctly.

I then reinstalled a fresh Buster imgage again and redone the test and I had no issues at all and dnsmasq did not enable. So I can only presume an update has re-enabled it after the hotspot was setup even though a full update had been done before the hotspot setup.

One to keep an eye on. If your finding anything different in future setups please let me know.
Reply | Reply with quote | Quote | Report to administrator
# Jason 2019-09-17 02:13
Thanks for looking into it. Glad to know I am not going crazy. haha. After fresh install and upgrade, I installed the hotspot again. Again, got the 169 ip address. Ran 'sudo systemctl disable dnsmasq' thinking this would disable dnsmasq. After reboot, I still receive the 169 address. What am I missing or is this something that will need to be done after each boot? Thanks, Jason
Reply | Reply with quote | Quote | Report to administrator
# roboberry 2019-09-17 13:56
Hi Jason.
No there is nothing else to do on each reboot. That's the correct command to disable dnsmasq at boot. I had been fiddling around before I noticed the dnsmasq service was enabled so it could have been a result of something else as well.

With the 169 ip for the hotspot run sudo systemctl status dnsmasq
there should be a line essentially saying wlan0 was not found or unavailable. This is the core of the issue as dnsmasq was unable to configure wlan0.
I had stopped and started dnsmasq manually with sudo systemctl stop dnsmasq and then sudo systemctl start dnsmasq. Try stopping the service and disabling it then rebooting so it goes to hots spot.
If the Pi goes to wifi first and then switches to the hotspot without a reboot it all works fine.

Strange my first test failed as yours did but my second attempt went through fine. I will redo a fresh Buster SD tonight and see if I get the issue again.

The Hostapd service is masked when installed, though the service is not used and hostapd is started after dnsmasq I have unmasked it with sudo systemctl unmask hostapd. Worth a try.

I will get back to you with the results of the retest.
Reply | Reply with quote | Quote | Report to administrator
# Jason 2019-09-17 14:25
I think the difference is in our test method. I have no available WiFi's for the hotspot to connect to. After boot I stopped then disabled dnsmasq. Reboot. Still have 169 address. If I make a WiFi available and the hotspot connects and then run hotspot again with no wifi present, i get the correct ip address from the hotspot. So my question would be, is it possible to get the right ip from the hotspot on boot when no wifi signal is present? This always worked with stretch. I have tried playing with your script a bit to stop/disable dnsmasq in a few different places. All to no avail. Thanks, Jason
Reply | Reply with quote | Quote | Report to administrator
# roboberry 2019-09-17 15:07
For my tests I had a non valid SSID in wpa_supplicant.conf.
If there is no router then it will go to the hotspot as no SSID is returned. So having a false SSID in wpa_supplicant would work the same.

Does sudo systemctl status dnsmasq report that wlan0 is not available or similar message?

The hotspot script contains the 192.168.50.5 ip so when that runs it will be generated. If dnsmasq has failed for some reason then dnsmasq will generate its own ip starting with 169.

The fact it works after you connect to wifi and then go back to the hotspot shows the setup is working. Which is what I saw in the first test.

It's just booting to the hotspot failed because dnsmasq couldn't access wlan0.

Once I have tested again tonight and taken notes of every action then hopefully I can debug the situation.
For the last test I done I installed Buster, rebooted. apt update, apt upgraded, rebooted, then apt updated and apt upgraded as there was some more, the apt autoremove.

Then followed my guide from the website and all was fine. The first time I didn't do the second update. But I will see ehat happens tonight.
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-17 20:40
I have redone the setup starting from scratch on a PI4, downloaded the Raspbian Buster with Desktop from the Pi foundations website.
Setup through Ethernet, entered wifi details at prompt. Let the setup wizard do an update.
Checked with apt update and Upgrade that it was fully up to date.
Once that ended I edited wpa_supplicant to a false ssid and rebooted for the first time.
Still on Ethernet I installed the hotspot from this page. I used the download links and copied the text and pasted it into the files using nano, or to the bottom of config files where applicable.

Once complete I rebooted and it went straight to a working hotspot with the 192.168.50.5 ip.

I have since enabled the dnsmasq service and rebooted, it worked fine as a hotspot.

So unfortunately I have not been able to reproduce the issue. I can only suggest uninstalling dnsmasq, sudo apt purge dnsmasq
then reinstall it, don't purge dns-root-data if you previously done that. Disable the dnsmasq service and setup the config and see if that solves the issue.

Happy to look at your config files or an SD image if you wish. If you can send me the output of
sudo systemctl status hostapd, sudo systemctl status dnsmasq, sudo systemctl status autohotspot, sudo systemctl status dhcpcd
I see if anything stands out.
Reply | Reply with quote | Quote | Report to administrator
# Paul 2019-09-04 19:42
Think you can do a sudo crontab -e to set up a root crontab which does not then require you use sudo in the crontab command as it is run as root, which enables you to lock down sudo with a password, instead of using sudo in the pi (or other) users crontab command which requires the lax sudo password

also noticed the iw scan does not always return the full list of access points in any given number of runs, I am in a busy wifi area here

otherwise, excellent! Thanks!
Reply | Reply with quote | Quote | Report to administrator
# Paul W. Rogers 2019-09-04 22:37
added one extra condition as first elif in chain to deal with nothing back from iw (which has happened quite frequently here)

elif [ -z "$ssidreply" ]; then
j=$((j + 1))
sleep 2
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-04 22:55
Hi Paul.
Do you mean that iw finds no wifi signals at all even if they are there, so you are making it check again?

If so then this may cause an issue for users out of town where there is no signals which they want it to go to a hotspot. Im not going to have access to my Pi's until next week so will have a closer look then, but thanks for the feedback. Any feed back is good as it has been created for my world so not situations others have.
Reply | Reply with quote | Quote | Report to administrator
# Roboberry 2019-09-04 22:22
Hi Paul, your welcome. You're right you can use the root cron as well. So you don't have to use sudo. Though you have to remember if your using root cron or use cron is i have had conflicts using different scripts but outhrerwise works as well.

Iw will only come back with the first strongest signals it gets in the time limits it has, so its possible the required signal is missed in a busy area. If you use the Mac address option and add your routers mac address even if it is not hidden, it will always be checked to see if it's available. Which should solve the issue in busy areas.
Reply | Reply with quote | Quote | Report to administrator