Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Febbraio 19, 2019, 10:59:09 am

Titolo: Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 19, 2019, 10:59:09 am
Ciao ragazzi, è già qualche anno che ho per la testa di organizzare qualcosa di simile a teamviewer con lazarus. In teoria ho già stabilito il modo di trasferire le immagini del desktop al client remoto il tutto tramite pacchetti UDP (con certificazione di ricezione). La scelta dell'udp è dovuta al fatto che è più facile che non venga bloccato dai firewall. Avevo anche mezzo studiato il modo di comandare mouse e tastiera a distanza, ma non funziona bene sotto mac. Ora per mancanza di tempo devo fermarmi. Qualcuno vuole dare un occhiata al codice e portarlo avanti? Non fatevi illusioni, c'è del lavoro ma è ancora parecchio immaturo. Volontari?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: guest1752 - Febbraio 19, 2019, 12:38:34 pm
Progetto interessante direi.... Sarei curioso di vedere il meccanismo che hai usato per trasferire le immagini
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 19, 2019, 01:43:33 pm
Questa sera se riesco posto qui il codice.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 19, 2019, 03:21:37 pm
pare interessante, posta pure  :P
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 19, 2019, 04:30:52 pm
pare interessante, posta pure  :P

Non aspettarti nessuna meraviglia. E' relativamente semplice ed embrionale
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 19, 2019, 11:44:54 pm
Ecco qui il sorgente. Compilate e poi lanciate due isanzte sullo stesso computer su uno premete in successione i pulsanti "Popola dati server locale" e poi "start server". Sull'altro "popola dati client locale" e "start client"
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 19, 2019, 11:45:50 pm
Quando avete dato un occhiata se qualcuno vuole aiutare con il progetto me lo dica che spiego come portare avanti la cosa.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 20, 2019, 03:13:06 pm
gli sto dando un'occhiata, come dici tu è embrionale, ma ci sono diverse cosette interessanti
sbaglio o l'invio delle immagini con solo per differenza non è ancora a posto?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 20, 2019, 03:32:31 pm
gli sto dando un'occhiata, come dici tu è embrionale, ma ci sono diverse cosette interessanti
sbaglio o l'invio delle immagini con solo per differenza non è ancora a posto?
In realtà il calcolo della differenza funziona, però mi rimaneva un problema di trasmissione nel momento in cui qualcosa si disallineava. Vado a spiegarmi.

Invio l'immagine intera.
Invio la modifica e la applico (l'immagine risulta formalmente corretta)
Invio la modifica e la applico (l'immagine risulta formalmente corretta)
Invio la modifica e non la applico (a volte capitava e non ho capito perchè)
Invio la modifica e la applico (l'immagine risulta corrotta)

Inoltre se nonn ricordo male, la trasmissione viene cifrata con AES a 256 bit. Ho scritto quel programmino qualche settimana fa e non ricordo a memoria dove sono arrivato.

PS: Fa piacere aver stuzzicato la curiosità di uno sviluppatore diversamente giovane quale sei tu e con il relativo carico di esperienza.  ;D ;D
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 20, 2019, 03:36:40 pm
quindi se server e client non hanno la stessa versione dell'ultima immagine, alla scrittura successiva si disallinea il tutto
ci si può lavorare

per tastiera e mouse come sei messo?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 20, 2019, 03:41:08 pm
Pensavo di usare il package http://wiki.freepascal.org/MouseAndKeyInput

In modo che se faccio un keydown sull'immagine del desktop remoto o un mouse click lo invia al server attraverso un thread dedicato (basta duplicare e modificare uno di quelli che uso per l'invio delle immagini) e il server remoto lo esegue attraverso il pacchetto MouseAndKeyInput (che sembra non funzionare su cocoa allo stato attuale).

Solo che non ricordo se lo avevo già iniziato. Basta dare un occhiata al server.
Fatto questo poi c'è da scrivere il server per l'interscambio delle informazioni tra il pc che invia le immagini e quello che le riceve. Un po come fa team viewer. Di fatto non è di difficile implementazione, ma da solo non riesco a finirlo per mancanza di tempo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 20, 2019, 03:43:16 pm
Pensavo di usare il package http://wiki.freepascal.org/MouseAndKeyInput
...
(che sembra non funzionare su cocoa allo stato attuale)

questo può essere un problema, tu puoi controllare se funziona o no?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 20, 2019, 03:44:54 pm
Pensavo di usare il package http://wiki.freepascal.org/MouseAndKeyInput
...
(che sembra non funzionare su cocoa allo stato attuale)

questo può essere un problema, tu puoi controllare se funziona o no?
Sono io che ho verificato la cosa. Appena possibile scriverò sul forum principale e chiederò lumi. Però al momento si può pensare di portarlo avanti per windows e linux (che comunque non fa schifo). Al massimo su mac si usa parallel per far funzionare la versione windows del programma.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 20, 2019, 03:48:03 pm
un'ultima cosa il server spedisce con2 thread: (1) TSendPingThread e (2) TSendDesktopThread

a che serve il TSendPingThread?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 20, 2019, 03:49:06 pm
Quando si dedice di fare il server per l'interscambio delle informazioni di connessione bisognerà usare una connessione cifrata aes 256 con scambio di chiavi dovuto ad una cifratura asimmetrica. Per fare ciò basta guardare l'esempio a questo url nel primo messaggio:

https://www.lazaruspascal.it/index.php?topic=2099.0
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 20, 2019, 04:27:31 pm
quindi per ora il TSendPingThread non servirebbe ma è in previsione di "sentire" se c'è il server per l'interscambio delle informazioni di connessione?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 20, 2019, 10:20:48 pm
No il TSendPingThread  serve per creare l'UDP hole punching ovvero il modo con cui non farsi fermare dal firewall.

Inoltre è quello che serve al client per capire se la connessione è attualmente su oppure no.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 26, 2019, 08:38:47 am
Allora qualcuno ha avuto modo di pensare alla mia proposta di portare avanti tale progetto?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: guest1752 - Febbraio 26, 2019, 09:54:55 am
ciao, a me piace molto l'idea, ma ho poco poco tempo questo periodo e ho visionato il codice molto velocemente.
Lo scambio di immagini potrebbe essere una parte interessante per me:
stavo ragionando ieri su un progetto di tanti anni fa in delphi dove in pratica giocavo con le GDI+ e il device context di windows ecc... ec.. .comunque alla fine l'idea che ho è che per minimizzare lo scambio dei dati si potrebbe dividere lo schermo in n quadrati e far passare solo le zone dello schermo diverse, come dicevi te. Interesssante pero.....
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 26, 2019, 02:49:41 pm
il progetto è interessante
si potrebbe dare una mano ma non posso fare di sicuro il manutentore del progetto :)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 26, 2019, 02:56:19 pm
Si accettano anche aiuti, posso anche mantenerlo io ma avere una mano da voi. Ovviamente non in questo momento, ma quando saremo tutti un po meno pressati dal lavoro.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 26, 2019, 03:09:48 pm
si, direi che aspettare tempi meno pressanti è un bene per tutti :)
intanto potresti provare a dividerlo in sottoprogetti
esempio:
- struttura principale (es: gestione thread per video, chat, scambio file, ...)
- gestione hole punching
- gestione astratta invio/ricezione dati come stringa
- gestione invio/ricezione video
- gestione invio/ricezione chat
- gestione invio/ricezione file

in questo modo sarà più facile dare una mano per chi potrà
:)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: guest1752 - Febbraio 26, 2019, 04:08:56 pm
si, direi che aspettare tempi meno pressanti è un bene per tutti :)
intanto potresti provare a dividerlo in sottoprogetti
esempio:
- struttura principale (es: gestione thread per video, chat, scambio file, ...)
- gestione hole punching
- gestione astratta invio/ricezione dati come stringa
- gestione invio/ricezione video
- gestione invio/ricezione chat
- gestione invio/ricezione file

in questo modo sarà più facile dare una mano per chi potrà
:)

in effetti è un'ottima idea dividerlo in sottoprogetti.
Mi stavo chiedendo, visto che ci sono già programmi famosi che fanno egregiamente il loro lavoro, bisognerebbe pensare a delle features che gli altri non hanno ( non mi viene in mente niente per ora ) e  definire quale sia sistema il sistema operativo target.

Nel caso di un sistema operativo come Windows si potrebbero usare delle api dirette per renderlo veloce, ma se il progetto deve girare anche su linux o altro bisogna ragionare bene sulla struttura del progetto.
Cosa ne pensate?



Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 26, 2019, 04:40:19 pm
Il codice deve essere mantenibile e multipiattaforma, quindi escludo a priori api del singolo sistema operativo se proprio non sono costretto, tipo il controllo del mouse per cocoa.

Per il discorso cosa fare per renderlo appetibile il gioco è molto semplice: gratuito + social.

Il renderlo social lo spiegherò quando sarà il momento, non vorrei che qualcuno mi rubasse l'idea solo leggendola sul forum.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Febbraio 27, 2019, 08:25:29 am
Il codice deve essere mantenibile e multipiattaforma, quindi escludo a priori api del singolo sistema operativo se proprio non sono costretto, tipo il controllo del mouse per cocoa.

che sia multipiattaforma è un bene, forse oggi le app che non sono tali non hanno più tanto senso
per il mouse per cocoa, se non ci sono alternative valide, nulla ti vieta di usare le api dedicate: basta che incapsuli il codice dedicato con delle direttive

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Febbraio 27, 2019, 08:58:48 am
Si anche io penso che le app singolo OS non hanno più molto senso. Detto questo sono riuscito ad ottenere qualcosa con il mouse di cocoa solo con il c. Ma se non ricordo male si possono inglobare delle librerie c in lazarus. Nella peggiore delle ipotesi faccio eseguire i comandi come un eseguibile esterno. Però diciamo che prima è importante che funzioni su win e linux con il pacchetto standard di lazarus. Poi quando abbiamo sistemato quello io simulo le stesse cose anche per cocoa. Magari la gestione del mouse e della tastiera l'astraiamo così da poterlo gestire meglio.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 28, 2020, 12:02:41 pm
Salve,
nessun avanzamento di questo interessante progetto ?
Anche io, come xinyiman, penso da anni a un progetto simile per poter controllare la buona esecuzione dei prg installati presso i nostri clienti ma ho sempre desistito per mancanza di tempo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 28, 2020, 04:07:56 pm
Ciao, il progetto al momento è fermo, avevo settimane fa ripreso il tutto riscrivendolo da zero. Per il momento ho solo riscritto la parte per la condivisione dello schermo.

1. Ho suddiviso lo schermo in 4 parti
2. Trasmetto le singole 4 parti in rete con il protocollo UDP
3. Quando ricevo l'immagine parziale lo ricompongo nel mio programma

Funziona su mac e su windows, ma non su ubuntu. Non ha alcun tipo di crittografia al momento e ho fatto test solo in rete locale. Magari in futuro lo riprendo, ora sono davvero oberato di lavoro.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 28, 2020, 04:42:27 pm
Grazie per aver risposto così rapidamente.
Ho provato la versione che avevi postato e funziona. Una buona base di partenza sulla quale si può lavorare per aggiungere ciò che manca. Se hai riscritto buona o tutta parte del programma conviene aspettare che tu renda disponibile la nuova versione prima di metterci mano.
Avendo affrontato il problema già tempo fa per una necessità molto più ridotta rispetto a quella che hai in animo di produrre, occorre trasmettere su un layer HTTP per passare attraverso il firewall che, normalmente non chiude la porta 80 dedicata al web: a quello che so, Teamviewer e altri prodotti simili sfruttano questa tecnica.

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 28, 2020, 06:17:14 pm
Guarda penso proprio che TeamViewer funziona con la tecnica dell' Udp Hole Pouching. Comunque non ho nessun problema a condividere l'ultima versione.

Attenzione solo ad una cosa, le custom options

-dUseCThreads
-dNoWriteDebug
-dGetScreenInMainThread

La prima non va toccata, la seconda mi serviva per dare del debug usando la console, basta cambiarla in -dWriteDebug.
La terza invece se rimossa fa si che il desktop venga preso nei singoli thread (funziona su mac os e windows) mentre con -dGetScreenInMainThread dovrebbe funzionare con ubuntu (cosa che al momento non avviene).

Inoltre in uMain ci sono queste due costanti


const
     COUNT_ROW_ZONE_SCREEN = 1;
     COUNT_COL_ZONE_SCREEN = 1;

che servono a cambiare il numero di parti con cui suddivido il monitor e quindi il numero di thread secondari. Provate ad impostarlo su


const
     COUNT_ROW_ZONE_SCREEN = 2;
     COUNT_COL_ZONE_SCREEN = 2;
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 29, 2020, 06:01:02 pm
Ho aggiornato il sorgente, ora è impostato per funzionare su Windows. Basta compilarlo, aprirne due istanze, su una premere il tasto invert e poi premere start su entrambi.

Avevo dimenticato anche di parlarvi della custom option: MyVersion. Per funzionare su windows c'è bisogno della MyVersion impostata.

Spero di essere stato d'aiuto.

