Italian Trasferimento file(s) da PC a device Android tramite wifi

AlpVir

Well-Known Member
Licensed User
Longtime User
Sto sviluppando un programma (scritto in VB6) che, tra le altre cose, effettua il trasferimento di un file da un PC ad un dispositivo Android tramite il wifi.
Dal lato PC (client) utilizzo un controllo Winsock.
Dal lato B4A (server) un socket.
Tutto OK se il file da trasferire è uno solo ma se sono più di uno la procedura non funziona nè riesco a adattarla al mio scopo.
Qualcuno ha dei suggerimenti in merito ?
Grazie dell'attenzione.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Sinceramente non lo so. Viene instaurato un protocollo che trasmette
1) lunghezza del file
2) lunghezza del nome del file
3) nome del file
4) il file medesimo
Android legge i 4 elementi e poi chiude la connessione (credo).
Quindi il primo file viene trasmesso correttamente ma dal secondo in poi cessa la sincronizzazione.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Qui sotto il nucleo centrale del codice B4a
B4X:
Sub Timer1_Tick
    Dim fileSize As Long
    Dim strLen  As Long
    Dim s1 As String, s2 As String
    Dim fileName As String
    Dim buffer(8192) As Byte
    Dim raf As RandomAccessFile
    Dim fileName As String
    If InputStream1.BytesAvailable > 0 Then
        Timer1.Enabled = False
        '--- protocollo
        raf.Initialize3(buffer, True)
        InputStream1.ReadBytes(buffer, 0, 10)
        s1=BytesToString(buffer, 0, 10, "UTF-8")
        fileSize = s1
        InputStream1.ReadBytes(buffer, 0, 10)
        s2=BytesToString(buffer, 0, 10, "UTF-8")          
        strLen = s2
        InputStream1.ReadBytes(buffer, 0, strLen)            ' leggo il nome del file
        fileName = BytesToString(buffer, 0, strLen, "UTF-8")
        LbName.Text = "Nome file : " & fileName
        '--- ed ora scrivo il file   
        Dim out As OutputStream
        out = File.OpenOutput(File.DirRootExternal & "/AlpVirData/ImmaginiPers",  fileName, False)
        Dim count As Int
        Do While fileSize > 0
            count = InputStream1.ReadBytes(buffer, 0, Min(buffer.Length, fileSize))
            out.WriteBytes(buffer, 0, count)
            fileSize = fileSize - count
            LbSize.Text = "Ancora " & NumberFormat(fileSize, 0, 0) & " bytes"
            DoEvents
        Loop  
        out.Close
        Timer1.Enabled = False
        'ProgressDialogHide
        'Msgbox ("L'immagine è stata trasferita con successo","TRASFERIMENTO IMMAGINI")
    End If
End Sub

e qui quello provvisorio lato PC (VB6)
B4X:
    Sorgente = App.Path + "\ImmaginiPers\8411Pers.jpg"
          Destinazione = "\AlpVirData\ImmaginiPers\8411Pers.jpg"
          FName_Only$ = GetFileName_IMG(Sorgente)
          SendFile_IMG Sorgente, Destinazione, FName_Only
          Debug.Print FName_Only
       
          Sorgente = App.Path + "\ImmaginiPers\8411PersB.jpg"
          Destinazione = "\AlpVirData\ImmaginiPers\8411PersB.jpg"
          FName_Only$ = GetFileName_IMG(Sorgente)
          SendFile_IMG Sorgente, Destinazione, FName_Only
          Debug.Print FName_Only

8411Pers.jpg viene trasferita mentre 8411PersB.jpg no.
Dubito però che qualcuno possa darmi un aiuto, vedendo questi spezzoni di codice.
Secondo me bisogna radicalmente cambiare il processo (o meglio i processi).
La soluzione ci sarebbe ma è complicatuccia (specie lato VB6): compattare tutti i file in un unico file ZIP e poi trasferire solo questo; essendo un unico file il processo funziona senz'altro. Poi (lato B4A) bisogna scompattare i file (questo lo so fare).
 

sirjo66

Well-Known Member
Licensed User
Longtime User
A parte il discorso del timer che non riattivi, ho notato che la variabile raf non viene utilizzata.

