¡Hola! :D
Con ayuda del comando "iw" en Linux, hago un monitoreo de las redes Wi-Fi disponibles, el resultado lo guardo en un archivo txt. Todos los datos que se guardan, debo de separarlos y juntarlos en un json.
Esta es una muestra del archivo:
BSS 88:15:44:39:48:66(on wlp1s0) -- associated last seen: 3905.256s [boottime] TSF: 16770805099 usec (0d, 04:39:30) freq: 2412 beacon interval: 100 TUs capability: ESS Privacy ShortPreamble ShortSlotTime RadioMeasure (0x1431) signal: -49.00 dBm last seen: 3492 ms ago Information elements from Probe Response frame: SSID: Café Negro Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 DS Parameter set: channel 1BSS c8:d7:19:d4:7d:b9(on wlp1s0) last seen: 3908.343s [boottime] TSF: 7141877017905 usec (82d, 15:51:17) freq: 5785 beacon interval: 100 TUs capability: ESS Privacy (0x0011) signal: -91.00 dBm last seen: 405 ms ago Information elements from Probe Response frame: SSID: MOUREY C4 Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0
Este es el código que he realizado (No tengo mucha experiencia en Python):
#!/usr/bin/python3.6import jsonimport datetime# Variablesaps = {}i = 0mac_range = slice(4, 21)with open('all_data.txt', 'r') as f: text = f.readlines()# Función para obtener las direcciones MACdef getBSSID(text): bssid = [] for line in text: if line.startswith('BSS'): mac = line[mac_range] bssid.append(mac) return bssid# Función para obtener el nombre de la red (SSID)def getSSID(text): ssid = [] for line in text: if line.startswith(' SSID'): name_ssid = line[7:len(line)].strip() ssid.append(name_ssid) return ssid# Función para obtener el tiempo en que se identifico por última vezdef lastSeen(text): last_seen = [] for line in text: if line.startswith(' last seen'): #print(line) seconds = line last_seen.append(seconds) return last_seendef cleanLastSeen(lista): new_last_seen = [] list_time = [] for i in range(len(lista)): if i%2!=0: new_last_seen.append(lista[i].strip()) for element in new_last_seen: a = element.replace("last seen: ", "")#.replace("[boottime]", "")#.replace(" ", "") list_time.append(a) #return new_last_seen return list_time# Función para obtener la potencia de la señaldef signal(text): signal = [] for line in text: if line.startswith(' signal'): signal_dbm = line[8:len(line)].strip() signal.append(signal_dbm) return signaldef tsf(text): tsf = [] for line in text: if line.startswith(' TSF'): tsf_data = line[5:len(line)].strip() tsf.append(tsf_data) return tsfdef freq(text): freq = [] for line in text: if line.startswith(' freq'): freq_data = line[6:len(line)].strip() freq.append(freq_data) return freqdef beaconInterval(text): beacon_interval = [] for line in text: if line.startswith(' beacon interval'): beacon_interval_data = line[17:len(line)].strip() beacon_interval.append(beacon_interval_data) return beacon_intervaldef capability(text): capability = [] for line in text: if line.startswith(' capability'): capability_data = line[12:len(line)].strip() capability.append(capability_data) return capabilitydef supportedRates(text): supported_rates = [] for line in text: if(line.startswith(' Supported rates')): supported_rates_data = line[17:len(line)].strip() supported_rates.append(supported_rates_data) return supported_rates#Pendientedef dsParameterSet(text): ds_parameter_set = [] for line in text: if(line.startswith(' DS Parameter set')): ds_parameter_set_data = line[18:len(line)].strip() ds_parameter_set.append(ds_parameter_set_data) #else: #ds_parameter_set_data = "" #ds_parameter_set.append(ds_parameter_set_data) return ds_parameter_setbssid = getBSSID(text)ssid = getSSID(text)signal = signal(text)last_seen = lastSeen(text)list_last_seen = cleanLastSeen(last_seen)tsf = tsf(text)freq = freq(text)beacon_interval = beaconInterval(text)capability = capability(text)supported_rates = supportedRates(text)#ds_parameter_set = dsParameterSet(text)json_data = {"aps": []}try: for i in range(len(bssid)): json_data["aps"].append({"mac_address": bssid[i],"ssid": ssid[i],"last_seen": list_last_seen[i],"signal": signal[i],"timestamp": datetime.datetime.now(),"tsf": tsf[i],"frequency": freq[i],"beacon_interval": beacon_interval[i],"capability": capability[i],"supported_rates": supported_rates[i], #"ds_parameter_set": ds_parameter_set[i] #"timestamp": ct })except: Exceptionprint(json.dumps(json_data, indent=4, default=str))
Esta es una muestra al ejecutar el código:
{"aps": [ {"mac_address": "88:15:44:39:48:66","ssid": "BBNet2","last_seen": "3492 ms ago","signal": "-49.00 dBm","timestamp": "2020-12-08 12:22:02.584492","tsf": "16770805099 usec (0d, 04:39:30)","frequency": "2412","beacon_interval": "100 TUs","capability": "ESS Privacy ShortPreamble ShortSlotTime RadioMeasure (0x1431)","supported_rates": "1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0" }, {"mac_address": "e8:ed:05:32:91:e0","ssid": "AIKIDO DOJO\\x20","last_seen": "3314 ms ago","signal": "-37.00 dBm","timestamp": "2020-12-08 12:22:02.584503","tsf": "943151798510 usec (10d, 21:59:11)","frequency": "2437","beacon_interval": "100 TUs","capability": "ESS Privacy SpectrumMgmt ShortSlotTime (0x0511)","supported_rates": "1.0* 2.0* 5.5* 11.0* 18.0 24.0* 36.0 54.0" }, ]}
El problema es que, al principio todos los datos eran similares, pero llega un punto el que una red sí cuenta con cierto dato pero otra red no lo tiene.Como por ejemplo, el dato DS Parameter set
Entonces, mi duda es, ¿cómo puedo guardar la información de cada red adecuadamente teniendo en cuenta que los datos pueden estar o no estar?
Espero puedan ayudarme con alguna idea.
¡Muchas Gracias!