PS: il sorgente ha due requisiti LCL e Laz_Synapse
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Ottobre 29, 2020, 07:29:38 pm
stranamente quando apro il progetto (lazarus 2) i sorgenti non sono visibile
che versione di lazarus usi?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 29, 2020, 09:35:56 pm
Ho salvato e compilato con Lazarus 2.1.0 r61484 FPC 3.3.1 i386-win32-win32/win64
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 30, 2020, 09:39:07 am
nomorelogic, capita anche a me.
Ho ricreato il progetto con Lazarus 2.0.8.
Ti allego il progetto di xinyiman dove ho sostituito i files .lpr e .lpi.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Ottobre 30, 2020, 10:38:12 am
ok grazie :)


Edit:
forse sbaglio qualcosa...
lo sto provando in Win10

lancio 2 istanze
sulla 1, clicco invert e poi start e l'applicazione si chiude immediatamente
sulla 2, clicco start ma mi viene mostrato solo un rettangolo nero (evidentemente la 1 non c'è...)

sbaglio io o c'è un errore?


Edit 2:
in effetti la 1 non si chiude ma si minimizza e rimane in esecuzione
la 2 comunque mostra sempre un rettangolo nero
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 30, 2020, 10:59:43 am
Succede anche a me e anche io uso W10.
Sto dando una occhiata al programma per vedere se riesco a isolare il problema e trovarne una possibile soluzione condivisibile con xinyiman.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 30, 2020, 12:08:57 pm
ok grazie :)


Edit:
forse sbaglio qualcosa...
lo sto provando in Win10

lancio 2 istanze
sulla 1, clicco invert e poi start e l'applicazione si chiude immediatamente
sulla 2, clicco start ma mi viene mostrato solo un rettangolo nero (evidentemente la 1 non c'è...)

sbaglio io o c'è un errore?


Edit 2:
in effetti la 1 non si chiude ma si minimizza e rimane in esecuzione
la 2 comunque mostra sempre un rettangolo nero

Per curiosità cosa succede se prima dai start all'istanza 2 e poi dai start all'istanza 1 (quella con l'invert)?
State usando la seconda versione che ho allegato?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Ottobre 30, 2020, 01:18:19 pm
sto usando quella rifatta da mbisax

ora non riesco a fare le prove, nel pomeriggio ti faccio sapere
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 30, 2020, 02:21:48 pm
Per curiosità cosa succede se prima dai start all'istanza 2 e poi dai start all'istanza 1 (quella con l'invert)?
State usando la seconda versione che ho allegato?


Si, sto usando la seconda versione.
Ho provato il tuo suggerimento ma si comporta ugualmente. Lato server, form nera.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Ottobre 30, 2020, 04:58:15 pm
sulla 1, clicco invert e poi start e l'applicazione si chiude immediatamente

In realtà non si chiude ma passa nella try icon, minimizzata.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Ottobre 30, 2020, 05:09:57 pm
Per curiosità cosa succede se prima dai start all'istanza 2 e poi dai start all'istanza 1 (quella con l'invert)?

stesso comportamento
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Ottobre 30, 2020, 06:32:48 pm
Sono riuscito a ritagliarmi mezz'oretta ed ora gira anche su ubuntu. Da qui potete scaricare il sorgente che ho compilato (che non le dovute modifiche sulle custom options) per

Mac Os
Ubuntu
Windows

www.lazaruspascal.it/download_personali/korg_remote_desktop.zip

Contiene anche gli eseguibili così potete provarlo senza dover compilare nulla. Guardate nella cartella bin.

Fatemi sapere se funziona (occhio solo a non avere nessun firewall attivo che blocca i pacchetti UDP).

Sicuramente non è un fulmine di guerra, diciamo che è un esperimento per capire come funzionano certi meccanismi.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 02, 2020, 10:28:13 am
ho provato con i binari inclusi nel tuo file ed ha funzionato

ho provato tra win e linux ed ha funzionato
in effetti è un po' lentino ma è un'ottima partenza ;)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: mbisax - Novembre 02, 2020, 11:36:13 am
Invio i progetti con i .lpi modificati e corretti per compilare su Windows e Linux un eseguibile funzionante.
Grazie XinYiMan!
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 03, 2020, 06:36:32 pm
Se scaricate il file al link: www.lazaruspascal.it/download_personali/korg_remote_desktop.zip

potrete provare la nuova versione. Praticamente ho implementato la compressione e la cifratura dei dati.

Ora è decisamente più veloce. Tenete presente una cosa.

In base al vostro tipo di connessione potete incrementare il valore del "packet char dimension". Io a casa per esempio lo porto a 59000. Mentre in un'altro posto dove condivido la connessione con un'altro apparecchio (che probabilmente mi fa da collo di bottiglia) devo tenerla a 8000.

Le custom options sono come seguono per windows.

-dUseCThreads
-dWriteDebug
-dMyVersion

//usato per inviare i dati come tmemory e non come tstring
-dSendWithMemory

//usato per comprimere i tmemory
-dSendWithCompression

//usato per windows e mac
-dNoGetScreenInMainThread

//usato per ubuntu
//-dGetScreenInMainThread

Le dipendenze sono rimaste invariate:
LCL
Laz_synapse

Ovviamente sono ancora lontano dal vedere in modo fluido un video, ma questo è anche dovuto al fatto che manda i dati splittando il monitor in più parti.
Per favore, provatelo e fatemi sapere.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 04, 2020, 09:47:52 am
una domanda, quando usi la compressione, prima comprimi e poi converti in base64 o viceversa?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 12:00:21 pm
Fondamentalmente la compressione e successivamente la crittografia vengono effettuate un attimo prima di mandare i dati sulla rete. Quindi dopo la conversione a B64. Anche perchè l'immagine che manda è un jpeg quindi già compresso di suo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 04, 2020, 12:28:25 pm
comprimere una stringa base64 sembra che non dia risultati eccezionali

ho fatto un po' di calcoli sulle stringhe inviate
dopo Len1 c'è la lunghezza dei dati da inviare (quindi dovrebbe essere la lunghezza B64)
dopo Len2 c'è la lunghezza dopo la compressione

come vedi quando la stringa è piccola (32 byte), addirittura non conviene comprimere (diventano 43 byte)
quando la stringa B64 è più grande, a volte conviene, a volte no

se non ho fatto errori, alla fine, dopo 100 invii la compressione ha ridotto i dati del 9.11%

sotto ci sono i miei calcoli
se vuoi ti mando le modifiche con cui ho fatto questi conteggi così che puoi verificare anche tu


Codice: [Seleziona]
Nr. 1 - Len1 32- Len2 43
Nr. 2 - Len1 32- Len2 43
Nr. 3 - Len1 32- Len2 43
Nr. 4 - Len1 32- Len2 43
Nr. 5 - Len1 16- Len2 24
Nr. 6 - Len1 16- Len2 24
Nr. 7 - Len1 16- Len2 24
Nr. 8 - Len1 16- Len2 24
Nr. 9 - Len1 16- Len2 24
Nr. 10 - Len1 16- Len2 24
Nr. 11 - Len1 16- Len2 24
Nr. 12 - Len1 16- Len2 24
Nr. 13 - Len1 856- Len2 844
Nr. 14 - Len1 856- Len2 844
Nr. 15 - Len1 856- Len2 844
Nr. 16 - Len1 856- Len2 844
Nr. 17 - Len1 16- Len2 24
Nr. 18 - Len1 16- Len2 24
Nr. 19 - Len1 8016- Len2 7599
Nr. 20 - Len1 8016- Len2 7996
Nr. 21 - Len1 8016- Len2 5317
Nr. 22 - Len1 8016- Len2 6930
Nr. 23 - Len1 8016- Len2 3259
Nr. 24 - Len1 8016- Len2 8027
Nr. 25 - Len1 1104- Len2 1115
Nr. 26 - Len1 16- Len2 24
Nr. 27 - Len1 16- Len2 24
Nr. 28 - Len1 8016- Len2 7190
Nr. 29 - Len1 8016- Len2 6128
Nr. 30 - Len1 8016- Len2 4553
Nr. 31 - Len1 8016- Len2 6085
Nr. 32 - Len1 3664- Len2 3675
Nr. 33 - Len1 16- Len2 24
Nr. 34 - Len1 16- Len2 24
Nr. 35 - Len1 8016- Len2 7995
Nr. 36 - Len1 8016- Len2 8027
Nr. 37 - Len1 8016- Len2 7290
Nr. 38 - Len1 8016- Len2 5972
Nr. 39 - Len1 8016- Len2 7485
Nr. 40 - Len1 8016- Len2 8008
Nr. 41 - Len1 8016- Len2 7936
Nr. 42 - Len1 8016- Len2 7900
Nr. 43 - Len1 8016- Len2 7812
Nr. 44 - Len1 8016- Len2 7818
Nr. 45 - Len1 8016- Len2 7764
Nr. 46 - Len1 8016- Len2 7763
Nr. 47 - Len1 584- Len2 595
Nr. 48 - Len1 16- Len2 24
Nr. 49 - Len1 16- Len2 24
Nr. 50 - Len1 8016- Len2 7954
Nr. 51 - Len1 8016- Len2 8027
Nr. 52 - Len1 8016- Len2 7851
Nr. 53 - Len1 8016- Len2 7832
Nr. 54 - Len1 8016- Len2 7888
Nr. 55 - Len1 8016- Len2 8027
Nr. 56 - Len1 8016- Len2 7094
Nr. 57 - Len1 8016- Len2 7958
Nr. 58 - Len1 8016- Len2 7974
Nr. 59 - Len1 8016- Len2 7750
Nr. 60 - Len1 8016- Len2 7126
Nr. 61 - Len1 8016- Len2 7750
Nr. 62 - Len1 8016- Len2 8027
Nr. 63 - Len1 8016- Len2 8027
Nr. 64 - Len1 8016- Len2 7813
Nr. 65 - Len1 5608- Len2 5277
Nr. 66 - Len1 16- Len2 24
Nr. 67 - Len1 16- Len2 25
Nr. 68 - Len1 8016- Len2 7465
Nr. 69 - Len1 8016- Len2 7547
Nr. 70 - Len1 8016- Len2 6396
Nr. 71 - Len1 8016- Len2 7495
Nr. 72 - Len1 8016- Len2 7520
Nr. 73 - Len1 8016- Len2 7518
Nr. 74 - Len1 8016- Len2 7524
Nr. 75 - Len1 8016- Len2 7505
Nr. 76 - Len1 8016- Len2 7523
Nr. 77 - Len1 8016- Len2 7153
Nr. 78 - Len1 6520- Len2 6531
Nr. 79 - Len1 16- Len2 24
Nr. 80 - Len1 16- Len2 25
Nr. 81 - Len1 8016- Len2 6571
Nr. 82 - Len1 8016- Len2 5114
Nr. 83 - Len1 8016- Len2 4607
Nr. 84 - Len1 8016- Len2 6976
Nr. 85 - Len1 392- Len2 403
Nr. 86 - Len1 16- Len2 24
Nr. 87 - Len1 16- Len2 25
Nr. 88 - Len1 8016- Len2 8002
Nr. 89 - Len1 8016- Len2 8027
Nr. 90 - Len1 8016- Len2 7251
Nr. 91 - Len1 8016- Len2 5430
Nr. 92 - Len1 8016- Len2 7252
Nr. 93 - Len1 8016- Len2 7997
Nr. 94 - Len1 8016- Len2 7874
Nr. 95 - Len1 8016- Len2 7821
Nr. 96 - Len1 8016- Len2 7664
Nr. 97 - Len1 8016- Len2 7772
Nr. 98 - Len1 8016- Len2 7101
Nr. 99 - Len1 6904- Len2 6609
Nr. 100 - Len1 16- Len2 24
Tot Send = 100 - base64 bytes = 525688 - sended bytes = 479365 - ratio =  9.1188119188568129E-001


Edit:
forse bisognerebbe comprimere +crittare prima e convertire in B64 poi
però il JPEG in effetti è già compresso
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 01:53:11 pm
Grazie mille della prova, verificherò nei prossimi giorni e vi farò sapere.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 04, 2020, 02:37:54 pm
Ciao.Perchè invii una stringa?Non puoi mandare un array di byte?(Forse è una domanda alla quale hai già risposto ma me la sono persa)In base 64 raddoppi la dimensione del blocco da inviare.



Stilgar
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 03:08:55 pm
Ciao Stilgar, la risposta è semplice quanto banale. Non ho trovato degli esempi per farlo fare ad ararat synapse. Se sai darmi qualche imbeccata è ben accetta.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 04, 2020, 03:23:02 pm
forse sto prendendo un abbaglio ma tu spedisci con SendStream che accetta un parametro di tipo TStream
per me va già bene

Codice: [Seleziona]
unit blcksock;

...

{:Send content of stream to socket. It using @link(SendBlock) method}
    procedure SendStream(const Stream: TStream); virtual;   

...

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 03:33:07 pm
Bhe allora il problema è a monte. Se avete guardato il codice vedrete che io converto in base64 per creare N blocchi di stringhe lunghe massimo un TOT di caratteri. Questo perchè il pacchetto udp deve essere lungo al massimo N byte. Siccome per mandarlo devo scomporlo devo essere altrettanto in grado di ricomporlo quando le parti arrivano a destinazione. Sicuramente esiste un modo più furbo di quello che ho usato io.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 04, 2020, 04:46:14 pm
qual è la lunghezza massima che hai usato per un pacchetto udp?
in giro trovo un sacco di notizie diverse
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 06:27:01 pm
Allora, cercando di trovare la strada migliore ho deciso di provare a risolvere usando indy al posto di synapse. Ho creato un esempio semplice semplice.
Unica dipendenza oltre a LCL è indy.

Compilate il programma. Premete prima su button2 e poi su button1.

Vi dirà "package size too big" quando arriva al punto del sendbuffer.
Ovviamente supera la dimensione di 65507 byte. Qualcuno mi spiega come splittare il tmemorystream in pezzi più piccoli così da fare un for ed inviarli separatamente?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 04, 2020, 07:03:07 pm
Puoi creare N memory stream.
Poi usi i puntatori per spostare alla posizione che ti interessa, con il size dello stream.
Così non dovresti spostare nemmeno un bit in memoria.
Altrimenti ti estendi il tuo memory stream per fare quello che ti interessa ;)

Stilgar
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 07:48:11 pm
Stilgar non ho capito. Puoi modificare l'esempio?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 04, 2020, 10:21:26 pm
Ho provato a modificare il test come dice Stilgar. Sarà l'ora ma non mi funziona. Chi gli butta un occhio e mi dice quale caxxata ho fatto?
Grazie
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 05, 2020, 08:11:58 am
Ci butto un occhio
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 05, 2020, 08:24:48 am

Ciao.
Non conosco Indy.
Quindi non capisco cosa ci sia che non va.




Il ragionamento sui thread e il memory stream l'avevo fatto per Synapse.


Forse Indi ha qualche componente "sofisticato" per eseguire invio/lettura dei dati.




Stilgar
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 05, 2020, 08:49:14 am
secondo me il problema non è synapse

qualcosa del genere potrebbe andare
è una classe che splitta un maxi-pacchetto in tanti pacchetti di una dimensione minore
poi l'invio dovrebbe inviarli tutti

come la vedete?

Codice: [Seleziona]

const
  MAXSIZEPACKET = 4096;


type
  TPacketData = array [1..MAXSIZEPACKET] of char;
 
  TSplittedPacket = record
     ID: Int64;           // identifica un unico pacchetto
     PacketNo,            // numero dello split corrente
       TotPackets: Int64; // totale split
     Size: Int64;         // dimensioni dati in Data (per ultimo pacchetto)
     Data: TPacketData;
  end;

  TSplittedPackets = array of TSplittedPacket;


class TSplitedPacket ....
   PacketList: TSplittedPacket;
private
   procedure DoSplitPacket(AStream: TStream);
   
public
   procedure LoadPacket(AStream: TStream);

end;


procedure TSplitedPacket.LoadPacket(AStream: TStream);
var need: Int64;
begin
   SetLength(PacketList, (Astream.Size div MAXSIZEPACKET) + 1);
   DoSplitPacket(AStream);
end;


procedure TSplitedPacket.DoSplitPacket(AStream: TStream);
var scan: Int64;
    SplittedBytes: Int64;
begin
   SplittedBytes:=0;
   for scan := 0 to length(PacketList) - 1 do begin
       PacketList.ID = "numero invio";
       PacketList.PacketNo := scan;
       PacketList.TotPackets := length(PacketList);
       PacketList.Data := ...
   end;
end

Edit:
ho corretto  il codice che presentava qualche errore


Edit2:
l'invio dovrebbe inviare una struttura TSplittedPacket (serializzata in qualche modo)
così da poter ricostruire il pacchetto originale usando PacketNo e TotPackets
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 05, 2020, 01:02:40 pm
Questa mattina mi sono svegliato alle 5 e la testa girava su quel problema. Alla fine mi sono alzato dopo pochi minuti e l'ho risolto con synapse. Questa sera quando torno a casa vi aggiorno, questa mattina non avevo tempo, dovevo andare al lavoro quando ho finito. Questa sera faccio dei test e vi condivido il risultato
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 05, 2020, 05:22:04 pm
Ciao.


Avrei una proposta scandalosa.


Al posto di avere un thread per comando da inviare tra le macchine.


Usare il Command Pattern?


Allego un possibile esempio di quello che intendo.
(Compila nn so se funziona).


Stilgar



Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 05, 2020, 06:19:32 pm
Ciao a tutti, ecco un semplice esempio che manda i jpg scomposti e poi li ricompone. Funziona se non cifro la connessione.
Per fare dei test basta che aprite due istanze del programma.
Su una premete il pulsante "Start server jpg" (che dura solo 4/5 secondi) e poi velocemente sull'altra istanza premete "Send Jpg".
Se l'unico campo Edit (all'avvio è autopopolato con il testo "mypwd") è vuoto funziona, altrimenti no.

Non capisco cosa non funziona (in questo momento ho gli occhi che si chiudono che sono cotto). Inoltre il pulsante button6 simula la crittografia senza mandarlo sulla rete (e funziona) quindi non capisco cosa sbaglio.

Testato sia su mac che su ubuntu.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 05, 2020, 06:20:04 pm
Ciao.


Avrei una proposta scandalosa.


Al posto di avere un thread per comando da inviare tra le macchine.


Usare il Command Pattern?


Allego un possibile esempio di quello che intendo.
(Compila nn so se funziona).


Stilgar
Giuro che domani sera lo guardo, questa sera sono una ameba.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 06, 2020, 05:40:37 pm
Ho capito il problema. La crittografia blowfish mi cambia la dimensione dell'output, mentre per me è importante che rimanga uguale. Userò un AES CRT a 128 bit. Vi tengo aggiornati sugli sviluppi
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 07, 2020, 05:42:53 pm
Ecco a voi la nuova versione. Migliorata e più veloce (ora le immagini non sono mandate in base64). Stilgar, ho guardato il tuo esempio ma non ho capito come questo mi permetterebbe di bypassare l'uso dei thread.

www.lazaruspascal.it/download_personali/korg_remote_desktop.zip

Ora c'è una dipendeza in più: dcpcrypt

Ditemi cosa ne pensate. Ci sono anche gli eseguibili per

Ubuntu
Win32
Win64
Mac OS X (cocoa)

Ho già imbastito anche la trasmissione del mouse remoto (ma al momento non influisce, scrive solo le coordinate nella caption della form (che invia il proprio desktop).
Come già detto ora non usa più la crittografia blowfish, ma aes a 128 bit. Se la password è vuota viene mandato il dato in chiaro.

All'avvio ho aggiunto la possibilità di far vedere nella memo iniziale l'indirizzo IP per la rete locale e quello per l'accesso ad internet. (questo per fare test su macchine diverse).

Ho anche tolto la possibilità di dimensionare il pacchetto con la barra. Ora c'è una checkbox (jumbo packet) che se è flaggata manda pacchetti di 65507 byte, altrimenti li manda di 8190.

Fatemi sapere il vostro parere.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Novembre 08, 2020, 11:45:19 am
Stilgar, ho guardato il tuo esempio ma non ho capito come questo mi permetterebbe di bypassare l'uso dei thread.
I thread possono essere in numero limitato se usi il command pattern.
Adesso, se ho capito il la struttura del progetto, hai un thread che comunica con il peer tra le macchine.
Uno in lettura e uno in scrittura per ogni comando.
Potresti arrivare ad avere 1 solo thread per la gestione della comunicazione, al posto di avere il thread per il ping e per la gestione delle immagini.
Stilgar

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 08, 2020, 12:35:26 pm
 Allo stato attuale uso 4 thread x inviare e ricevere le immagini, perché suddivido il monitor in 4 parti. Più un thread per tutte le altre comunicazioni.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 11, 2020, 09:43:39 pm
Ciao a tutti. Ho fatto delle aggiunte ed ho aggiornato il programma.

Link: www.lazaruspascal.it/download_personali/korg_remote_desktop.zip

Ora sono queste le dipendenze

LCL
laz_synapse
dcpcrypt
LazMouseAndKeyInput (se usate cocoa, usate la versione che trovate a questo link: www.lazaruspascal.it/download_personali/mouseandkeyinput_cocoa_support.zip)

Ho anche aperto un 3d sul forum internazionale, in modo da trovare qualcuno che vuole contribuire al progetto. Questo il link: https://forum.lazarus.freepascal.org/index.php?topic=52110.msg383428#msg383428
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 12, 2020, 08:35:29 am
penso che dovresti mettere su un repository da qualche parte ;)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 12, 2020, 08:46:55 am
L'obbiettivo è quello, ma prima voglio risolvere il fatto che in lan lavora bene e in wan non funziona.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 12, 2020, 06:58:21 pm
Ho capito cosa sbaglio. Non ho implementato correttamente UDP Hole Punching.
Manca ancora un software "controller" raggiungibile sempre. Nel week end lo implemento se riesco e poi vi aggiorno. Intanto se qualcuno volesse darmi dei feedback sul lavoro in lan ne sarei davvero felice.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 13, 2020, 08:44:20 am
mi puoi elencare le direttive che devo mettere per linux per favore?

Edit:
alla fine le ho trovate le metto quì per documentazione

-dUseCThreads
-dNoWriteDebug
-dGetScreenInMainThread
-dMyVersion
-dFilterFromIpPort

Edit2:
ora in lan è molto più veloce della vecchia versione
aspettiamo la versione wan :)

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 15, 2020, 05:00:46 pm
Eccomi qui, volevo solo avvisarvi che non ho aggiornato il software come avevo detto. Ho fatto delle modifiche, ma non sono riuscito ad implementare l'UDP Hole Punching.
Ho creato il server controller (che funziona correttamente) perchè permette ai client colleggati di ottenere gli ip e le porte dei client remoti, ma quando provo ad instaurare la connessione non funziona. Inizio ad essere disperato perchè vi ho passato sopra tutto il week end senza cavarne un ragno dal buco.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 15, 2020, 05:11:08 pm
C'è una cosa che non capisco. Ipotizziamo che ho i due client che si sono già scambiati le informazioni tramite il controller. Ipotizziamo che il client A abbia un indirizzo ip 23.6.141.2 e porta 5000 mentre il client B ha un indirizzo 35.7.121.15 e porta 1926.

