Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Dicembre 29, 2021, 01:20:31 pm

Titolo: Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Dicembre 29, 2021, 01:20:31 pm
Ciao a tutti,
ho dei programmi fatti da me, che uso sia al lavoro che a casa, che devono scaricare dei files da internet.
Quando sono al lavoro, per scaricare hanno bisogno dei dati del proxy, quando sono a casa no.
I miei programmi capiscono se sono a casa o al lavoro, reperendo il nome utente. In base a quello impostano o meno il proxy.

Fino a settimana scorsa, non c'era problema, perché al lavoro avevo il PC fisso, ed idem a casa mia.
Ora le cose sono cambiate ... a lavoro mi hanno dato il portatile, che userò anche da casa quando faccio smart working.

Sorge quindi il problema ...
L'unica cosa che mi viene in mente è questa: se riuscissi a fare un elenco delle reti Wi-Fi disponibili, capirei subito se sono a casa o fuori casa.
Il problema è che non so come fare !!!

Qualcuno mi sa aiutare?


Grazie, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: nomorelogic - Dicembre 29, 2021, 02:03:47 pm
L'output di ipconfig ti può aiutare credo
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Dicembre 29, 2021, 02:50:02 pm
EDIT: Avevo risposto con una castronata .... perdonatemi ma sono ... vecchio ....  ;D
Risposta cancellata e riscritta.

Puoi usare il seguente codice, usando Indy10 (questo per Windows, però sostituendo IdStackWindows con IdStackLinux dovrebbe funzionare anche sotto Linux):

Indy10 lo puoi installare tramite l'ONLINE PACKAGE MANAGER di Lazarus.

Codice: [Seleziona]
Uses IdStackWindows, IdStack;

function GetLocalIpList(Name:string): TStringList;

var ElencoIP: TStringList;

function GetLocalIpList(Name: string): TStringList;
var Lista: TIdStackLocalAddressList;
    GProva: TIdStackWindows;
    temp: TIdStackLocalAddress;
begin
  result := TStringList.Create;
  try
    Lista := TIdStackLocalAddressList.Create;
    GProva := TIdStackWindows.Create;
    GProva.GetLocalAddressList(Lista);
    for  temp in Lista do
      if temp is TIdStackLocalAddressIPv4 then
        result.add((temp as TIdStackLocalAddressIPv4).IPAddress);
    GProva.Free;
    Lista.Free;
  except on e:exception do
     ;
  end;
end;

.....

   ElencoIP := GetLocalIpList('');

.....

In ElencoIP ti trovi n. elementi stringa con gli indirzzi IP assegnati (SOLO SE LE NIC SONO CONNESSE).

Se scorri gli elementi (IP formato string 'xxx.xxx.xxx.xxx.') dovresti capire dove sei ...

Io lo uso da anni senza problemi.

Ciao
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Dicembre 29, 2021, 03:10:39 pm
Grazie a tutti e 2 per la risposta.
Tendo ad installare meno componenti aggiuntivi possibile, per cui per il momento provo con "ipconfig".

Se dovesse servire ad altri in futuro, nel frattempo avevo anche trovato questo comando:
Codice: [Seleziona]
netsh wlan show interfaces

Leggendone l'output, sulla riga SSD c'è  anche il nome della rete wifi a cui si è connessi.

Stasera a casa faccio qualche prova col cavo di rete inserito, con wifi acceso e spento, e provo sia questo comando che ipconfig, e vedo quale dei 2 mi da le risposte più efficaci.

Ciao, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Dicembre 29, 2021, 03:40:40 pm
Fai solo attenzione al fatto che l'output dei comandi "netsh" e "ipconfig" nel tempo sono cambiati (parlo per l'ambiente Windows, anche tra aggiornamenti).

Inoltre dipende dai settings che hai nella interfaccia di Windows (ad esempio ITA, ENG, .....).

Io faccio molto spesso programmi per l'estero, e ho dovuto ripiegare su routine standard perchè l'output delle shell è assolutamente volubile.

Ciao
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Dicembre 29, 2021, 03:56:04 pm
Grazie del consiglio, ma sono rimasto "scottato" in passato con estensioni non più manutenzionate, e se posso evito !!!
Io di solito, verifico che la prima riga sia come me la aspetto io, se non è così, evito di proseguire con l'analisi.
Tra l'altro, in questo caso specifico, mi serve proprio per capire se sta girando sul mio PC del lavoro, che uso solo io, quindi non rischio che qualcuno mi cambi la lingua, o cose del genere.

Grazie ancora, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Dicembre 29, 2021, 04:49:12 pm
Solo un'ultima nota, poi evito ancora di importunarti.

Hai ragione di porre un dubbio sulla manutenzione delle estensioni, questo problema esiste in tutti gli ambienti (non ti dico quanti di questi nei vari anni in Delphi ... e si paga pure  :-\ ).

