4
4
import typing as T
5
5
import subprocess
6
6
import logging
7
- import shutil
8
7
import io
9
- from math import log10
8
+ import shutil
10
9
11
10
CLI = shutil .which ("netsh" )
12
11
if not CLI :
@@ -29,14 +28,24 @@ def cli_config_check() -> bool:
29
28
return False
30
29
31
30
32
- def get_signal () -> list [dict [str , T .Any ]]:
33
- """ get signal strength using CLI """
31
+ def get_signal () -> str :
32
+ """
33
+ get signal strength using CLI
34
+
35
+ returns dict of data parsed from CLI
36
+ """
34
37
ret = subprocess .run (CMD , timeout = 1.0 , stdout = subprocess .PIPE , text = True )
35
38
if ret .returncode != 0 :
36
39
logging .error ("consider slowing scan cadence." )
37
40
41
+ return ret .stdout
42
+
43
+
44
+ def parse_signal (raw : str ) -> list [dict [str , T .Any ]]:
45
+
38
46
dat : list [dict [str , str ]] = []
39
- out = io .StringIO (ret .stdout )
47
+ out = io .StringIO (raw )
48
+
40
49
for line in out :
41
50
d : dict [str , str ] = {}
42
51
if not line .startswith ("SSID" ):
@@ -45,6 +54,7 @@ def get_signal() -> list[dict[str, T.Any]]:
45
54
# optout
46
55
if ssid .endswith ("_nomap" ):
47
56
continue
57
+
48
58
# find BSSID MAC address
49
59
for line in out :
50
60
if not line [4 :9 ] == "BSSID" :
@@ -62,14 +72,20 @@ def get_signal() -> list[dict[str, T.Any]]:
62
72
d ["ssid" ] = ssid
63
73
dat .append (d )
64
74
d = {}
75
+ # need break at each for level
65
76
break
77
+ break
66
78
67
79
return dat
68
80
69
81
70
82
def signal_percent_to_dbm (percent : int ) -> int :
71
- """arbitrary conversion factor from Windows WiFi signal % to dBm
72
- assumes 100% is -30 dBm
83
+ """
84
+ arbitrary conversion factor from Windows WiFi signal % to dBm
85
+ assumes signal percents map to dBm like:
86
+
87
+ * 100% is -30 dBm
88
+ * 0% is -100 dBm
73
89
74
90
Parameters
75
91
----------
@@ -81,9 +97,8 @@ def signal_percent_to_dbm(percent: int) -> int:
81
97
meas_dBm: int
82
98
truncate to nearest integer because of uncertainties
83
99
"""
84
- REF = - 30 # dBm
85
- ref_mW = 10 ** (REF / 10 ) / 1000
86
- meas_mW = max (ref_mW * percent / 100 , 1e-7 )
87
- meas_dBm = 10 * log10 (meas_mW ) + 30
88
100
89
- return int (meas_dBm )
101
+ REF = - 100 # dBm
102
+ assert 0 <= percent <= 100 , "percent must be 0...100"
103
+
104
+ return int (REF + percent * 7 / 10 )
0 commit comments