Il client A inizia a mandare pacchetti all'indirizzo 35.7.121.15:1926
Il client B inizia a mandare pacchetti all'indirizzo 23.6.141.2:5000

poi ognuno dei client si mette in ascolto e riceve i pacchetti che aveva mandato.
Il client A riceve i pacchetti generati da 35.7.121.15:1926
Il client B riceve i pacchetti generati da 23.6.141.2:5000

Ma non capisco come questo possa accadere.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 16, 2020, 11:21:21 am
non so se ho capito il problema ma ci provo

quando dici "si sono già scambiati le informazioni" intendi in passato ed ora ci riprovano con gli stessi parametri?

perché se è così è chiaro che non funziona, quello che chiami "controlloer" stabilisce una comunicazione sia con A che con B e questo gli permette di avere le autorizzazioni per passare attraverso i vari firewall

quindi il tunnel è valido solo finché non si chiude quella comunicazione: se serve un'altra comunicazione serve un altro intervento del controller

spero di aver interpretato bene la tua domanda :)



Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 16, 2020, 07:30:24 pm
Ciao a tutti. Penso di aver capito il problema. Il mio programma funziona, il problema è che il mio NAT è di tipo bidirezionale.
In un tipo di nat non bidirezionale quando il client A si collega al controller comunica ip e porta che verranno comunicate al client B e tutto funzionerà, perchè il client A userà sempre quell'ip e quella porta.
In un nat bidirezionale la porta comunicata al controller è diversa da quella usata per il P2P con il client B. Ora ci ho ragionato un pochino, e sembrerebbe che ho solo due strade.

1. Il client A fa una scansione completa delle porte del client B fino a quando non riesco ad accoppiare le comunicazioni tra i client.
2. Chiedo al router la tabella NAT per le mie connessioni verso l'esterno (non ho idea di come si faccia)

Chiedo se secondo voi ci sono strade alternative o se mi aiutate a realizzare il punto 2.

Grazie mille
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 16, 2020, 07:56:32 pm
Ovviamente nel caso dovessi "scansionare le porte", partirei da quelle vicine a quelle usate per la comunicazione con il controller. Però non è detto che apra le porte in maniera consecutiva.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 17, 2020, 04:33:46 pm
la scansione delle porte non mi pare onestamente una buona soluzione

intanto la domanda:
perché non è praticabile che B risponda sullo stesso socket da cui riceve i messaggi di A?


cmq per evitare la scansione, così come A comunica al controller IP e porta che poi verranno consegnate a B
allo stesso modo B potrebbe dare i propri IP e porta al controller in modo che li possa girare ad A

qualcosa di simile alle stanza delle chat insomma
A, B e chiunque altro possono entrare in comunicazione grazie all'ID di una stanza che poi è la chiave per scambiarsi IP/Porta
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 17, 2020, 06:56:47 pm
la scansione delle porte non mi pare onestamente una buona soluzione

intanto la domanda:
perché non è praticabile che B risponda sullo stesso socket da cui riceve i messaggi di A?


cmq per evitare la scansione, così come A comunica al controller IP e porta che poi verranno consegnate a B
allo stesso modo B potrebbe dare i propri IP e porta al controller in modo che li possa girare ad A

