Files
NodeMCU_Lua/DeepSleep/Pet_tracker_3/post_tracing/gpx2gpsapwifi.lua
Christian Zufferey 8df493138b Voilà, cela fonctionne nettement mieux maintenant
Je n'avais pas pris le bon index pour remplir le tableau de votes.
Mais je m'aperçois que j'ai des fois une paterne avec qu'un seul ap wifi
et cela me crée pas mal de doublons au niveau votes.
Je dois donc encore chercher pourquoi et comment lever le doute avec le
coefficient error de distance
2020-08-08 13:53:46 +02:00

399 lines
15 KiB
Lua

-- parse les données GPX avec les données des ap wifi du NodeMCU pour les
-- cooréler en fonction du temps afin de pouvoir géolocaliser les ap wifi
print("\n gpx2gpsapwifi.lua zfzf200808.1346 \n")
zgpx_tab = {}
zidx_gpx_tab = 0
zap_wifi_tab = {}
zidx_ap_wifi_tab1 = 0
zidx_ap_wifi_tab2 = 0
zap_wifi_unique_tab = {}
zidx_ap_wifi_unique_tab = 0
zpet_tracker_tab = {}
zidx_pet_tracker_tab1 = 0
zidx_pet_tracker_tab2 = 0
zvote_tab = {}
zidx_vote_tab = 0
ztime_old = 0
ztime2020 = 1577836800 -- Unix time pour 1.1.2020 0:0:0 GMT
ztimezone = 2*3600
function zround(num, dec)
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end
function zcalc_distance(zrssi)
zrssi_1m=-40 zn=2
zdist=10^((zrssi_1m - zrssi) / (10 * zn))
return zdist
end
function tprint(t)
for key,value in pairs(t) do
print(key, value)
end
end
function zunixtime2datetime(zunixtime)
local datetime = os.date("%Y/%m/%d %H:%M:%S",zunixtime-ztimezone)
return datetime
end
function zdatetime2unixtime(zdatetime)
-- source: https://stackoverflow.com/questions/4105012/convert-a-string-date-to-a-timestamp
-- https://www.unixtimestamp.com/index.php
-- Assuming a date pattern like: yyyy-mm-ddThh:mm:ss
local pattern = "(%d+)-(%d+)-(%d+)T(%d+):(%d+):(%d+)"
-- local timeToConvert = "2020-07-27T20:03:27"
local timeToConvert = zdatetime
local runyear, runmonth, runday, runhour, runminute, runseconds = timeToConvert:match(pattern)
local convertedTimestamp = os.time({year = runyear, month = runmonth, day = runday, hour = runhour, min = runminute, sec = runseconds})
return (convertedTimestamp+ztimezone)
end
function gpx2tab(zfile_gpx)
i = 1
for line in io.lines(zfile_gpx) do
-- print(line)
-- <trkpt lat="46.5421696" lon="6.5749532">
if string.find(line, "<trkpt ") then
-- print("coucou gps")
-- récupère la longitude
p1, p2 = string.find(line, "lat=\"")
-- print(p1,p2)
p3 = string.find(line, "\"", p2+1)
-- print(p3)
zlat = string.sub(line,p2+1,p3-1)
-- print("lat: " ..zlat)
-- récupère la latitude
p1, p2 = string.find(line, "lon=\"")
-- print(p1,p2)
p3 = string.find(line, "\"", p2+1)
-- print(p3)
zlon = string.sub(line,p2+1,p3-1)
-- print("lon: " ..zlon)
end
-- <time>2020-07-27T20:03:27Z</time>
if string.find(line, "<time>") then
-- print("coucou time")
-- récupère le temps
p1, p2 = string.find(line, "<time>")
-- print(p1,p2)
p3 = string.find(line, "Z</time>", p2+1)
-- print(p3)
ztime = string.sub(line,p2+1,p3-1)
-- print("time: " ..ztime)
zunixtime = zdatetime2unixtime(ztime)+ztimezone
-- print("unixtime: " ..zunixtime)
-- on a le temps et les coordonnées on peut les sauver dans le tableau§
zidx_gpx_tab = zidx_gpx_tab + 1
zgpx_tab[zidx_gpx_tab] = {unixtime = zunixtime, time = zunixtime2datetime(zunixtime),lon = zlon, lat = zlat}
end
-- juste un petit verrou pour ne pas parser tout le fichiers pendant les tests
i = i + 1
if i > 20000 then break end
end
end
function ap_wifi2tab(zfile_ap_wifi)
i = 1
for line in io.lines(zfile_ap_wifi) do
-- print(line)
-- 18050624, b0:7f:b9:3e:f1:f1, "apzuzu6_EXT", -71
-- on récupère le temps unix 2020
p1 = string.find(line, ",")
zunixtime2020 = string.sub(line, 1, p1-1)
-- print(zunixtime2020)
-- on récupère le temps unix 1970
zunixtime = zunixtime2020 + ztime2020
-- print(zunixtime)
-- on récupère la mac adresse
p2 = string.find(line, ",", p1+1)
zmacadresse = string.sub(line, p1+2, p2-1)
-- print(zmacadresse)
-- on récupère le nom de l'ap wifi
p3 = string.find(line, ",", p2+1)
zap_wifiname = string.sub(line, p2+3, p3-2)
-- print(zap_wifi)
-- on récupère le RSSI
p4 = string.len(line)
zrssi = string.sub(line, p3+2, p4)
-- print(zrssi)
-- est-ce un nouveau groupe de time ?
if zunixtime ~= ztime_old then
ztime_old = zunixtime
zidx_ap_wifi_tab2 = 0
zidx_ap_wifi_tab1 = zidx_ap_wifi_tab1 + 1
zap_wifi_tab[zidx_ap_wifi_tab1] = {unixtime = zunixtime, time = zunixtime2datetime(zunixtime), lon = 0, lat = 0, {}}
end
zidx_ap_wifi_tab2 = zidx_ap_wifi_tab2 + 1
zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2] = {mac = zmacadresse, name = zap_wifiname, rssi = zrssi, error = math.floor(zround(zcalc_distance(zrssi),0))}
-- juste un petit verrou pour ne pas parser tout le fichiers pendant les tests
i = i + 1
if i > 20000 then break end
end
end
function gpx2gpsap_wifi()
for i=1, #zap_wifi_tab do
-- print("groupe: "..i)
-- print("time ap_wifi: "..zap_wifi_tab[i].time)
-- print("unxitime ap_wifi: "..zap_wifi_tab[i].unixtime)
-- print("lon: "..zap_wifi_tab[i].lon)
-- print("lat: "..zap_wifi_tab[i].lat)
j = 1
while zgpx_tab[j].unixtime < zap_wifi_tab[i].unixtime do
-- print("coucou")
j = j + 1
end
-- print("j: "..j)
-- print("time gpx: "..zgpx_tab[j].time)
-- print("unxitime gpx: "..zgpx_tab[j].unixtime)
zap_wifi_tab[i].lon = zgpx_tab[j].lon
zap_wifi_tab[i].lat = zgpx_tab[j].lat
-- print("lon: "..zap_wifi_tab[i].lon)
-- print("lat: "..zap_wifi_tab[i].lat)
end
end
function zprint_ap_wifi_tab(ztab)
for i=1, #ztab do
print("groupe: "..i.." -----------------")
print("time: "..ztab[i].time)
print("unxitime: "..ztab[i].unixtime)
print("lon: "..ztab[i].lon)
print("lat: "..ztab[i].lat)
for j=1 , #ztab[i] do
print("idx: "..j)
print("mac: "..ztab[i][j].mac)
print("name: "..ztab[i][j].name)
print("rssi: "..ztab[i][j].rssi)
print("error: "..ztab[i][j].error)
end
end
end
gpx2tab("osman_2020-07-27_22-03_Mon.gpx")
ap_wifi2tab("pet_tracker_200727.2203.csv")
gpx2gpsap_wifi()
-- zprint_ap_wifi_tab()
function zfind_unique_ap_wifi()
zidx_ap_wifi_unique_tab = 0
for i=1, #zap_wifi_tab do
-- print("groupe: "..i.." -----------------")
-- print("time: "..zap_wifi_tab[i].time)
-- print("unxitime: "..zap_wifi_tab[i].unixtime)
-- print("lon: "..zap_wifi_tab[i].lon)
-- print("lat: "..zap_wifi_tab[i].lat)
for j=1 , #zap_wifi_tab[i] do
-- print("idx: "..j)
-- print("mac: "..zap_wifi_tab[i][j].mac)
-- print("name: "..zap_wifi_tab[i][j].name)
-- print("rssi: "..zap_wifi_tab[i][j].rssi)
-- print("error: "..zap_wifi_tab[i][j].error)
zmacadresse = zap_wifi_tab[i][j].mac
if zap_wifi_unique_tab[zmacadresse] == nil then
-- print("oh un nouveau: "..zap_wifi_tab[i][j].mac..zap_wifi_tab[i][j].name)
zap_wifi_unique_tab[zmacadresse] = {
name = zap_wifi_tab[i][j].name,
error = zap_wifi_tab[i][j].error,
nb = 1,
lon = zap_wifi_tab[i].lon,
lat = zap_wifi_tab[i].lat}
-- zap_wifi_unique_tab[zmacadresse] = {lon = zap_wifi_tab[i][j].lon, lat =zap_wifi_tab[i][j].lat}
zidx_ap_wifi_unique_tab = zidx_ap_wifi_unique_tab + 1
else
if zap_wifi_tab[i][j].error < zap_wifi_unique_tab[zmacadresse].error then
-- print("oh il est plus proche "..zap_wifi_tab[i][j].error.." < "..zap_wifi_unique_tab[zmacadresse].error)
zap_wifi_unique_tab[zmacadresse].error = zap_wifi_tab[i][j].error
zap_wifi_unique_tab[zmacadresse].nb = zap_wifi_unique_tab[zmacadresse].nb + 1
zap_wifi_unique_tab[zmacadresse].lon = zap_wifi_tab[i].lon
zap_wifi_unique_tab[zmacadresse].lat = zap_wifi_tab[i].lat
end
end
end
end
end
function zprint_ap_wifi_unique()
print("mac, name, nb, lon, lat, error")
for key,value in pairs(zap_wifi_unique_tab) do
print(
key..", \""..
zap_wifi_unique_tab[key].name.."\", "..
zap_wifi_unique_tab[key].nb..", "..
zap_wifi_unique_tab[key].lon..", "..
zap_wifi_unique_tab[key].lat..", "..
zap_wifi_unique_tab[key].error)
end
end
zfind_unique_ap_wifi()
-- zprint_ap_wifi_unique()
-- print("j'en ai trouvé "..zidx_ap_wifi_unique_tab.."x")
-- affiche toutes les données pour un seul ap wifi afin de déterminer sa localisation visuellement
function zget_ap_wifi(zmacadresse)
print('"mac", "name", "lon", "lat", "error"')
zidx_get_ap_wiifi = 0
for i=1, #zap_wifi_tab do
print("groupe: "..i.." -----------------")
-- print("time: "..zap_wifi_tab[i].time)
-- print("unxitime: "..zap_wifi_tab[i].unixtime)
-- print("lon: "..zap_wifi_tab[i].lon)
-- print("lat: "..zap_wifi_tab[i].lat)
for j=1 , #zap_wifi_tab[i] do
print("idx: "..j)
-- print("mac: "..zap_wifi_tab[i][j].mac)
-- print("name: "..zap_wifi_tab[i][j].name)
-- print("rssi: "..zap_wifi_tab[i][j].rssi)
-- print("error: "..zap_wifi_tab[i][j].error)
if zap_wifi_tab[i][j].mac == zmacadresse then
zidx_get_ap_wiifi = zidx_get_ap_wiifi + 1
print(
zap_wifi_tab[i][j].mac..", \""..
zap_wifi_tab[i][j].name.."\", "..
zap_wifi_tab[i].lon..", "..
zap_wifi_tab[i].lat..", "..
zap_wifi_tab[i][j].error)
end
end
end
print("J'en ai trouvé "..zidx_get_ap_wiifi.."x")
end
-- zget_ap_wifi("7a:d3:8d:fc:e9:a9")
function pet_tracker2tab(zfile_pettracker)
i = 1
for line in io.lines(zfile_pettracker) do
-- print(line)
-- 18050624, b0:7f:b9:3e:f1:f1, "apzuzu6_EXT", -71
-- on récupère le temps unix 2020
p1 = string.find(line, ",")
zunixtime2020 = string.sub(line, 1, p1-1)
-- print(zunixtime2020)
-- on récupère le temps unix 1970
zunixtime = zunixtime2020 + ztime2020
-- print(zunixtime)
-- on récupère la mac adresse
p2 = string.find(line, ",", p1+1)
zmacadresse = string.sub(line, p1+2, p2-1)
-- print(zmacadresse)
-- on récupère le nom de l'ap wifi
p3 = string.find(line, ",", p2+1)
zap_wifiname = string.sub(line, p2+3, p3-2)
-- print(zap_wifi)
-- on récupère le RSSI
p4 = string.len(line)
zrssi = string.sub(line, p3+2, p4)
-- print(zrssi)
-- est-ce un nouveau groupe de time ?
if zunixtime ~= ztime_old then
ztime_old = zunixtime
zidx_pet_tracker_tab2 = 0
zidx_pet_tracker_tab1 = zidx_pet_tracker_tab1 + 1
zpet_tracker_tab[zidx_pet_tracker_tab1] = {unixtime = zunixtime, time = zunixtime2datetime(zunixtime), lon = 0, lat = 0, {}}
end
zidx_pet_tracker_tab2 = zidx_pet_tracker_tab2 + 1
zpet_tracker_tab[zidx_pet_tracker_tab1][zidx_pet_tracker_tab2] = {mac = zmacadresse, name = zap_wifiname, rssi = zrssi, error = math.floor(zround(zcalc_distance(zrssi),0))}
-- juste un petit verrou pour ne pas parser tout le fichiers pendant les tests
i = i + 1
-- if i > 20 then break end
if i > 20000 then break end
end
end
pet_tracker2tab("pet_tracker_200727.2203.csv")
-- zprint_ap_wifi_tab(zpet_tracker_tab)
-- recherche les coordonnées GPS d'une patterne ap wifi en fonction de sa patterne observée au temps t
function zget_gps_ap_wifi(zidx_pet_tracker_tab1)
print("groupe: "..zidx_pet_tracker_tab1.." -------------------------------")
for zidx_pet_tracker_tab2 = 1, #zpet_tracker_tab[zidx_pet_tracker_tab1] do
print("idx: "..zidx_pet_tracker_tab2)
zmacadresse1 = zpet_tracker_tab[zidx_pet_tracker_tab1][zidx_pet_tracker_tab2].mac
print("zmacadresse: "..zmacadresse1)
-- parse toute la table ap_wifi à la recherche de la mac adresse
i = 1
for zidx_ap_wifi_tab1 = 1, #zap_wifi_tab do
-- print("groupe: "..zidx_ap_wifi_tab1.." -----------------")
-- print("time: "..zap_wifi_tab[zidx_ap_wifi_tab1].time)
-- print("unxitime: "..zap_wifi_tab[zidx_ap_wifi_tab1].unixtime)
-- print("lon: "..zap_wifi_tab[zidx_ap_wifi_tab1].lon)
-- print("lat: "..zap_wifi_tab[zidx_ap_wifi_tab1].lat)
for zidx_ap_wifi_tab2 = 1 , #zap_wifi_tab[zidx_ap_wifi_tab1] do
-- print("idx: "..zidx_ap_wifi_tab2)
-- print("mac: "..zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].mac)
-- print("name: "..zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].name)
-- print("rssi: "..zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].rssi)
-- print("error: "..zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].error)
zmacadresse2 = zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].mac
if zmacadresse1 == zmacadresse2 then
-- print("idx: "..zidx_ap_wifi_tab2.."/"..#zap_wifi_tab[zidx_ap_wifi_tab1])
-- print("mac1: "..zmacadresse1)
-- print("mac2: "..zmacadresse2)
-- print("J'en ai trouvée une...")
zvote_tab[zidx_ap_wifi_tab1].idx = zidx_ap_wifi_tab1
zvote_tab[zidx_ap_wifi_tab1].vote = zvote_tab[zidx_ap_wifi_tab1].vote + 1
zvote_tab[zidx_ap_wifi_tab1].error = zap_wifi_tab[zidx_ap_wifi_tab1][zidx_ap_wifi_tab2].error
-- print("vote: "..zvote_tab[zidx_ap_wifi_tab2].vote)
end
end
i = i + 1
-- if i > 5 then break end
if i > 50000 then break end
end
end
end
-- efface le tableau de votes des paternes
for zidx_vote_tab = 1, #zap_wifi_tab do
zvote_tab[zidx_vote_tab] = {
idx = 0,
vote = 0,
error = 0}
end
zidx_vote_tab = 0
zget_gps_ap_wifi(69)
-- imprime le tableau de votes des paternes
for zidx_vote_tab = 1, #zvote_tab do
if zvote_tab[zidx_vote_tab].idx > 0 then
print("pour "..zvote_tab[zidx_vote_tab].idx.." nombre de votes"..zvote_tab[zidx_vote_tab].vote)
end
end
print("il y a "..#zpet_tracker_tab.." paternes !")