Però alcuni di questi sono talmente "stato dell'arte" che è il loro mancato uso che è una "bestemmia"   :o (stò scherzando ovviamente).

Indy esiste dal 1993 (nei suoi vari sviluppi), ed è stato portato avanti sino ad oggi grazie ad un gruppo molto coeso di persone. E' di fatto lo standard per le comunicazioni Internet in Pascal (Internect Direct era il suo vero nome), ancorchè ci siano altri prodotti che svolgono quelle funzioni (magari non tutte) altrettanto efficientemente.
Nel gruppo di lavoro di Indy ci sono anche alcune persone di FPC.

E' talmente usato che sono convinto che se si profilasse anche la vaga idea che venga abbandonato, chiuso o altro ci sarebbe la fila per assicurarsi la sua manutenzione.

Ed è il suo uso che consente il continuo sviluppo, il mantenimento e la risoluzione dei bug.

Non è una critica a te, anche io come te non faccio uso di alcuni pacchetti che mi sembrano utili ma ho perplessità sul loro futuro. Ho colto solo l'occasione per porre una opinione su una questione che ritengo sia abbastanza sentita.

Usiamo i pacchetti di estensione se ci forniscono aiuto o delle soluzioni "standard", questo aiuta la community (in senso largo) a crescere a sprona gli sviluppatori a mantenere ed evolvere i "pacchetti" stessi.

Ciao ciao, approfitto per augurare un buon proseguimento a tutti

 


Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Gennaio 19, 2022, 09:38:50 am
Puoi usare il seguente codice, usando Indy10 (questo per Windows, però sostituendo IdStackWindows con IdStackLinux dovrebbe funzionare anche sotto Linux):

Ciao,
Stavo provando il tuo codice, ma mi da un errore in compilazione.
L'errore è questo:
Codice: [Seleziona]
BonMarIndy.pas(28,10) Error: Incompatible types: got "TCollectionItem" expected "TIdStackLocalAddress"

Lo da su questa riga:
Codice: [Seleziona]
for  temp in Lista do

Ho fatto una unit a parte, in cui c'è dentro solo il tuo codice e, oltre alle uses che hai messo tu, ho aggiunto "Classes"

EDIT: Sono riuscito a farlo andare ... ma ...
non fa quello che serve a me.
Probabilmente mi sono spiegato male, a me servirebbe un elenco delle reti wifi disponibili, come quello che esce su windows quando si clicca sul mappamondo che c'è di fianco all'orologio. Credo che il codice postato mi faccia l'elenco delle schede wifi presenti nel PC da cui si lancia.

Grazie, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Gennaio 19, 2022, 04:04:30 pm
Probabilmente mi sono spiegato male, a me servirebbe un elenco delle reti wifi disponibili, come quello che esce su windows quando si clicca sul mappamondo che c'è di fianco all'orologio. Credo che il codice postato mi faccia l'elenco delle schede wifi presenti nel PC da cui si lancia.

Il codice che ti ho postato elenca TUTTI gli indirizzi IP assegnati al tuo PC. Dall'indirizzo IP assegnato, ad esempio dal 192.168.1.x al 192.168.10.x al 172.45.x.x potresti facilmente capire dove sei (ammesso che le reti a cui ti connetti ti forniscano un IP diverso dal quello di casa, come 192.168.12.x invece di 192.168.1.x)

L'elenco delle reti disponibili, siano esse WI-FI che altre, è sicuramente accessibile solo che almeno io non l'ho mai usato. Ho sempre verificato dove il mio  applicativo è o tramite IP assegnato (tutte le aziende hanno uno schema IP) o tramite accessibilità di una o più precise risorse.

Ciao

P.S.: vedo se riesco a buttarti giù il codice per rilevarti le reti wifi..
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Gennaio 19, 2022, 06:03:49 pm
Hai ragione ...
Qui a casa iniziano tutti con 192.
Se non ricordo male, al lavoro iniziano con 172.

Domani verifico ... speriamo !

Domani devo fare qualche verifica: la mia idea iniziale era quella di usare il wifi al lavoro ed il cavo ethernet a casa. In quella casistica il comando netsh wlan show interfaces andava bene.
Oggi invece stavo pensando che forse mi conviene usare il cavo ethernet anche al lavoro, perché ha una resa nettamente migliore, ma mi è venuto il dubbio che in quel caso potrebbe non funzionare il comando netsh.
Domani o al massimo venerdì, faccio le verifiche del caso, e poi vedo come muovermi.

L'unica cosa che mi preoccupa un attimino nel codice che hai postato, è che usato sul mio PC di casa che ha però 10 anni, ci mette un paio di secondi a darmi il risultato, e sapere che gira all'avvio di parecchi programmi non mi piace molto. Al lavoro però abbiamo dei PC molto più recenti, quindi spero che sia più reattivo.