qualcosa di simile alle stanza delle chat insomma
A, B e chiunque altro possono entrare in comunicazione grazie all'ID di una stanza che poi è la chiave per scambiarsi IP/Porta
Infatti la scansione non è praticabile per lentezza, era solo una ipotetica soluzione concettuale.
Allo stato attuale già faccio quello che dici

Il client A comunica con il controller che si salva il suo indirizzo ip e le sue porte
Il client B comunica con il controller che si salva il suo indirizzo ip e le sue porte
Il client A chiede i dati del client B al controller, che ovvimente le restituisce
Il client B chiede i dati del client A al controller, che ovvimente le restituisce

A prova a mandare dei pacchetti verso B
B prova a mandare dei pacchetti verso A

Sfortunatamente a casa mia non funziona se il controller è su internet, fortunatamente funziona se il controller si trova nella rete locale. Quindi questo porta a pensare due cose

1. Il mio router di casa (vodafone station revolution) adotta un NAT bidirezionale (che fa si che le porte vengono cambiate in funzione dell'endpoint, a prescindere dalla sorgente).

2. Sbaglio qualcosa io

Onestamente non so più dove sbattere la testa. Questa sera sul tardi se riesco, riaggiorno i sorgenti e "chiedo aiuto dal pubblico a casa".
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 18, 2020, 08:52:38 am
Sfortunatamente a casa mia non funziona se il controller è su internet, fortunatamente funziona se il controller si trova nella rete locale.

hai pensato al fatto che se il controller è su internet mentre A e B sono sulla stessa lan, il controller deve:
- passare ad A l'indirizzo di B dove l'IP è interno alla lan
- passare a B l'indirizzo di A dove l'IP è interno alla lan


esempio:
A in una lan ha IP 192.168.1.150 e porta 1234
B stessa lan ha IP 192.168.1.151 e porta 6789

A comunica con il controller e il controller registra l'indirizzo pubblico, esempio 79.124.28.125 porta 456
B comunica con il controller e il controller registra l'indirizzo pubblico, esempio 79.124.28.125 porta 741

se il controller deve mettere in comunicazione A e B, visto che questi 2 sono nella stessa lan deve:
- trasmettere ad A che B lo trova con IP 192.168.1.151 e porta 6789
- trasmettere a B che A lo trova con IP 192.168.1.150 e porta 1234


quindi il controller deve, per ogni client, conoscere sia IP/Porta pubblici che interni alla rispettiva LAN

detto questo potrebbe essere il firewall della vodafone  :P
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 18, 2020, 09:29:56 am
Sfortunatamente a casa mia non funziona se il controller è su internet, fortunatamente funziona se il controller si trova nella rete locale.

hai pensato al fatto che se il controller è su internet mentre A e B sono sulla stessa lan, il controller deve:
- passare ad A l'indirizzo di B dove l'IP è interno alla lan
- passare a B l'indirizzo di A dove l'IP è interno alla lan


esempio:
A in una lan ha IP 192.168.1.150 e porta 1234
B stessa lan ha IP 192.168.1.151 e porta 6789

A comunica con il controller e il controller registra l'indirizzo pubblico, esempio 79.124.28.125 porta 456
B comunica con il controller e il controller registra l'indirizzo pubblico, esempio 79.124.28.125 porta 741

se il controller deve mettere in comunicazione A e B, visto che questi 2 sono nella stessa lan deve:
- trasmettere ad A che B lo trova con IP 192.168.1.151 e porta 6789
- trasmettere a B che A lo trova con IP 192.168.1.150 e porta 1234


quindi il controller deve, per ogni client, conoscere sia IP/Porta pubblici che interni alla rispettiva LAN

detto questo potrebbe essere il firewall della vodafone  :P

Ho pensato anche a questo, ma per il momento voglio evitarlo. Voglio poter uscire e rientrare dalla rete locale. Così da testare il caso peggiore. Ovvero i due client sono dietro una NAT. Ieri sera ho iniziato a creare un test scorporato dal progetto originale. Così da semplificare il debug e capire cosa sbaglio. Questa sera (o in pausa pranzo) lo finisco e poi lo posto. Così magari qualche anima pia mi aiuta a capire cosa sbaglio.
PS: quando ho fatto il test il firewall della vodafone lo avevo disabilitato.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 18, 2020, 09:49:42 am
Ho pensato anche a questo, ma per il momento voglio evitarlo. Voglio poter uscire e rientrare dalla rete locale. Così da testare il caso peggiore. Ovvero i due client sono dietro una NAT.

Sel la lan è la stessa non so se è possibile.
Nel senso che se tu esci dal tuo IP pubblico per rientrare nel tuo IP pubblico, penso sia una cosa che non si possa proprio fare.
Forse mi sbaglio ma ora ho questa convinzione.
Potresti provare installando un apache, pubblichi la porta e poi apri un browser in lan ma cerchi di raggiungere apache con l'IP pubblico.


Secondo me devi proprio lavorare con 2 IP pubblici diversi altrimenti rischi di perdere tempo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 18, 2020, 11:09:58 am
No perchè un client lo fai uscire su una porta e il secondo su un'altra porta.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 18, 2020, 01:02:03 pm
infatti nell'esempio che ti ho mandato l'IP pubblico è lo stesso ma le porte sono diverse

però sempre che A esce da un IP pubblico e deve rientrare nello stesso (e lo stesso deve fare B)
per fare una cosa del genere forse serve configurare un loopback ma non è una condizione che trovi normalmente
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Novembre 18, 2020, 01:11:55 pm
infatti nell'esempio che ti ho mandato l'IP pubblico è lo stesso ma le porte sono diverse

però sempre che A esce da un IP pubblico e deve rientrare nello stesso (e lo stesso deve fare B)
per fare una cosa del genere forse serve configurare un loopback ma non è una condizione che trovi normalmente

Farò delle prove al riguardo. Nel frattempo ho finito il programma di test.

Per capire come funziona il programma seguite questi punti (prima in locale, poi su 3 pc diversi della rete lan e infine spostando il controller fuori dalla lan)

1. Avviare l'eseguibile del controller che risponderà con qualcosa di simile

UDP Hole Punching Controller
MAX_CONNECTIONS: 100
MAX_INACTIVE_MS: 30000
SOURCE_PORT: 1985
PWD:

2. Avviare una istanza del client ed impostare l'indirizzo ip del controller nel campo identificato come "Controller IP:" che di default è 127.0.0.1

3. Avviare una seconda istanza del client ed impostare l'indirizzo ip del controller nel campo identificato come "Controller IP:" che di default è 127.0.0.1 e successivamente cliccare sul check "Invert"

4. Sull'istanza 1 del client cliccare sul pulsante "Start conn" che restituirà un id nel campo memo (Es: 1qhlUQ)

5. Sull'istanza 2 del client cliccare sul pulsante "Start conn" che restituirà un id nel campo memo (Es: NnGLQ8)

6. Inserite nel campo "Remote id session:" dell'istanza 1 l'id dell'istanza 2 (Es: NnGLQ8)

7. Inserite nel campo "Remote id session:" dell'istanza 2 l'id dell'istanza 1 (Es: 1qhlUQ)

8. Su entrambe le istanza cliccate sul pulsante "Start P2P"

Se funziona tutto dovreste trovarvi un lista di messaggi inviati e ricevuti nella memo di entrambe le istanze

Es.

ControllerMyId  :A
ControllerIp    :127.0.0.1
ControllerPort  :4999
ControllerTS    :0
127.0.0.1:4999 --> A msg_1
127.0.0.1:4999 <-- B msg_1
127.0.0.1:4999 --> A msg_2
127.0.0.1:4999 <-- B msg_2
127.0.0.1:4999 --> A msg_3
127.0.0.1:4999 <-- B msg_3
127.0.0.1:4999 --> A msg_4
127.0.0.1:4999 <-- B msg_4
127.0.0.1:4999 --> A msg_5
127.0.0.1:4999 <-- B msg_5
127.0.0.1:4999 --> A msg_6
127.0.0.1:4999 <-- B msg_6
127.0.0.1:4999 --> A msg_7
127.0.0.1:4999 <-- B msg_7
127.0.0.1:4999 --> A msg_8
127.0.0.1:4999 <-- B msg_8
127.0.0.1:4999 --> A msg_9
127.0.0.1:4999 <-- B msg_9
127.0.0.1:4999 --> A msg_10
127.0.0.1:4999 <-- B msg_10

Ovviamente se eseguite tutti e tre i programmi sullo stesso computer non dovete cambiare neanche il Controller IP delle due istanze, lasciatelo a 127.0.0.1
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Novembre 19, 2020, 01:04:57 pm
provato poco fa in locale su win e funziona
in giornata farò altre prove
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 17, 2023, 04:57:44 pm
mi è tornato in mente questo vecchio thread
xinyiman, ci sono state evoluzioni?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 17, 2023, 07:07:38 pm
Siccome sono diverse pagine di post, un sunto sintetico sarebbe utile ....

Ok...me lo sono letto tutto, senza scaricare o provare alcunchè.

Progetto interessantissimo, anche perchè faccio uso giornaliero di teleassistenza (non uso TeamViewer che genera problemi con le applicazioni che faccio ma uso AnyDesk).

Mi pare di capire che siano state esplorate tutte le problematiche e più o meno risolte, a parte forse la connessione tramite Internet.

I sistemi di teleassistenza, così come anche i sistemi vari simili come accessi agli impianti di videoregistrazione, allarmi, etc ... fanno tutti uso di server esterni. Senza un server esterno non è possibile in generale creare un sistema di teleassistenza flessibile.

Principalmente i motivi sono:

1) presenza di firewall che impediscono l'accesso dall'esterno;

2) impossibilità di effettuare un NAT, a parte in poche situazioni;

3) impossibilità dell'uso di UPNP in impianti aziendali, tecnologia che consente di aprire in automatico le porte di un firewall e/o router;

4) uso di connessioni mobili che non consentono in alcun modo di poter essere configurate ne con DDNS ne possono essere raggiungibili da chichessia.

In particolare la principale funzionalità è quella della connessione a richiesta e questo è possibile solo tramite un server stabile in Internet (o comunque raggiungibile da Internet).

In pratica, il client su cui portare assistenza dovrebbe avere libero accesso ad Internet tramite le classiche porte 80 o 443, stabilisce una connessione UDP con il server per "ascoltare" eventuali richieste di assistenza e in caso ci siano viene instaurata la connessione tramite il server stesso con il client che fornirà assistenza.

La connessione dovrà per forza passare tramite il server per i motivi sopra citati.

Poi oltre la connessione, usare i JPEG per la comunicazione non è il massimo perchè il carico di lavoro di compressione / decompressione di un monitor ad esempio a 4K non è così ininfluente.

Si dovrebbe usare qualche algoritmo di compressione tipico dei compressori video secondo me, come se ci fosse un flusso video tra un client e l'altro (e ciò potrebbe aiutare a trasportare facilmente anche l'eventuale audio).

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 08:39:10 am
E' un progetto che non ho più portato avanti. Da solo è troppo da fare. Ho però a quel tempo fatto un sacco di test e quindi mi è chiaro quali step occorrano per farlo bene. Ma dovrebbe diventare un progetto portato avanti a più persone perchè possa vedere la fine.
mi è tornato in mente questo vecchio thread
xinyiman, ci sono state evoluzioni?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 09:33:55 am
Siccome a me interessa direttamente anche per questioni lavorative e non solo ludiche, mi offro di affiancarti.

Si può costruire comunque lo scheletro portante a partire da quello che è stato fatto, poi le "features" e gli abbellimenti si possono aggiungere con calma ...

Ho un server in ufficio proiettato su internet con IP fisso (IPV6/IPV4 e DNS a fantasia) che possiamo usare come prima base di appoggio.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 09:48:49 am
Siccome a me interessa direttamente anche per questioni lavorative e non solo ludiche, mi offro di affiancarti.

Si può costruire comunque lo scheletro portante a partire da quello che è stato fatto, poi le "features" e gli abbellimenti si possono aggiungere con calma ...

Ho un server in ufficio proiettato su internet con IP fisso (IPV6/IPV4 e DNS a fantasia) che possiamo usare come prima base di appoggio.

Ciao

Bene, vediamo se riusciamo a tirare dentro anche qualcun'altro. Se arrivassimo a 4 (compresi noi due) saremmo a cavallo. Poi butto giù un paio di idee per la struttura portante e poi procediamo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 11:18:17 am
Comunque per chi vuole provarlo basta che scarica lo zip da: https://www.lazaruspascal.it/download_personali/korg_remote_desktop.zip

Poi va nella cartella bin/architettura della propria macchina/ e lanci l'eseguibile

Ovviamente vanno lanciate due istanze su due pc diversi nella stessa lna (al momento funziona solo in lan e solo la trasmissione del desktop remoto)

Nella textbox "Remote ip" bisogna mettere l'indirizzo ip della macchina con la quale si vuole interagire in lan (su tutte e due le istanze) poi sulla macchina da cui si vuole trasmettere premete sul pulsante invert epremete start. Sull'altra macchina compilate il campo "remote ip" e poi flaggate il check "jumbo packet" e premete start. Dovreste vedere il desktop remoto abbastanza bene.

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 18, 2023, 11:50:27 am
ok mi segno...
inutile che dica che il tempo è sempre poco ma lo strumento merita di essere portato avanti
lato linux le prove e le sistemazioni posso provare a farle io