Io nel lato VB6 proverei a mettere una pausa di qualche secondo tra un invio e l'altro, tanto per capire il problema, poi lo togli

Sergio
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Giusto, la variabile raf non viene utilizzata ma anche qui il fatto non è influente. Del timer ho già detto.

Comunque sono riuscito nel mio intento che era quello di inviare numerosi files dal PC al device Android tramite il wifi.
Nel PC comprimo tutto in un unico file (senza neanche utilizzare degli OCX), lo trasmetto, viene correttamente ricevuto nel device Android e poi qui lo scompatto: tutto OK.
La soluzione non è proprio l'ideale (c'entra poco con il B4A) ma almeno funziona.
Grazie a tutti coloro che ci sono cimentati nella risoluzione di questo mio problema.
P.S.: Non mi nascondo che non ho purtroppo nessun controllo circa la preventiva esistenza di qualche file identico sul device Android. Io - brutalmente - lo reinvio nuovamente. D'altra parte non saprei proprio come controllare, PRIMA, l'esistenza o meno di ogni file che deve essere trasmesso.
Non so se mi sono spiegato su quest'ultimo punto che comunque ho deciso di trascurare.
 

AlpVir

Well-Known Member
Licensed User
Longtime User

arenaluigi

Well-Known Member
Licensed User
Longtime User
Alp,
non è vero che non sei capace, e che (io compreso) quando hai una soluzione che funziona, non hai voglia di impazzire su una soluzione che non funziona.

Per altro guardando le tue app, secondo me il fatto di creare un unico file è la soluzione migliore.
Io dicevo di approfondire il discorso sul multi file per capire se il problema è lato pc o lato android.
Comunque bella l'app :)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Il problema secondo me è nel protocollo di trasmissione. Come già detto io trasmetto :
1) lunghezza del file
2) lunghezza del nome del file
3) nome del file
4) il file medesimo per la lunghezza stabilita al punto 1; esso sarà registrato con nome pari a quello stabilito al punto 3.

La trasmissione avviene per blocchi di 8192 bytes. Può capitare (anzi capiterà sempre) che la fine di un file NON coinciderà con la fine di un blocco. La procedura non funzionerà più a partire dal secondo file, nella quasi totalità dei casi.
Android non saprà individuare e leggere la lunghezza del secondo file, la lunghezza del nome del secondo file e così via.
Forse, ma dico forse, usando blocchi da 1 bytes, se fosse consentito (non lo so, presumo di no) ....
Però si avrebbe sicuramente un consistente peggioramento delle prestazioni a causa di un probabile overhead.
P.S.: Su che dispositivo hai sperimentato la mia app ? I risultati sono stati soddisfacenti riguardo la visualizzazione ?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Io in realtà la vedo in questo modo:

1 Invio file
2 Android riceve (continua a leggere fino alla dimensione del file)
3 Salvo il file.
4 Android manda a vb6 un messaggio di ack (finito)
A questo punto il giro riprende dal punto 1

Stasera proverò la tua app poi ti aggiorno.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Per salvare il file su Android bisogna sapere il suo nome. Quindi bisogna che il PC glielo invii.
Da queste 2 semplici frasi si capisce (se non prendo degli abbagli) che bisogna creare/inventare/instaurare un protocollo.
Ed è proprio quello che faccio io.
Salvo imprevisti non avrei intenzione di modificare il modo di lavoro che, dopo tante prove, ho finalmente perfezionato, e che svolge il suo sporco lavoro egregiamente. Vorrei dedicarmi ad altri progetti. Poi si vedrà ...

Riguardo la mia app tieni presente che essa lavora in sinergia con la versione per PC ed è dedicata ai frequentatori del mio sito che hanno una certa esperienza in materia di montagna e gite in montagna (nella fattispecie lo scialpinismo). E che usano "Il Mio Taccuino per PC". Ma può anche essere usata in altri ambiti (lavoro, scuola, ecc.). Non conosco la prurigettonata Evernote ma la mia app gli assomiglia forse un po'.
Con la differenza che non richiede la connessione ad internet, cosa quanto mai rara in montagna.
 
Top