Grazie, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Gennaio 19, 2022, 09:39:48 pm
Preview in Lazarus ..... commento il sorgente e lo posto.  ;D

EDIT: aggiunto progetto.

Thanks to: @coolshou https://github.com/coolshou (https://github.com/coolshou) for WLan api wrappers.
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Gennaio 20, 2022, 08:13:23 am
Grazie, appena ho tempo, tra oggi e domani gli do un occhio.

Per il momento, tengo in lista tra le possibili soluzioni, quella dell'istruzione "ping", testando dei vari valori restituiti quello dell'indirizzo IP.
A differenza dell'altro, sembra più veloce anche su un vecchio PC come il mio di casa.

Farò qualche prova, e poi vedrò quale mi conviene usare.

Grazie ancora, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: DragoRosso - Gennaio 20, 2022, 06:10:52 pm
Non ci avevo fatto molto caso, ma hai accennato ad un discorso di "tempo di esecuzione".

Devo farti una precisazione, che spero ti sarà utile: quando si ha a che fare con un qualsiasi risorsa di rete, qualunque essa sia, è da mettere in conto che ci posso essere dei ritardi nella esecuzione. In realtà non è l'esecuzione che ritarda, ma è semplicemente il tempo di attesa di accesso alla risorsa di rete, stabilito nella stragrande maggioranza delle volte da "norme" o modi d'uso consolidati.

Qualsiasi accesso ad una risorsa di rete (non proprio qualsiasi, diciamo un buon 99%) passa per lo stato di "connessione". Questo stato viene definito quando una ben determinata sequenza ha luogo. La sequenza include ad esempio i comandi ARP (interrogazione degli indirizzi IP di destinazione), i comandi DNS, i discovery ... etc ...

Per propria natura lo stack di rete di un sistema operativo esegue queste sequenze a tempo, in modo da mantenere sempre "reattivo" il sistema stesso e aggiornata la cache. Però, ad esempio, la prima volta che si accede ad una risorsa è normale che ci sia un tempo di ritardo, dovuto proprio all'esecuzione di tutte le sequenze per poter effettuare la connessione.

Potete verificarlo in modo banale proprio con un ping: fate un ping ad una risorsa a cui non avete avuto accesso prima (anche un indirizzo internet) e vedrete due effetti palesi:

1) il comando ping sarà "lento" a mostrare il primo risultato (alle volte secondi), nonostante il tempo indicato dal "risultato" non sia così alto;

2) il primo risultato mediamente ha un tempo più alto rispetto a quelli successivi.

Ciò è normale. E se ci sono di mezzo apparati radio potrebbe andare anche peggio.

Tutto questo per dirti che non devi aspettarti che magicamente un accesso ad una informazione di rete avvenga in modo istantaneo, ma che tale situazione potrebbe generare dei tempi di ritardo, e se questi avvengono nei programmmi, allora bisogna stare all'occhio.

Nel programma di test per la WLAN postato, ad esempio, c'è un passo dove viene eseguita (o meglio richiesta) la scansione. Lasciando perdere i dettagli tecnici sulla cosa, per avere quel risultato SI DEVONO ATTENDERE almeno 4 secondi prima di accedere ai risultati (elenco reti ad esempio), o bisognerebbe registrarsi ad una callback e attendere l'OK dalla funzione (che avverrà o più velocemente o dopo 4 secondi per timeout). Questo è deciso dal protocollo, imponendo ai dispositivi di rispondere entro questo tempo ad un "discovery" .... per farla breve.

Per un Bluetooth, questo tempo è di oltre 10 secondi ...

Quando io ho queste situazioni, prima di usare la funzione pongo il cursore nello stato di "calamaro"  :o ;D , ossia la rotellina che gira, riportandolo alla condizione normale quando la funzione ritorna. Ciò fà si che l'utente sia avvertito del blocco, rendendo il tutto anche più comprensibile all'utente stesso.

Ove ci sia consapevolezza che i ritardi possano essere importanti, meglio ancora proporre una "scritta visiva" tipo "operazione in corso, si prega di attendere".

Con la speranza di esserti stato di aiuto, ti saluto.
Ciao
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Gennaio 21, 2022, 07:58:32 am
Grazie !

Ciao, Mario
Titolo: Re:Solo Windows - Elenco reti o rete attuale
Inserito da: bonmario - Marzo 17, 2022, 08:35:43 am
Aggiungo questo, di cui hanno scritto un paio di giorni fa nel forum internazionale:
https://www.delphibasics.info/home/delphibasicsprojects/wifiscanner

Non trovo più la discussione dove ne parlavano ...

Ciao, Mario