cmq anche piano è sempre meglio che abbandonato no? :)

Edit
importante è che ci sia qualcuno che dia i compiti
giusto per evitare che ognuno prenda la sua strada :D
chiaramente propongo xinyiman visto che il progetto è suo
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 11:59:55 am
Datemi il tempo di rifare mente locale e nei prossimi giorni vi dico qualcosa al riguardo.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 12:20:27 pm
importante è che ci sia qualcuno che dia i compiti
giusto per evitare che ognuno prenda la sua strada :D
chiaramente propongo xinyiman visto che il progetto è suo

Va bene, l'importante è definire i punti cardine del progetto in modo che si abbia le idee chiare su dove andare. Ciò anche per proporre e sondare le soluzioni più corrette.

Io mi occuperei della parte su Windows, fermo restando che dovremmo lavorare in stretta sintonia per le parti non comuni Windows / Linux / Mac / Android.

Scarico il progetto per capire dove è arrivato il ns. team leader.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 18, 2023, 12:31:11 pm
visto che è ora di pranzo, ho una polpetta avvelenata...

si potrebbe pensare come client anche ad un browser?
chiaramente questo alla fine della fine, ma intanto possiamo tenerlo a mente
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 12:52:06 pm
Al momento direi di no! Per come è impostato adesso. Se si vuole fare qualcosa di simile bisogna pensarlo diversamente. Io direi che i primi step sono.

1. Fare in modo che le funzionalità di base funzionino all'interno della lan (trasmissione diretta tra i due client)
2. Ripulire da quello che non serve/ottimizzare bene il codice
3. Fare in modo che la connessione non sia più diretta tra i due client ma metterci un server di mezzo che dirotti i pacchetti al client di destinazione
4. Testare il tutto su Win/Linux/Mac (io non ho più il mac e bisognerebbe trovare qualcuno che sia disposto ad aiutarci) - per il momento escluderei android

E già così c'è da divertirsi
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 01:16:19 pm
Inoltre ad essere onesti se si vogliono fare le cose per bene, sarebbe tutta da riscrivere. Sicuramente riutilizzando il grosso del lavoro, ma sostituendo synapse con indy, che essendo di più alto livello si occupa lui di gran parte delle cose.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 01:53:06 pm
Inoltre ad essere onesti se si vogliono fare le cose per bene, sarebbe tutta da riscrivere. Sicuramente riutilizzando il grosso del lavoro, ma sostituendo synapse con indy, che essendo di più alto livello si occupa lui di gran parte delle cose.

Alla parte su Indy ci penserei io. E' da anni che sviluppo con Indy, quindi non dovrebbe essere un problema.
Per il Mac si può combinare ....

1. Fare in modo che le funzionalità di base funzionino all'interno della lan (trasmissione diretta tra i due client)

OK, ma sarebbe meglio una volta testato questo passare subito alla fase con il terzo incomodo, ossia il server extra ... tanto la strada è quella a meno che qualcuno non abbia qualche coniglio nel cappello.
(oops non avevo fatto caso al punto (3)  8)
Un dettaglio immediato, visto che si accennava ai packet Jumbo: in genere non sono utilizzabili in quanto tali pacchetti vengono comunque frammentati a meno che TUTTE le nic non abbiano la funzionalità Jumbo Packet attiva (ma è disattiva per default e và settata in ogni singola scheda di rete).

Tenendo conto che la maggior parte dell'uso è tramite internet (o tramite bridge / router / switch / etc ...)  che non si possono sicuramente settare come và bene a noi direi che i Jumbo Packet potremmo lasciarli perdere (la definirei una features futuribile).

Inoltre dalle prove che effettuai diversi anni fà, è meglio un sistema che aderisca ad un MTU rilevato piuttosto che avere un trasmissione frammentata, soprattutto con pacchetti UDP.

Ma sono quisquilie ....

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 02:00:25 pm
Inoltre ad essere onesti se si vogliono fare le cose per bene, sarebbe tutta da riscrivere. Sicuramente riutilizzando il grosso del lavoro, ma sostituendo synapse con indy, che essendo di più alto livello si occupa lui di gran parte delle cose.

Alla parte su Indy ci penserei io. E' da anni che sviluppo con Indy, quindi non dovrebbe essere un problema.
Per il Mac si può combinare ....

1. Fare in modo che le funzionalità di base funzionino all'interno della lan (trasmissione diretta tra i due client)

OK, ma sarebbe meglio una volta testato questo passare subito alla fase con il terzo incomodo, ossia il server extra ... tanto la strada è quella a meno che qualcuno non abbia qualche coniglio nel cappello.

Un dettaglio immediato, visto che si accennava ai packet Jumbo: in genere non sono utilizzabili in quanto tali pacchetti vengono comunque frammentati a meno che TUTTE le nic non abbiano la funzionalità Jumbo Packet attiva (ma è disattiva per default e và settata in ogni singola scehda di rete).

Tenendo conto che la maggior parte dell'uso è tramite internet (o tramite bridge / router / switch / etc ...)  che non si può sicuramente settare come và bene a noi direi che i Jumbo Packet potremmo lasciarli perdere (la definirei una features futuribile).

Inoltre dalle prove che effettuai diversi anni fà, è meglio un sistema che aderisca ad un MTU rilevato piuttosto che avere un trasmissione frammentata, soprattutto con pacchetti UDP.

Ma sono quisquilie ....

Ciao

Allora direi di fare così, suddividiamo il progetto in aree più che in sistemi.

Area 1: sistema per la trasmissione di rete ( in prima istanza solo udp, in futuro anche TCP se udp non funzionasse)
Area 2: gestore del recupero dell'immagine screen su un client e visualizzazione dello stesso sull'altro client (ho già affrontato la cosa e potrei farlo io)
Area 3: crittografia

Il punto 1 dovrebbe essere gestito attraverso un server e dovrebbe permettere il trasferimento di stringhe e di stream
Il punto 2 me ne occupo io
Il punto 3 dovrebbe essere in AES256 bit.

Il client quando si collega al server dovrebbe scambiarsi la chiave aes256 con algoritmo a chiave asimmetrica (ho scritto degli esempi al riguardo) e poi dovrebbe cifrare solo il set di dati che serve per l'interscambio con la chiave aes256, perchè il corpo delle immagini e del testo viene cifrato con una crittografia sempre a 256 bit, ma con la chiave scambiata a voce con l'interlocutore dell'altro client (un po' come fa TeamViewer).

Questo a grandi linee


Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 02:04:41 pm
Una volta appurato che il sistema di comunicazione dei client passa correttamente nel server e il suo instradamento, dobbiamo capire come strutturare i messaggi che facciamo transitare al suo interno.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 03:08:20 pm
Invece di AES256, proporrei SM4 a 128 bit (di cui ho postato i sorgenti in pascal). Dovrebbe essere più efficiente e meno esoso di risorse.

Anche questo comunque è un particolare. Invece provando quello che avevi fatto, dovremmo comunque sistemarlo per ridurre l'uso di CPU ... 20% è un pò troppo, anche 10% lo sarebbe.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 03:24:26 pm
Invece di AES256, proporrei SM4 a 128 bit (di cui ho postato i sorgenti in pascal). Dovrebbe essere più efficiente e meno esoso di risorse.

Anche questo comunque è un particolare. Invece provando quello che avevi fatto, dovremmo comunque sistemarlo per ridurre l'uso di CPU ... 20% è un pò troppo, anche 10% lo sarebbe.

Ciao

Secondo me la strada maestra è riscriverlo da zero, tenendo buoni alcuni pezzi di codice per la gestione delle immagini per esempio.
La prima parte da fare è sicuramente la gestione della parte di rete, il resto lo si costruisce sopra.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 03:42:08 pm
Scriverlo da zero và bene. Anche la parte di gestione delle immagini secondo me andrebbe ripensata ... sul Jpeg non sono d'accordissimo visto che bisogna "streamarlo" e non salvarlo. Indy ha già integrata la compressione con lo stream e potrebbe bastare quello (magari opzionabile con il Jpeg).

Il concetto è che il carico di "extra lavoro" portato da KRD sul lato in assistenza dovrebbe essere il più basso possibile per non influire con il funzionamento normale del sistema.
Poi ovvio che si dovranno predisporre opzioni tipo:
1) Meglio qualità;
2) Bilanciamento prestazioni / qualità;
3) Meglio prestazioni;
4) Meglio ottimizzare il trasporto di rete.

Ciao

P.S.: KRD è l'acronimo del progetto.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 03:46:22 pm
Scriverlo da zero và bene. Anche la parte di gestione delle immagini secondo me andrebbe ripensata ... sul Jpeg non sono d'accordissimo visto che bisogna "streamarlo" e non salvarlo. Indy ha già integrata la compressione con lo stream e potrebbe bastare quello (magari opzionabile con il Jpeg).

Il concetto è che il carico di "extra lavoro" portato da KRD sul lato in assistenza dovrebbe essere il più basso possibile per non influire con il funzionamento normale del sistema.
Poi ovvio che si dovranno predisporre opzioni tipo:
1) Meglio qualità;
2) Bilanciamento prestazioni / qualità;
3) Meglio prestazioni;
4) Meglio ottimizzare il trasporto di rete.

Ciao

P.S.: KRD è l'acronimo del progetto.

Assolutamente concordo con tutto. Anche KRD può essere rivisto come nome, io lo avevo chiamato così perchè Korg è un personaggio secondario (ma importante) del fumetto Martin Mystere (uno dei miei preferiti).
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 03:59:29 pm
Solo una cosa, il fatto che io passo da una jpeg è dovuta al fatto che riduco la qualità dell'l'immagine e la comprimo prima di trasmetterla. Questo per permttere una trasmissione più rapida. Però se hai idea alternative per migliorare le performance di trasmissione ben venga.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 04:04:51 pm
Ulteriore cosa:

come concetto base direi di mantenere i dati del lato in assistenza così come sono, senza conversione nè altro (ovviamente in generale parlo) e di convertire quanto serve sul lato da cui parte l'assistenza.

Quindi il desktop ad esempio viene solo compresso e non convertito e poi inviato così com'è. Ci penserà poi chi lo riceve ad effettuare le necessarie conversioni.
Esempio (solo dimostrativo, pratico):

1) presa immagine desktop pc windows, formato bitmap;
1a) eventuale riduzione di formato per ottimizzare le prestazioni per esempio da 4k a FD.
2) compressione formato bitmap tramite stream;
3) ricezione lato MAC e conversione in PCX per la visualizzazione.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 04:09:05 pm
Ulteriore cosa:

come concetto base direi di mantenere i dati del lato in assistenza così come sono, senza conversione nè altro (ovviamente in generale parlo) e di convertire quanto serve sul lato da cui parte l'assistenza.

Quindi il desktop ad esempio viene solo compresso e non convertito e poi inviato così com'è. Ci penserà poi chi lo riceve ad effettuare le necessarie conversioni.
Esempio (solo dimostrativo, pratico):

1) presa immagine desktop pc windows, formato bitmap;
1a) eventuale riduzione di formato per ottimizzare le prestazioni per esempio da 4k a FD.
2) compressione formato bitmap tramite stream;
3) ricezione lato MAC e conversione in PCX per la visualizzazione.

Ciao

Non ho ben capito ma mi fido. Non capisco però perchè devi prenderti il bitmap e poi comprimerlo. Fallo passando da una jpg. Non è più facile?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 04:20:25 pm
Solo una cosa, il fatto che io passo da una jpeg è dovuta al fatto che riduco la qualità dell'l'immagine e la comprimo prima di trasmetterla. Questo per permttere una trasmissione più rapida. Però se hai idea alternative per migliorare le performance di trasmissione ben venga.

La compressione JPEG và bene, ma occupa comunque risorse. Magari una semplice compressione gzip impiega meno risorse e ottiene un risultato simile.
Dopo una compressione JPEG non ha comunque senso un stream compresso, non può esserci una ulteriore compressione.

Si tratta di verificare qual'è il bilanciamento migliore.

Stò anche soppesando, per usi di un certo tipo, anche i compressori video. Li uso per fare lo streaming su disco delle mie elaborazioni di linea in real time.
Però di quelli non ci sono sorgenti in pascal (e non ci potranno essere), quindi solo librerie (dll, so, dylib).
Un vecchissimo compressore (  ??? ::) :o ) anni 90 di Microsoft streamma a 167 kbit al secondo un desktop QHD come il mio (5 fotogrammi al secondo). In questo caso è integrato in Windows, niente dll esterne. Ovviamente usando un X264 o x265 le prestazioni / qualità aumentano. Io uso normalmente un x264 (minor uso di CPU per la qualità che mi serve).

Ciao

PS: x264 era la vecchia tecnica di trasmissione del digitale terrestre, x265 è quella nuova.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 04:30:35 pm
Non ho ben capito ma mi fido. Non capisco però perchè devi prenderti il bitmap e poi comprimerlo. Fallo passando da una jpg. Non è più facile?

