hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
ssid=
password=
encrypt=psk
mode="station"
config_file="/data/wifi_configure.txt"
router_ip="192.168.168.1"
router_connted="no"
ap_ip="192.168.2.1"
ping_period="6"
retry="1"
onoff_test="0"
debug="1"
module_pid_file="/sys/bus/mmc/devices/mmc1:0001/mmc1:0001:1/device"
init_config=0
ERROR_FLAG=0
wifi_results_file=/data/wifi_results.txt
wifi_results_ok=
wifi_results_fail=
 
wpa_pid=
dhcpcd_pid=
 
NAME1=wpa_supplicant
DAEMON1=/usr/sbin/$NAME1
PIDFILE1=/var/run/$NAME1.pid
 
NAME2=hostapd
DAEMON2=/usr/sbin/$NAME2
PIDFILE2=/var/run/$NAME2.pid
 
NAME3=dnsmasq
DAEMON3=/usr/sbin/$NAME3
PIDFILE3=/var/run/$NAME3.pid
 
NAME4=dhcpcd
DAEMON4=/usr/sbin/$NAME4
PIDFILE4=/var/run/${NAME4}-wlan0.pid
 
alias check_wlan="ifconfig wlan0 2> /dev/null"
alias check_wpa="wpa_cli ping 2> /dev/null | grep PONG"
alias check_ap_connect="wpa_cli status 2> /dev/null | grep state=COMPLETED"
alias check_hostapd="hostapd_cli status 2> /dev/null | grep state=ENABLED"
alias check_dnsmasq="ps | grep -v grep | grep dnsmasq > /dev/null"
 
function end_script() {
if [ ${ERROR_FLAG} -ne 0 ]
then
    exit 11
else
    exit
fi
}
 
function check_in_loop() {
local cnt=1
while [ $cnt -lt $1 ]; do
    echo "check_in_loop processing..."
    case "$2" in
        check_wlan)
        check_wlan
        ;;
        check_hostapd)
        check_hostapd
        ;;
        check_dnsmasq)
        check_dnsmasq
        ;;
        check_wpa)
        check_wpa
        ;;
        check_ap_connect)
        check_ap_connect
        ;;
    esac
    if [ $? -eq 0 ];then
        return
    else
        cnt=$((cnt + 1))
        sleep 1
        continue
    fi
done
##return here if no matter###
if [ "$2" = "check_eth" ];then
   return
fi
 
echo "fail!!"
ERROR_FLAG=1
end_script
}
 
function load_driver() {
if [ $1 = "0" ];then
   echo "removing driver if loaded"
else
   echo "start driver loading..."
   ##########check wlan0############################
   echo "checking wlan0..."
   check_in_loop 15 check_wlan
   echo "wlan0 shows up
   "
fi
}
 
function stop_wifi() {
 
load_driver 0
 
echo "#########stoping wifi#####################"
#####stop wpa_supplicant hostapd dhcpcd dnsamas##
echo "Stopp prv wpa_supplicant first"
wpa_pid=`ps | grep wpa_supplicant | awk '{print $1}' | sed -n "1p"`
echo "wpa_pid: $wpa_pid"
kill $wpa_pid
sleep 1
echo "Stopp prv dhcpcd first"
dhcpcd_pid=`ps | grep dhcpcd | awk '{print $1}' | sed -n "1p"`
echo "dhcpcd_pid: $dhcpcd_pid"
kill $dhcpcd_pid
sleep 1
}
 
function wifi_bcm_init()
{
 
   if [ ! -f ${module_pid_file} ];then
       ifconfig wlan0 up
       sleep 2
   fi
}
 
function initial_configure() {
if [ -f $config_file ];then
########load from txt##################
echo "reading from txt...."
   while read line ; do
   key=`echo $line | awk -F "=" '{print $1}'`
   val=`echo $line | awk -F "=" '{print $2}'`
    case "$key" in
       ssid)
       ssid=$val
       ;;
       password)
       password=$val
       ;;
       encrypt)
       encrypt=$val
       ;;
       driver)
       driver=$val
       ;;
       mode)
       mode=$val
       ;;
       debug)
       debug=$val
       ;;
       ping_period)
       ping_period=$val
       ;;
       retry)
       retry=$val
       ;;
        onoff_test)
       onoff_test=$val
       ;;
   esac
   done < $config_file
   
   if [ "$ssid" = "" ];then
       init_config=1
       read -t 100 -p "Input ssid: " ssid
       if [ "$ssid" = "" ];then
               echo "wifi ssid not empty!!!"
               end_script
       else
               echo "wifi ssid: $ssid"
       fi
   fi
 
   if [ "$password" = "" ];then
       read -t 100 -p "Input password: " password
       if [ "$password" = "" ];then
               echo "wifi password not empty!!!"
               end_script
       else
               echo "wifi password: $password"
       fi
   fi
 
   if [ $init_config ]; then
