16
16
from time import sleep
17
17
18
18
URL = 'https://location.services.mozilla.com/v1/geolocate?key=test'
19
- NMCMD = ['nmcli' ,'-fields ' ,'SSID,BSSID,FREQ,SIGNAL' ,'device' ,'wifi' ]
19
+ NMCMD = ['nmcli' ,'-g ' ,'SSID,BSSID,FREQ,SIGNAL' ,'device' ,'wifi' ]
20
20
NMSCAN = ['nmcli' ,'device' ,'wifi' ,'rescan' ]
21
21
22
22
23
23
def get_nmcli ():
24
24
25
-
25
+
26
26
ret = subprocess .check_output (NMCMD )
27
27
sleep (0.5 ) # nmcli crashed for less than about 0.2 sec.
28
28
try :
29
29
subprocess .check_call (NMSCAN ) # takes several seconds to update, so do it now.
30
30
except subprocess .CalledProcessError as e :
31
31
print ('consider slowing scan cadence. {}' .format (e ))
32
-
33
- dat = pandas .read_csv (BytesIO (ret ), sep = '\s+' , index_col = False ,
34
- header = 0 ,usecols = [0 ,1 ,2 ,4 ], encoding = 'utf8' ,
35
- names = ['ssid' ,'macAddress' ,'frequency' ,'signalStrength' ])
32
+
33
+ dat = pandas .read_csv (BytesIO (ret ), sep = r'(?<!\\):' , index_col = False ,
34
+ header = 0 , encoding = 'utf8' ,engine = 'python' ,
35
+ dtype = str ,usecols = [0 ,1 ,3 ],
36
+ names = ['ssid' ,'macAddress' ,'signalStrength' ])
36
37
# %% optout
37
38
dat = dat [~ dat ['ssid' ].str .endswith ('_nomap' )]
38
- # %% JSON
39
+ dat ['macAddress' ] = dat ['macAddress' ].str .replace (r'\\:' ,':' )
40
+ # %% JSON
39
41
jdat = dat .to_json (orient = 'records' )
40
42
jdat = '{ "wifiAccessPoints":' + jdat + '}'
41
43
# print(jdat)
42
44
# %% cloud MLS
43
45
try :
44
46
req = requests .post (URL , data = jdat )
45
47
if req .status_code != 200 :
46
- logging .error (ret .text )
48
+ logging .error (req .text )
49
+ return
47
50
except requests .exceptions .ConnectionError as e :
48
- logging .error ('no network connection. {}' .format (e ))
51
+ logging .error ('no network connection. {}' .format (e ))
52
+ return
49
53
# %% process MLS response
50
54
jres = req .json ()
51
55
loc = jres ['location' ]
52
56
loc ['accuracy' ] = jres ['accuracy' ]
53
57
loc ['N' ] = dat .shape [0 ] # number of BSSIDs used
54
58
loc ['t' ] = datetime .now ()
55
-
59
+
56
60
return loc
57
61
58
62
@@ -75,7 +79,10 @@ def get_nmcli():
75
79
print ('updating every {} seconds' .format (T ))
76
80
while True :
77
81
loc = get_nmcli ()
78
-
82
+ if loc is None :
83
+ sleep (T )
84
+ continue
85
+
79
86
stat = '{} {} {} {} {}' .format (loc ['t' ].strftime ('%xT%X' ),
80
87
loc ['lat' ], loc ['lng' ], loc ['accuracy' ], loc ['N' ])
81
88
print (stat )
0 commit comments