Il desktop generalmente si "cattura" in "bitmap" (lasciando perdere GDI, GTK o altro), per averlo in jpeg occorre "trasformarlo". Questo fatto secondo me costa più in termini di risorse che non inviarlo ad uno stream con compressione.
Però è una mia supposizione, magari mi sbaglio.

Quando saremo in fase esecutiva si farà qualche prova e si vedrà. Comunque potranno rimanere entrambe le opzioni configurabili.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 18, 2023, 04:42:43 pm
scusate forse dico una baggianata ma...
il desktop non andrebbe diviso in scacchi e spedire solo gli scacchi differenti?

in questo caso, vado a senso ma bisogna sempre provare, forse lavorare con i bitmap per trovare le differenze è più veloce
poi ci pensa lo stream compresso

come la vedete?
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 18, 2023, 05:08:24 pm
Lavorare a scacchi lo credevo anche io, ma alla fine sull'udp non sono così sicuro che incida, sono da fare delle prove quando abbiamo l'infrastruttura di rete su cui trasmettere i dati. Fosse su TCP concordavo con te.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 05:18:03 pm
Questo è il concetto dei compressori video (già fatti e stra super testati).

Però possiamo farlo anche a codice in pascal. Occorre suddividere la bitmap in memoria in "quadrotti" come accennavi tu e trasmettere solo i quadrotti differenti.

Accedendo alla bitmap in modalità regolare (scanline) conviene a questo punto lavorare per linee e trasmettere solo le linee differenti, invece dei "quadrotti".
Per linee intendo una serie lunga  di pixel quanto è l'ampiezza del desktop (ad esempio 1920 pixel).

Poi si può trasmetterne una si e una no (tipo TV) alternate, suddividere la linea ulteriormente .... etc ...

Occorre verificare il peso delle operazioni e quanto impattanti sono: ad esempio trasmettere 1920 x 3 byte o trasmettere 960 x 3 byte (cioè solo mezza linea) pesa di più in termini di elaborazione (devo fare due confronti invece che uno solo) o di trasmissione (dimezzo la trasmissione di dati nel caso di differenze).

Quanto è il cambiamento su una immagine desktop in termini percentuali e probabilistici:

1) se sul desktop ho la visualizzazione di un film, tanto vale che trasmetta tutta la bitmap, tanto avrò probabilmente un cambio continuo di tutte le righe della stessa, è inutile controllare e trasmette a pezzi l'immagine intera;

2) se sul desktop ho un "qualcosa" che varia in una zona medio / piccola allora probabilmente lo "spezzatino" avrà il suo effetto.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 05:22:33 pm
Lavorare a scacchi lo credevo anche io, ma alla fine sull'udp non sono così sicuro che incida, sono da fare delle prove quando abbiamo l'infrastruttura di rete su cui trasmettere i dati. Fosse su TCP concordavo con te.

In realtà trasmettere diversi dati più piccoli in UDP è (dovrebbe essere) un vantaggio. Come accennavo comunque i dati vengono frammentati (e anche vero che la frammentazione è a livello di sistema, di conseguenza veloce) e quindi trasmettere dati più piccoli e probabilmente meno frequentemente aiuta e migliora la trasmissione UDP.

Edit: dubbio legittimo inserito  ;)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 18, 2023, 05:28:29 pm
cmq anche in un film non è detto che le linee siano sempre tutte differenti

ci sono sempre diversi contesti (streaming, videogame, video, video dei cellulari con le bande nere, ecc...)
secondo me si può mettere come opzione: scansione a scacchi o no

ma la scansione a scacchi, credo, vada implementata
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 06:04:55 pm
ma la scansione a scacchi, credo, vada implementata

Si, sono d'accordo. Deve essere una opzione per l'ottimizzazione.
Con riferimento a ciò, prima di implementare qualsiasi cosa pensiamo alla struttura di trasmissione.

Lavorare a scacchi lo credevo anche io, ma alla fine sull'udp non sono così sicuro che incida, sono da fare delle prove quando abbiamo l'infrastruttura di rete su cui trasmettere i dati. Fosse su TCP concordavo con te.

Io comunque posso mettere in piedi un semplice repeater nel server Internet con 4 porte fisse (per adesso, in attesa di implementare la dinamicità) per simulare un assistito e un assistente.

Una porta UDP e una TCP in ascolto (chiamiamole impropriamente server) e una porta UDP e TCP in ascolto (client) per la ritrasmissione dello stesso dato ricevuto allo stesso IP di ricezione (per adesso). Gli IP connessi (SERVER) verranno confrontati a quelli connessi (CLIENT) e i dati verranno reindirizzati se gli IP collimano. Per adesso implemento solo protocollo IPV4 e ovviamente i dati andranno sia da client e server sia da server a client.

La coda di listen sarà di 10 connessioni contemporanee massime per porta.

Internet a 1 Gigabit, MTU su Internet di 1500 byte (1448 byte dati), ma non è detto che l'MTU sia anche il vostro. Se volete provare la frammentazione, dovete eseguire un ping verso l'indirizzo interessato con le opzioni -f -l

Codice: [Seleziona]
 ping 217.198.132.230 -f -l 1448

Se vi genera un messaggio di avvertimento allora provate a diminuire il valore 1448.

Ciao

P.S.: appena pronto vi invio in chat privata le porte da usare.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 18, 2023, 07:52:38 pm
Ok server operativo su connessione UDP.

1) Invio un pacchetto alla prima porta, il pacchetto andrà perso;
2) Invio un pacchetto alla seconda porta, da ora in avanti tutti i dati ricevuti verranno inoltrati tra le due porte.

Timeout 30 secondi.
Le porte remote sono quelle di prima connessione (cioè quelle registrate con il primo pacchetto arrivato).
Se si devono cambiare porte occorre attendere 30 secondi prima di inviare dati (anzi almeno 45 secondi ... il timer di controllo esegue i test ogni 15 secondi).

Ciao

P.S.: massimo 10 connessioni da IP diversi contemporanee.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 19, 2023, 08:25:44 am
Allego copia del RepeaterIP (è uno scheletro abbozzato anche se funzionante).

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 19, 2023, 12:23:07 pm
Aggiornamento.

Faccio seguito ad alcune prove effettuate (che purtroppo confermano quanto ipotizzato).

L'uso di UDP tramite firewall, router o altri filtri di rete non consente di eseguire una connessione "identificata": cosa significa?

Significa che non c'è modo di identificare e ridirigere correttamente un pacchetto UDP che proviene dall'esterno di una LAN e arriva all'interno della stessa in assenza di una apertura esplicita delle porte.

Cosa accade:

1) un client (A) invia un pacchetto UDP (XP) a un server su Internet. Nessuna porta aperta esplicitamente sui dispositivi di rete (firewall, router, etc ...);

2) Il pacchetto UDP (XP) arriva al server su Internet.

3) Nel frattempo i dispositivi di rete tra client (A) e server su Internet hanno annotato che del traffico tra il client (A) e il server Internet è stato effettuato, e che presumibilmente ci potrebbe essere una risposta UDP all'inverso. Quindi aprono una finestra temporale variabile (diciamo tra i 30 e i 60 secondi) in cui consentiranno che i pacchetti UDP dal server Internet arrivino all'interno della LAN sino al client (A) ATTRAVERSO LE STESSE PORTE USATE PER LA PRIMA TRASMISSIONE.

4) Il server su Internet invia un pacchetto UDP (YP) verso il client (A) .... client che viene identificato con l'indirizzo IP pubblico ovviamente !!!!!! non certamente con l'indirizzo IP della LAN.

Fino a qui tutto bene.

Ora avviene il fattaccio:

un secondo client (B) da un'altra postazione invia un pacchetto UDP (ZP) sempre al server su Internet usando sempre le stesse porte del client (A) .... quando il server su Internet risponde, il pacchetto UDP (WP) arriva al client (A) invece che al client (B).

Tutto ciò è assolutamente normale ... per l'UDP.

I sistemi di rete "registrano" il transito dei pacchetti e identificano eventuali "risposte" solo dalla porta usata (sarebbe tecnicamente come effettuare un NAT temporaneo, questo per i pacchetti UDP). Se tutti i client usano le stesse porte, allora i pacchetti di risposta arriveranno al primo che ha avviato la comunicazione.

Ovviamente su TCP tutto è diverso, non ci sono problematiche nell'identificazione dei client / server a cui ridirigere i pacchetti.

Ciò detto, che come accennavo è come ci si aspettava, porta alla conclusione che il sistema desktop remoto dovrà basarsi su TCP e non su UDP. E se da un certo punto di vista ciò migliora sicurezza e "meccanismi" di gestione, da un punto di vista meramente prestazionale complica le cose in particolar modo dove le connessioni sono particolarmente "instabili" come nelle zone malservite dagli operatori o quando ci sono connessioni wireless.

Posterò a breve il sorgente per fare i test (sempre uno scheletro, senza gestione di errori o quant'altro).

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 19, 2023, 01:47:48 pm
Progetto Client in UDP per test KRD.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 19, 2023, 06:36:08 pm
Aggiornamento:

a seguito delle prove effettuate, ho implementato temporaneamente visto il tempo che avevo a disposizione una connessione TCPS (cioè una connessione TCP tramite TLS1.2). La cifratura avviene tramite chiper "ECDHE-RSA-AES128-GCM-SHA256" in prima battuta, seguono altri se per qualsiasi motivo questa non fosse usufruibile.

Implemento il serverino con queste implementazioni e aggiorno anche il client.

N.B.: Il client avrà un normale socket TCP, senza DLL o altro  .... ehm ovviamente servono le cryprolib per adesso sino a quando non svilupperemo il modulo in pascal.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 20, 2023, 08:29:10 am
Ok, quando hai qualcosa da farci provare su cui instaurare ulteriori prove faccelo sapere.

Come dicevamo ieri, sarebbe opportuno stilare il protocollo per l'interscambio dei dati
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 20, 2023, 09:48:48 am
Cosa dite: ci limitiamo ad un miliardo di sistemi connessi, o ci proiettiamo subito un pò più in grande ?  ;D

Mi piace la parte di progettazione, dove si può far galoppare la fantasia.

Un pò di sano umorismo ogni tanto fà bene.

Un "OT" giustificato.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 20, 2023, 10:14:36 am
Spariamo pure in alto, possiamo sempre cambiare idea se troviamo grossi ostacoli
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 20, 2023, 10:49:12 am
Ok, quando hai qualcosa da farci provare su cui instaurare ulteriori prove faccelo sapere.

Come dicevamo ieri, sarebbe opportuno stilare il protocollo per l'interscambio dei dati

Per adesso mi stò concentrando sulla costruzione e "derivazione" del componente base (Context) che identifica la connessione con un client, compresa la gestione multithreading.

L'ho derivato, e messo già in uso totalmente e funziona. Quindi ora possiamo costruire sopra questo ciò che ci aggrada.

Non è un processo corretto lo sò (prima progettare poi scrivere codice), ma ci sono alcuni aspetti che nella progettazione implicano conoscenza e in questo caso la conoscenza si "ipotizza" e si acquisisce con alcune prove reali.

Stò costruendo la funzionalità di tunneling trasparente tra due client "registrati" nel server, poi mi dedico al protocollo insieme a voi.

Fatto il tunneling si potranno già subito testare alcune funzionalità che servono per la gestione grafica. Qualche giorno di pazienza e un primo vagito emergerà dalla nebbia.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 20, 2023, 04:39:50 pm
mi sono documentato un po' in giro per il confronto tra 2 bitmap
metto quì un link che mi sembra interessante, probabilmente ci faciliterà un po' il lavoro

https://forum.lazarus.freepascal.org/index.php/topic,26462.0.html (https://forum.lazarus.freepascal.org/index.php/topic,26462.0.html)
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 20, 2023, 07:33:17 pm
Progressi sul fronte protocollo.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 20, 2023, 07:50:38 pm
mi sono documentato un po' in giro per il confronto tra 2 bitmap
metto quì un link che mi sembra interessante, probabilmente ci faciliterà un po' il lavoro

https://forum.lazarus.freepascal.org/index.php/topic,26462.0.html (https://forum.lazarus.freepascal.org/index.php/topic,26462.0.html)

Si, interessante.
Io tenterei però di leggere una intera linea raster e fare un confronto in memoria (memcmp ... esiste ancora ?) penso che sia la più veloce e approcciabile.
Mi pare, vado a memoria che ci impiegavo una quindicina di millisecondi a scansionare a triplette (24 bit RGB) una full hd (1920 x 1080)
Mantenendo in memoria sui due lati client le rispettive vecchie "bitmap" si sovrascrivono le righe variate.

Poi ogni tot si invia un frame intero.

L'intestazione dello streaming potrebbe avere:
0: frame intero;
n: riga inviata (con  1 <= n <= 1080 ad esempio sempre per uno schermo full hd).

Ciao

PS: poi se vogliamo spendere 2000,00 € di licenza runtime a client vi posso fare la scansione e il confronto in qualche decina di microsecondi ... ma non mi sembra il caso ...  ;D
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 21, 2023, 11:33:11 am
Il sistema di comunicazione è in "piedi", il server si chiama "korgrd.dyn-o-saur.com".

E' stato implementato il canale comandi con i client con handshake delle prime info:

1) Richiesta nuovo ID;

