1+ #! /usr/bin/env bash
2+ # version 0.95-4-N/HS-I
3+ # heavily revised: 2019-05-04 by Baris Kurtlutepe
4+
5+ # You may share this script on the condition a reference to RaspberryConnect.com
6+ # must be included in copies or derivatives of this script.
7+
8+ # Network Wifi & Hotspot with Internet
9+ # A script to switch between a wifi network and an Internet routed Hotspot
10+ # A Raspberry Pi with a network port required for Internet in hotspot mode.
11+ # Works at startup or with a seperate timer or manually without a reboot
12+ # Other setup required find out more at
13+ # http://www.raspberryconnect.com
14+
15+ CreateHotSpot ()
16+ {
17+ echo " Killing wifi client"
18+ wpa_cli terminate ${WLAN_INTERFACE} > /dev/null 2>&1
19+ echo " Creating HotSpot"
20+ systemctl stop dnsmasq > /dev/null 2>&1
21+ systemctl stop hostapd > /dev/null 2>&1
22+ ifconfig ${WLAN_INTERFACE} down
23+ ifconfig ${WLAN_INTERFACE} up
24+ ip link set dev ${WLAN_INTERFACE} down
25+ ip a add 10.0.34.1/24 brd + dev ${WLAN_INTERFACE}
26+ ip link set dev ${WLAN_INTERFACE} up
27+ dhcpcd -k ${WLAN_INTERFACE} > /dev/null 2>&1
28+ systemctl start dnsmasq
29+ systemctl start hostapd
30+ }
31+
32+ KillHotSpot ()
33+ {
34+ echo " Shutting Down HotSpot"
35+ ip link set dev ${WLAN_INTERFACE} down
36+ ifconfig ${WLAN_INTERFACE} down
37+ ifconfig ${WLAN_INTERFACE} up
38+
39+ systemctl stop hostapd
40+ systemctl stop dnsmasq
41+ ip addr flush dev ${WLAN_INTERFACE}
42+ ip link set dev ${WLAN_INTERFACE} up
43+ dhcpcd -n ${WLAN_INTERFACE} > /dev/null 2>&1
44+ }
45+
46+ CreateWifiClient ()
47+ {
48+ echo " Starting WiFi connection"
49+ wpa_supplicant -B -i ${WLAN_INTERFACE} -c /etc/wpa_supplicant/wpa_supplicant.conf > /dev/null 2>&1
50+ echo " Waiting 20 seconds"
51+ sleep 20 # give time for connection to be completed to router
52+ }
53+
54+ IsWifiConnected ()
55+ {
56+ wpa_cli -i ${WLAN_INTERFACE} status | grep ' ip_address' > /dev/null 2>&1
57+ return $?
58+ }
59+
60+ areKnownNetworksNearBy ()
61+ {
62+ SSID_LIST=$( awk ' /ssid="/{ print $0 }' /etc/wpa_supplicant/wpa_supplicant.conf | awk -F' ssid=' ' { print $2 }' ORS=' ,' | sed ' s/\"/' ' /g' | sed ' s/,$//' )
63+ IFS=" ,"
64+
65+ SSID_REPLY=` iw dev " $wifidev " scan ap-force | egrep " ^BSS|SSID:" `
66+
67+ for SSID in ${SSID_LIST}
68+ do
69+ SSID_CLEAN=$( echo ${SSID} | tr -d ' \r' )
70+ if [[ -z ` echo ${SSID_REPLY} | grep ${SSID_CLEAN} ` ]]
71+ then
72+ return 1
73+ fi
74+ done
75+ return 0
76+ }
77+
78+ WLAN_INTERFACE=wlan0
79+ iw dev ${WLAN_INTERFACE} set power_save off
80+ ACTIVE_MODE=
81+
82+ while true ;
83+ do
84+ if [[ ${ACTIVE_MODE} eq " ap" ]]; then
85+ sleep 300
86+ if [[ areKnownNetworksNearBy ]]; then
87+ systemctl stop omnipy.service
88+ KillHotspot
89+ echo " Hotspot Deactivated, Bringing Wifi Up"
90+ CreateWifiClient
91+ if [[ ! IsWifiConnected ]]; then
92+ echo " Failed to connect to wifi, going back into hotspot mode"
93+ CreateHotSpot
94+ ACTIVE_MODE=" ap"
95+ else
96+ ACTIVE_MODE=" client"
97+ fi
98+ systemctl start omnipy.service
99+ fi
100+ elif [[ ${ACTIVE_MODE} eq " client" ]]; then
101+ sleep 60
102+ if [[ ! IsWifiConnected ]]; then
103+ systemctl stop omnipy.service
104+ echo " Wi-fi disconnected, retrying"
105+ CreateWifiClient
106+ if [[ ! IsWifiConnected ]]; then
107+ echo " No wi-fi connection, creating hot-spot"
108+ CreateHotSpot
109+ ACTIVE_MODE=" ap"
110+ else
111+ echo " Wi-fi connection re-established"
112+ fi
113+ systemctl start omnipy.service
114+ fi
115+ else
116+ if [[ areKnownNetworksNearBy ]]; then
117+ CreateWifiClient
118+ fi
119+
120+ if [[ ! IsWifiConnected ]]; then
121+ echo " No wi-fi connection, creating hotspot"
122+ CreateHotSpot
123+ ACTIVE_MODE=" ap"
124+ else
125+ ACTIVE_MODE=" client"
126+ fi
127+ fi
128+ done
0 commit comments