echo "ssid=$ssid
password=$password
encrypt=psk
mode=station
onoff_test=0
retry=5
debug=1
"  > /data/wifi_configure.txt
   fi
   
else
   if [ "$ssid" = "" ];then
       init_config=1
       read -t 100 -p "Input ssid: " ssid
       if [ "$ssid" = "" ];then
               echo "wifi ssid not empty!!!"
               end_script
       else
               echo "wifi ssid: $ssid"
       fi
   fi
 
   if [ "$password" = "" ];then
       read -t 100 -p "Input password: " password
       if [ "$password" = "" ];then
               echo "wifi password not empty!!!"
               end_script
       else
               echo "wifi password: $password"
       fi
   fi
 
   if [ $init_config ]; then
       echo "ssid=$ssid
password=$password
encrypt=psk
mode=station
onoff_test=0
retry=5
debug=1
"  > /data/wifi_configure.txt
   fi
fi
echo "user set:
ssid=$ssid, key=$password, mode=$mode debug=$debug
4s to check your configure
"
if [ "`echo $password |wc -L`" -lt "8" ];then
echo "waring: password lentgh is less than 8, it is not fit for WPA-PSK"
fi
 
}
 
function usage() {
echo "
##################################################################
#usage:                                                          
#first choice:
#   write configure in /data/wifi/wifi_configure.txt
#second choice:
#   $0  \"ssid\" \"key\" \"mode\"                             
#   example:$0 $ssid $password $mode                               
#   version:1.4
##################################################################
"
}
 
function ping_test() {
if [ ! -f $wifi_results_file ];then
echo "
wifi_ok=0
wifi_fail=0
" > $wifi_results_file
fi
 
########load from txt##################
echo "reading from txt...."
while read line ; do
   key=`echo $line | awk -F "=" '{print $1}'`
   val=`echo $line | awk -F "=" '{print $2}'`
   echo $key $val
   case "$key" in
       wifi_ok)
       wifi_results_ok=$val
       ;;
       wifi_fail)
       wifi_results_fail=$val
       ;;
   esac
done < $wifi_results_file
 
#router_ip=`ifconfig wlan0 | grep "inet addr" | awk -F " " '{print $2}' | sed "s/addr://g"`
router_ip=`route -n | awk '{print $2}' | sed -n "3p"`
echo "
now going to ping router's ip: $router_ip for $ping_period seconds"
ping $router_ip -w $ping_period
 
if [ $? -eq 1 ];then
   echo "ping fail!! please check"
   let wifi_results_fail+=1
else
 
   echo "ping successfully"
   router_connted="yes"
   dmesg > /data/wifi_reboot_ok.txt
 
   let wifi_results_ok+=1
fi
 
echo "wifi_ok=$wifi_results_ok
wifi_fail=$wifi_results_fail
" > $wifi_results_file
}
 
############start wpa_supplicant##########
function start_sta() {
echo "starting wpa_supplicant..."
ifconfig wlan0 0.0.0.0
 
mkdir /data/wpa_supplicant
echo "ctrl_interface=/data/wpa_supplicant
ap_scan=1
 
network={
   ssid=\"$ssid\"
   psk=\"$password\"
   key_mgmt=WPA-PSK
}
" > /data/wpa_supplicant.conf
 
if [ $debug -eq 1 ];then
   echo "ctrl_interface=/var/run/wpa_supplicant"
   /sbin/start-stop-daemon -S -m -p $PIDFILE1  -x $DAEMON1 -- -Dnl80211 -iwlan0 -c/data/wpa_supplicant.conf &
else
   echo "ctrl_interface=/var/run/wpa_supplicant debug0"
   /sbin/start-stop-daemon -S -m -p $PIDFILE1 -b -x $DAEMON1 -- -Dnl80211 -iwlan0 -c/data/wpa_supplicant.conf
fi
 
#check_in_loop 2 check_wpa
#check_in_loop 2 check_ap_connect
echo "start wpa_supplicant successfully!!"
 
sleep 2
 
############start dhcp#######################
echo "starting wifi dhcp..."
/sbin/dhcpcd wlan0
echo "ap connected!!"
}
 
function start_wifi() {
 
echo "########starting wifi#####################"
###############load wifi driver##################
load_driver 1
#####start wpa_supplicant hostapd dhcpcd dnsamasq bridge##
 
if [ "${mode}" = "station" ]; then
   start_sta
   ping_test wlan0
elif [ "${mode}" = "ap" ]; then
   #start_ap
   #start_dnsmasq
    echo "ap is started!!"
else
   echo "bad mode!"
   end_script
fi
 
}
 
function main() {
###########show usage first#####################
usage
initial_configure
stop_wifi
start_wifi
 
}
 
wifi_bcm_init
main