2) Richiesta lista connessioni registrate;

3) Richiesta stato client;

Il client adesso parte, si connette al server con un ID di default (come fosse il primo "contatto") e richiede un nuovo ID.
Per ora non viene gestito ne il DB sul server per mantenere in maniera permanente gli ID, ne alcunchè sui client.

Ora la mia idea sarebbe, alla pari di altri protocolli come l'RTP (RTSP), e come anche suggerito da @xinyman di aprire un canale aggiuntivo temporaneo alla richiesta di connessione tra due client creando un tunneling sul server. Su questo canale viaggeranno gli streaming di tutti i dati tra i due client.

Tutto ciò sarebbe bello ma .... c'è sempre un ma.

All'interno delle reti gestite (tipo aziendali, eccetto quelle più "grosse" con servizi proxy autenticati), l'accesso "all'esterno" è normalmente garantito a chi usa come destinazione porte note come la 80, la 443 o le porte per i vari protocolli mail (IMAP, POP, SMTP) e vengono bloccate le altre. Quindi se manteniamo questa logica, e la connessione principale avverrà sulla porta 80 del server internet, la connessione secondaria potrebbe avvenire sulla 443 (che su un server proprietario potrebbe essere libera, ma normalmente non lo è su un server "pubblico").

Ad esempio sul mio server (che ho qui in ufficio), la 443 è comunque impegnata per altri servizi. Si possono usare ovviamente altre porte ma come accennavo l'eventuale difficoltà potrebbe essere che in certe realtà il client potrebbe non riuscire a connettersi con il flusso secondario.

L'alternativa è usare una unica porta (la 80 ad esempio) e gestirla nel server (poi quando saremo scafati si potrà implementare il check delle porte remote e se raggiungibili passare in dinamico alla configurazione con più "pool di porte).

Di fatto non cambia nulla, solo che invece di avere diversi gruppi di "listener" abbinati alle singole porte ne avremo solo uno.

Sono da tenere in seria considerazione le prestazioni.

Un sistema di teleassistenza comune occupa le seguenti bande (schermo remoto FULL HD, impostazioni su MIGLIORE VELOCITA' DI REAZIONE / QUALITA' BASSA):

1) Solo movimento mouse -> tra i 40Kbit e gli 80Kbit in uscita dal client remoto e punte di 120Kbit in ingresso;

2) Movimento del mouse con una finestra agganciata dalle dimensioni di mezzo schermo -> dai 4Mbit ai 26Mbit in uscita dal client remoto con punte di 240 Kbit in ingresso.

Ovviamente più client in tunelling e la richiesta di banda aumenterà a dismisura, con il risultato che necessiterà ben più di una connessione al server di 1 Gbit come la mia e un PC come hardware ...

Però, per un uso "personale" ossia un uso dove la teleassistenza la fanno da uno a tre persone in contemporanea al massimo, il sistema che stiamo pensando dovrebbe essere sufficientemente prestante.

E poi sarà fatto in Pascal  ;) ;D

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 21, 2023, 11:47:56 am
Per andare sul concreto in questa fase aprirei un canale (connessione tcp/ip) sulla stessa porta del "canale comandi" per ogni servizio:

1) streaming video;
2) mouse, tastiera e simili;
3) audio (sarà sviluppato come ultimissima cosa).
4) canale ausiliario ulteriore per trasferimenti file (anche questo sarà una delle ultime implementazioni).

E da verificare la funzionalità di sincronismo tra video e mouse / tastiera.

Quindi oltre alle connessioni dei singoli client, ogni client in teleassistenza avrà 4 connessioni aggiuntive.

Se ciò va bene, implemento la cosa affinchè le prime due voci siano usabili da voi che farete la parte video / mouse / tastiera).

Poi in una futuribile videochiamata defineremo le linee guida del protocollo.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 21, 2023, 12:52:51 pm
Direi che va benone
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 21, 2023, 12:55:39 pm
Intanto io sto cercando di fare gli screenshot di un sistema multimonitor. Qui le prime considerazioni e richieste d'aiuto.

https://forum.lazarus.freepascal.org/index.php/topic,63151.0.html
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 21, 2023, 02:23:47 pm
Intanto io sto cercando di fare gli screenshot di un sistema multimonitor. Qui le prime considerazioni e richieste d'aiuto.

https://forum.lazarus.freepascal.org/index.php/topic,63151.0.html

Ti ho risposto io sul forum internazionale. Devi ricalcolarti le quote (nel mio caso le X) dei vertici del secondo monitor a causa del differente o ingrandimento o differente DPI dei due monitor.

Ciao

P.S.: nel mio caso primo monitor 2450 a 125% -> Windows ti dice che il secondo monitor si trova a 3200, invece non è così. Non sò se no i manifest DPI AWARE risolvi la cosa senza fare tanti calcoli.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 21, 2023, 02:29:47 pm
Si, risolvi impostando a DPI Aware Per Monitor V2 in opzioni progetto.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 21, 2023, 02:55:38 pm
Grazie mille DragoRosso. Partendo da qui ora estraggo le immagini riga per riga per fare il confronto. Ti tengo aggiornato
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Aprile 21, 2023, 05:07:48 pm
Provate questa versione, dovrebbe essere abbastanza intuitiva. Premete prima i fue pulsanti in alto e poi esplorate le 3 tab. Se non è chiaro come funziona basta chiedere.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Aprile 21, 2023, 11:05:44 pm
hihihi,
Ma farvi un repo git privato?


Stilgar
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 22, 2023, 01:39:29 pm
hihihi,
Ma farvi un repo git privato?
Stilgar

Ma no, lavoriamo in pubblico.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: Stilgar - Aprile 22, 2023, 02:07:10 pm
Allora un repo pubblico ;D
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Aprile 29, 2023, 01:10:33 pm
in mancanza di un repo pubblico...
ho fatto un programmino per testare le differenze tra le immagini

ho messo un algoritmo di confronto, chi vuole può aggiungerne altri così da confrontare i tempi
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 29, 2023, 02:20:45 pm
In attesa di un repository pubblico, per ora uno privato.

https://github.com/SiveaITA/KrogRD (https://github.com/SiveaITA/KrogRD)

Verrà convertito in pubblico al momento in cui ci saranno degli sviluppi proponibili pubblicamente.
Per ora siamo ancora in fase embrionale.

Mandatemi un messaggio privato con il nome di account di GITHUB affinchè vi dia accesso al repo.

Può partecipare chiunque sia interessato a proporre / testare soluzioni.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Aprile 29, 2023, 04:33:25 pm
Ai fini Linux, abbiamo visto che due sistemi grafici (server grafici) vengono usati prevalentemente:

1) X11
2) Wayland

Mentre X11 è stato da sempre il server "de facto" di Linux, il recente Wayland è stato adottato ufficialmente da Ubuntu nella versione 22.04 (e già adottao sia da Debian che da Fedora).

Sotto X11 non c'è granchè da dire, il supporto è ormai standardizzato e tutti i pacchetti grafici di interfaccia (GTK, QT, etc..) girano tranquillamente; in Wayland ci sono ancora alcuni problemi di incompatibilità, spesso dovuta alla vetustà delle applicazioni, ad esempio il mantenimento di GTK2 (deprecata), passando per GTK3 quando GTK4 viene già normalmente usata.

Poi ci sono ulteriori problematiche dovute alle implementazioni di sicurezza che in Wayland sono native (banalmente, ma non è la sola, lo screenshoot del desktop che non è fattibile da una normale applicazione senza appunto avere acquisito una apposito "token" dal server Wayland).

Anche QT5, sembra non sia pienamente compatibile ed è stata "moddata" una versione apposta per Wayland.
Lo cose si stanno muovendo molto rapidamente, quindi in attesa di tempi più stabili proporrei che per adesso si ignori Wayland e si continui a perseguire la strada standard di X11.

Dalle prove effettuate, appare chiaro che Lazarus produca (sia per GTK2, sia per QT5) applicazioni perfettamente standard e che funzionano correttamente sotto X11 anche in varie versioni di Linux. Così non è in Wayland dove le applicazioni prodotte hanno dei limiti (ma non per colpa di Lazarus) anche se marginali (però sono propri quelli che incidono nel progetto KRD).

Direi alla fine fine di posporre le attività di test e verifica su Wayland in attesa di una stabilizzazione (per inciso, in Virtual Box con Wayland ci sono diversi problemi, così come in Lazarus già nell'IDE grafico, però magari è un limite dell'ambiente Virtual Box).

Creerò nel repository una sezione Waylnad dove "accumulare" eventuali materiali da studiare / verificare / testare successivamente.

Per chi usasse Ubuntu 22.04, passare a X11 è semplicissimo, e ciò fà capire quanto l'adozione di Wayland sia comunque "fonte di incertezza" anche per chi l'adottato. Posto uno scrennshot per chiarire.

P.S.: se installate Ubuntu 22.04 Desktop, potreste avere dei problemi tipo il "Terminale" che non si apre. Cambiate eventualmente dalle opzioni la lingua in un'altra (Inglese dell'Inghilterra ad esempio).

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 02, 2023, 03:41:16 pm
in mancanza di un repo pubblico...
ho fatto un programmino per testare le differenze tra le immagini

ho messo un algoritmo di confronto, chi vuole può aggiungerne altri così da confrontare i tempi

Ciao, ho provato l'algoritmo, ed effettivamente non me l'aspettavo ma è veloce ... ma c'è il trucco: sfrutta la funzionalità di TBGRABitmap nel crearsi una copia "lineare" della bitmap in memoria. In questo modo il compilato non è null'altro che una veloce sequenza ciclica di un paio di istruzioni in assembler (o giù di li) per la parte di confronto.

Occorre vedere tutto il processo di caricamento da DC se ne vale la pena: comunque vale solo un frame e quindi complessivamente fà una operazione che non verrà mai più usata (e inoltre dovrebbe fare una iniziale scanline teoricamente).

Rimarrebbe il problema della trasmissione: si dovrebbero marcare le differenze in un qualche modo (chunk) primitivo per trasmettere meno dati possibile ma comunque identificarli, quindi o ritorniamo alla linea (scanline) dell'immagine, alle porzioni di immagine rettangolari, a compressori (tipo MPeg o meglio MJpeg) ...

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Maggio 02, 2023, 04:30:41 pm
sto facendo delle prove anche in quel senso
cercando di dividere una immagine in chunk

se raggiungo qualche risultato soddisfacente vi faccio sapere


Edit:
in effetti BGRAbitmao è molto ottimizzato e userei quello in quanto riuscirebbe a garantire ottime prestazioni su tutte le piattaforme
resta da vedere se c'è un modo veloce per copiare da DC alla bitmap
ma credo che possa essere una operazione veloce


Edit 2:
https://forum.lazarus.freepascal.org/index.php/topic,63171.msg478040.html#msg478040 (https://forum.lazarus.freepascal.org/index.php/topic,63171.msg478040.html#msg478040)
thread di xinyiman

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 02, 2023, 05:21:42 pm
Edit 2:
https://forum.lazarus.freepascal.org/index.php/topic,63171.msg478040.html#msg478040 (https://forum.lazarus.freepascal.org/index.php/topic,63171.msg478040.html#msg478040)
thread di xinyiman

Si, era legato a quanto verificato e riportato anche in questi post. Con Wayland ci sono problemi su cui in questo momento è meglio soprassedere. Ubuntu mette a disposizione l'interfaccia X11 al posto di Wayland con un click.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 02, 2023, 05:43:37 pm
Ahh, ulteriormente:

sto facendo delle prove anche in quel senso
cercando di dividere una immagine in chunk
se raggiungo qualche risultato soddisfacente vi faccio sapere

facendo diversi test, anche con sistemi di teleassistenza professionali, ho visto che l'MTU rimane comunque a 1,5 KB. Inoltre il "trunk" di dati trasmissibili a blocco (quindi senza ack continuo) si assesta intorno ai 16 KB (che è quello che usa anche Indy).

In pratica, ma devo approfondire il discorso appena avrò terminato con la parte dei Thread, 16KB corrisponderebbe a una linea (scanline) non compressa di una immagine a 4K (anzi, di meno visto che il canale Alpha potremmo anche gettarlo alle ortiche).

Se manteniamo il blocco dati intorno a quelle dimensioni potremmo ottenere buone prestazioni.

Però, una volta che il sistema di trasmissione sarà consolidato potremmo fare le prove con varie soluzioni per trovare l'ottimale.

Nel contesto delle prove che state facendo sulla grafica, mettiamoci anche un punto di domanda sulla qualità. E direi che molto probabilmente qualità / prestazioni verranno definite solo dalla quantità di dati inviata. Per ciò che ho visto non è l'analisi dei frame che rallenterà ne il client ne il sistema remoto.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Maggio 03, 2023, 08:24:02 am
Ahh, ulteriormente:

sto facendo delle prove anche in quel senso
cercando di dividere una immagine in chunk
se raggiungo qualche risultato soddisfacente vi faccio sapere

facendo diversi test, anche con sistemi di teleassistenza professionali, ho visto che l'MTU rimane comunque a 1,5 KB. Inoltre il "trunk" di dati trasmissibili a blocco (quindi senza ack continuo) si assesta intorno ai 16 KB (che è quello che usa anche Indy).

In pratica, ma devo approfondire il discorso appena avrò terminato con la parte dei Thread, 16KB corrisponderebbe a una linea (scanline) non compressa di una immagine a 4K (anzi, di meno visto che il canale Alpha potremmo anche gettarlo alle ortiche).

Se manteniamo il blocco dati intorno a quelle dimensioni potremmo ottenere buone prestazioni.

Però, una volta che il sistema di trasmissione sarà consolidato potremmo fare le prove con varie soluzioni per trovare l'ottimale.

Nel contesto delle prove che state facendo sulla grafica, mettiamoci anche un punto di domanda sulla qualità. E direi che molto probabilmente qualità / prestazioni verranno definite solo dalla quantità di dati inviata. Per ciò che ho visto non è l'analisi dei frame che rallenterà ne il client ne il sistema remoto.

Ciao

Ottime notizie quindi. Per quanto riguarda la qualità secondo i miei test passati la cosa più veloce era recuperare lo screenshot in jpeg compresso con perdità della qualità impostabile come parametro (default ad un 25/30%). Così l'immagine di partenza di suo era già leggera e poi si lavora solo sulle differenze.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 03, 2023, 09:38:27 am
L'immagine Jpeg è sicuramente la base di partenza per per il full frame, perchè ogni tot. è da inviare un full frame per pareggiare eventuali scostamenti incrementali.

Occorre fare un pò di prove per verificare tempi e carico di lavoro. Tanto per fare un esempio, un sistema come il mio con desktop da doppio monitor più o meno equivalente ad un 4K, la routine di @nomorelogic postata (che scansiona ogni pixel  :o ) ci impiega al massimo 16 ms. a scansionare tutti i pixel (poi bisogna vedere nella cattura del frame quanto ci mette).

Questo per dire che le scelte che si possono fare sono ampie, e tra loro non ci saranno molti scostamenti. Certo è che non dobbiamo metterci a fare un compressore video (encoder / decoder) ... esistono già e sono normati e testati.

1) JPeg come full frame di partenza.
2) Differenziale a linea, a pixel, a rettangoli, (ma anche jpeg stesso) ......
3) Trasmissione bilanciata;

Come cappello, sempre con il concetto che il client remoto abbia un carico dato dalla teleassistenza comunque contenuto.

N.B.: ulteriore nota, dobbiamo anche tenere conto che la banda "internet" a disposizione sul client emoto non sarà tutta per la teleassistenza, E' per quello che ho provato linee lente (300 Kb).
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 03, 2023, 02:54:31 pm
Occhio nel fare il timing del codice: il GetTickCount64 è assolutamente impreciso; non l'ho mai usato, ho sempre usato la routine diagnostica che ho postato anche in questo forum o una routine assembler pura.

Riporto dal link di Microsoft: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount64 (https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount64)

Citazione
La risoluzione della funzione GetTickCount64 è limitata alla risoluzione del timer di sistema, che in genere è compresa tra 10 millisecondi e 16 millisecondi. La risoluzione della funzione GetTickCount64 non è influenzata dalle modifiche apportate dalla funzione GetSystemTimeAdjustment.

Infatti le analisi che stavo eseguendo non avevano senso misurate con questo "cronometro".

Io normalmente uso questo (c'è anche la funzione di calibrazione delle costanti CiclialMs e Ciclialus ... ma la posterò in un topic più consono):

Codice: [Seleziona]
//per Cicli: costante di cicli al millisecondo nelle CPU di nuova generazione (dalle serie Intel 8 in poi ?)
const CiclialMs = 2000000;    //Mezzo nanosecondo a ciclo

//per Cicli: costante di cicli al microsecondo nelle CPU di nuova generazione (dalle serie Intel 8 in poi ?)
const Ciclialus = 2000;    //Mezzo nanosecondo a ciclo

function Cicli: UInt64; register;
begin
  {$IFDEF WIN64}
  asm
    //Per i processori INTEL, il conteggio ritornato da rdtsc è invariante (no clock / no core), dipende dalla CPU ed è di circa mezzo nanosecondo
    rdtsc;                  //(RDX:RAX in 64 bit)
    lfence;
    shl RDX, 32
    or RAX, RDX         //RAX per i valori di ritorno come intero sino a 64 bit (in WIN64)
  end;
  {$ENDIF}
end;

//Uso:

var t1, t2: UInt64;

//In t1 vengono riportati i cicli attuali del processore
t1 := Cicli;
//..... fai qualcosa
t2 := Cicli;

//Millisecondi trascorsi
ShowMessage('diff = ' + IntToStr((t2-t1) div CiclialMs));

//Microsecondi trascorsi
ShowMessage('diff = ' + IntToStr((t2-t1) div Ciclialus));


Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Maggio 03, 2023, 04:39:02 pm
è probabile che questo si a un problema relativo a Windows
se non ho capito male nei sistemi *nix/posix si usa clock_settime (CLOCK_MONOTONIC) che pare avere una accuratezza in nanosecondi

detto questo ho guardato nei sorgenti di lazarus e GetTickCount64 è un wrapper a seconda dell'OS

sorgenti linux

Codice: [Seleziona]
function GetTickCount64: QWord;
var
  tp: TTimeVal;
  {$IFDEF HAVECLOCKGETTIME}
  ts: TTimeSpec;
  {$ENDIF}
 
begin
 {$IFDEF HAVECLOCKGETTIME}
   if clock_gettime(CLOCK_MONOTONIC, @ts)=0 then
     begin
     Result := (Int64(ts.tv_sec) * 1000) + (ts.tv_nsec div 1000000);
     exit;
     end;
 {$ENDIF}
  fpgettimeofday(@tp, nil);
  Result := (Int64(tp.tv_sec) * 1000) + (tp.tv_usec div 1000);
end;



sorgenti windows
Codice: [Seleziona]
function GetTickCount64: QWord;
{$IFNDEF WINCE}
var
  lib: THandle;
{$ENDIF}
begin
{$IFNDEF WINCE}
  { on Vista and newer there is a GetTickCount64 implementation }
  if Win32MajorVersion >= 6 then begin
    if not Assigned(WinGetTickCount64) then begin
      lib := LoadLibrary('kernel32.dll');
      WinGetTickCount64 := TGetTickCount64(
                             GetProcAddress(lib, 'GetTickCount64'));
    end;
    Result := WinGetTickCount64();
  end else
{$ENDIF}
    Result := Windows.GetTickCount;
end;

sotto linux il tempo di confronto che avevo ottenuto era di 5ms e mi sembrava congruo
sotto win che tempi di risposta si ottengono?

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 03, 2023, 06:04:07 pm
è probabile che questo si a un problema relativo a Windows
se non ho capito male nei sistemi *nix/posix si usa clock_settime (CLOCK_MONOTONIC) che pare avere una accuratezza in nanosecondi

No, l'accuratezza dipende dall'hardware implementato.
In generale sui PC c'è il timer HPET (è un timer hardware esterno al processore standardizzato) che ha una risoluzione di 100 nanosecondi fissa per tutti i sistemi.
In assenza di questo (tipicamente nei sistemi embedded) c'è un clock a 32 KHz circa (non ricordo di preciso la frequenza) che quindi d'ha una accuratezza di circa 30 microsecondi.

L'unico modo per scendere sotto queste soglie è usare i timer integrati delle cpu (O, CHIARAMENTE NON SIAMO SU SISTEMI REAL TIME, QUINDI IL NANOSECONDO E' UNA MERA CHIMERA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!).

EDIT: anche il microsecondo è una pia illusione, e il millisecondo è un target visibile con il "lentino" ....
EDIT: Il target di uso di questi chiamiamoli "timer" è dare una indicazione che vale soprattutto per comparazione sulle prestazioni e non devono essere presi come punti assoluti di prestazione.

sotto linux il tempo di confronto che avevo ottenuto era di 5ms e mi sembrava congruo
sotto win che tempi di risposta si ottengono?

Sotto Windows, ma anche in Linux in realtà le cose non sono molto diverse, dipende da come viene impostato il sistema operativo.
In genere, il timer di sistema di Windows lavora dai 10 ai 16 millisecondi, quindi anche qui tutto ciò che è basato sulle funzioni standard stà all'interno di questo tempo.

Sleep, slice, yeld, etc ... usano generalmente tecniche proprie e non si basano sul timer di sistema.

I Thread possono avere maggiore priorità, e quindi i timer e funzioni simili all'interno dei Thread reagiscono con più "prontezza".

Nel caso della tua routine, l'ho messa a confronto con l'equivalente scanline e i dati non mi tornavano con svarioni (5 ms. complessivi sono assolutamente accettabili, ma non 32 ms.) evidenti.

Poi ho usato appunto il timer che vi ho postato e siamo rientrati nella normalità, con una verifica anche di stabilità complessiva.

Lo scanline ha riportato su migliaia di operazioni una media di 10 ms per immagine con stabilità inferiore al millisecondo (4K UHD circa) mentre la scansione a pixel  ha una tipicità di 17 ms. però con variabilità di oltre 5 ms. (-1, +5).

Con il setting di ottimizzazione +O4, lo scanline è scesa a 7 e il pixel a 13 (quest'ultimo sempre con variabilità).

Sinceramente pensavo che la gestione a pixel fosse più veloce, avendo accesso ad un array lineare di memoria. Però non ho visto tutta l'implementazione ...
(lo scanline serve a prelevare una sequenza di pixel, poi il confronto viene fatto comunque pixel per pixel).

Ciao

Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 03, 2023, 06:34:33 pm
Oltre al timer CPU in assembler postato, vi posto anche questa unità (non sò se è stata inserita in FPC una simile nelle ultime versioni).

Questa funziona sia sotto Windows che Linux ed è implementata anche in Delphi (in maniera leggermente diversa).

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Maggio 04, 2023, 10:32:46 am
che la misurazione del tempo dipende dall'hw ok...
poi direi, quale tempo? (nel senso tempo di un processo, tempo trascorso a prescindere dal processo, ecc...)

quindi il discorso è complicato ma, per fortuna, il collo di bottiglia nel ns caso non è nel cercare le differenze tra 2 immagini ma nel trasmettere queste differenze

quì cmq c'è un tipo che si lamenta che "the overhead of a single call to clock_gettime() was over 250ns" e cercherebbe la precisione al microsecondo.

https://stackoverflow.com/questions/7935518/is-clock-gettime-adequate-for-submicrosecond-timing (https://stackoverflow.com/questions/7935518/is-clock-gettime-adequate-for-submicrosecond-timing)

Edit:
in conclusione su *nix clock_gettime() sembra già un ottimo sistema per misurare il tempo
non è preciso al massimo ma credo che siamo molto sotto i 10/16ms e per i ns bisogni è sufficientemente accurato.
sul mio sistema l'overhead non lo conoscso ma ritengo che 5ms sia abbastanza affidabile
(e se l'arrotondamento fosse anche a 1 ms credo andrebbe bene comunque)

se poi nei vari client incontreremo sistemi di misurazione del tempo meno affidabili non importa, quello che importa è sapere che l'algoritmo delle differenze gira su tempi accettabili in generale
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 04, 2023, 11:53:14 am
@nomorelogic,
non mettevo in discussione le tue conclusioni, volevo solo dire che il sistema di misurazione è standardizzato in Windows / Linux / Mac e usa la stessa base (HPET -> 100 nanosecondi), basta non usare Get_TickCount64.

Era più una disgressione sull'argomento che una discussione vera e propria, tanto più che le "misurazioni" più fini servono a livello di debug più che a runtime e quindi siamo liberi di usare gli strumenti più appropriati, io continuerò ad usare la routine in assembler.
Incomincerò anche ad impostare le $IFDEF per i differenziare i sistemi Windows e Linux, per quanto è di mia conoscenza.

Sono anche io un pò preso, spero di riuscire a pubblicare la base di comunicazione funzionante verso metà prossima settimana, così che possiamo poi fare test reali e continuare con l'avanzamento.

Ciao
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: nomorelogic - Maggio 04, 2023, 12:11:23 pm
no problem, ci si confronta e si conoscono realtà diverse, tutto quà  :)

infatti volevo arrivare a dire che è ora di pensare a mettere delle direttive di compilazione condizionale

nei sorgenti Lazarus per linux, GetTickCount64 è un wrapper
quindi credo che sotto Linux (non so Mac) si possa usare la GetTickCount64

prima o poi dovremmo testare il tutto su Mac
io potrei testare anche raspberry quando sarà il momento
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: DragoRosso - Maggio 12, 2023, 10:17:30 am
Ciao a tutti.

Commento solo che il progetto è un "attimo" rallentato in quanto sono un pò preso nel lavoro ... confido di riuscire a portare qualcosa di concreto a breve.
Titolo: Re:Assistenza remota simil Team Viewer
Inserito da: xinyiman - Maggio 12, 2023, 02:49:29 pm
Ciao a tutti.

Commento solo che il progetto è un "attimo" rallentato in quanto sono un pò preso nel lavoro ... confido di riuscire a portare qualcosa di concreto a breve.

Non ti devi preoccupare, prima il lavoro