Newsgroup: it.comp.lang.visual-basic
Titolo: Come programmare Datalogic Memor ?

Scrivo in questo ng perche' sto usando un terminalino per la lettura 
barcode di qualche anno fa, del periodo in cui VB era utilizzato 
diffusamente, il modello e'  944201019
Vorrei scambiare idee con chi abbia programmato i Datalogic Memor con 
Windows CE 5.0
In particolar modo sulla comunicazione via wi-fi
Ciao e grazie
RobertoA
 


Ciao,
io programmo sui Datalogic Memor X3, più recenti (Windows CE 6.0).
Visual Studio 2008 e .NET Framework 2.0
SDK scaricato dal sito Datalogic (Memor_X3 SDK_1.0.1 R2.zip)
 
Per il WiFi c'è un namespace dedicato del quale uso le API per verificare
la potenza del segnale (WiFiGetRssi). Purtroppo non sono riuscito a
rilevare il MAC Address dell'Access Point collegato (l'API dedicata mi
ritorna una stringa vuota).
 
La mia configurazione dovrebbe essere compatibile anche con Windows CE 5.0,
ma è solo una ipotesi.
 
Ciao
PaF


Ringrazio molto per la risposta
Per comunicare poi dal Memor al pc con i dati come ti regoli?
Nel senso, se dal terminale devo vedere il prezzo di un articolo, dopo 
aver scannerizzato ed acquisito il codice, come interroghi il db sul pc 
per restiruire a Memor prezzo/descrizione/esistenza?
E quando vuoi mandare informazioni dal Memor al pc, esempio inventario 
articoli, come spedisci, file di testo/connessione a socket/ftp ?
 
 

 articoli, come spedisci, file di testo/connessione a socket/ftp ?
 
Ciao,
uso le funzioni di ADO.Net 2.0, utilizzando il provider di Microsoft SQL
Server (nel mio caso). Niente di basso livello (socket o altro).
La scelta di utilizzare le API per monitorare il livello del WiFi è nata
dal voler gestire in modo "preventivo" l'impossibilità di collegarsi al
server, se per esempio il segnale è troppo basso ed il terminale si
disconnette.
 
Inizialmente mi basavo solo sul timeout della connessione al server e
relativa eccezione, ma dal punto di vista della User Interface è brutto
vedere la clessidra, aspettare x secondi e poi ricevere l'errore. Immagina
che questi device li usa il mulettista che non ha tempo/voglia/pazienza di
aspettare il risultato di una scansione.
Molto meglio disabilitare il tasto di lettura e/o il controllo che riceve
la lettura, segnalare in rosso la mancanza di segnale, etc etc
 
Aggiungo che per utilizzare il provider di SQL Server su Windows CE ho
dovuto installare questo: sql.wce5.armv4i.cab
Lo trovi googlando.
 
Ciao
PaF


Ringrazio per le utili indicazioni
Devo collegarmi a db Firebird e finora da WinCe vai wifi non trovo 
niente per andare direttamente sul db posto in lan
Quindi devo fare un programma 'server Memor' da far girare a bordo di un 
pc in rete, che dialoghi coi terminali wireless li faccia 'parlare' col 
db centrale
Non avevo pensato al livello radio su form operatore a bordo dei terminalini
Credo sia un'ottima cosa inibire le operazioni se non c'e' campo
Ma come rilevi la connessione tra terminali e pc?
Perche' monitorare il livello del wifi potrebbe non essere sufficiente, 
magari 'vede' la rete radio ma il dhcp non gli ha ancora dato 
l'indirizzo e quindi non e' 'in rete'
Oppure e' collegato alla rete radio ed il dhcp server centrale non 
funziona e quindi i terminalini non avranno mai il loro bell'indirizzo
Monitorando solo il wifi, il programma potrebbe sparare fuori dati che 
non verrebbero ricevuti

 niente per andare direttamente sul db posto in lan
 
[cut]
 
Per mia esperienza personale nel momento in cui c'è una connessione WiFi
attiva l'IP address è già stato recepito, in caso di disconnessioni
comunque il lease dovrebbe essere tale da non farlo cambiare.
Premesso questo l'unica soluzione per essere sicuri di essere "in rete" è
pingare il server e quindi proseguire con le operazioni in caso di risposta
positiva.
 
https://www.codeproject.com/Articles/10241/Ping-Control
 
 
Non sapendo se esiste un connettore .NET Compact Framework per Firebird io
propenderei per una soluzione basata su Web service, che inoltre ti
permette di disaccoppiare la business logic dal terminale: se un domani
passi ad altro server cambi solo la parte "web". 
 
Questo approccio l'ho implementato in un altro software (desktop) per la
connessione verso Oracle, per togliermi dai piedi il malloppo necessario
alla connessione client/server verso quel DB, che mi ha fatto sempre
disperare.
 
PaF


Veramente ci sarebbe anche un client diretto al db, da installare su 
Windows Ce, il che sempificherebbe in modo anomalo i problemi
 
NETProvider-2.5.2-CF.7z
 
Sto provando e non mi funziona
Compila un esempio minimo minimo, ma poi si pianta sull'istruzione 
conn1.Open()  in esecuzione con un bel errore:
 
'MissingMethodException'
 
-------------------------
FbConnection conn1 = new 
FbConnection("Database=d:\\test.fdb;UserID=SYSDBA;Password=masterkey");
 
conn1.Open();
 
.....
 
-------------------------
 
Sullo stesso problema vedo che c'hanno sbattuto gia' un bel po' di 
persone, senza arrivare ad una soluzione
 
http://www.progtown.com/topic499158-connection-with-firebird-in-windows-ce-50-net-cf-20.html
 
 
E quindi non avendo il client per il db, la prima scelta attuale e' fare 
un mini server http da installare sul pc, collegato al db dati, che 
risponda alle richieste dei terminalini
 
 
 

 conn1.Open();
 
La connessione da un palmare windows CE su firebird (il DB ovviamente sta
su un PC/server), l'ho sempre fatta cosģ:
"user id=SYSDBA;password=masterkey;character set=NONE;initial
catalog=miodb;datasource=192.168.1.100"
 
Poi ho creato su aliases.conf di firebird l'alias del db "miodb".
Se non erro provider firebird 2.5.2 e CF3.5.

 
 
E non erri, il provider 2.5.2 e' l'ultima versione fatta con i framework 
pre-4, e quindi usabile col VS2008
La cosa del aliases.conf non la sapevo
Ora provo subitisssimo
 
 
 

 
 
Niente, ho provato e non mi funziona
Sto usando Visual Studio 2008, la libreria 
FirebirdSql.Data.FirebirdClient e' la versione 2.5.2.0
Sto usando il seguente codice:
 
--------------------------------
string stringa_connessione = 
"Database=D:\\test_db\\TEST.FDB;Datasource=192.168.1.1;User=SYSDBA;Password=masterkey;";
 
FbConnection connessione = new FbConnection(stringa_connessione);
connessione.Open();
 
string queryString = "SELECT DITTA from CLIENTI";
 
FbCommand MyCOMMAND = new FbCommand(queryString, connessione);
FbDataReader MyDataReader = MyCOMMAND.ExecuteReader();
while (MyDataReader.Read())          {
     campo1 = MyDataReader.GetString(0);
     Console.Write(campo1);
     }
 
MyDataReader.Close();
connessione.Close();
--------------------------------
 
Si pianta sul  connessione.Open()
L'errore restituito e'   MissingMethodException
Per vedere la versione di framework usato di solito da Project / 
Property / Application si vede
Ma nei progetti iniziati per File / NewProject / Smart Device, non si 
vede niente, dalla versione dei file Riferimenti, System, System.Data, 
ecc, credo sia la 2.0
 
Ho provato, come consigliato, a modificare l'aliases.conf ma niente
Ho scritto all'autore del Dot Provider, Jiri Cincura, che molto 
cortesemente mi ha consigliato di attivare la Legacy autentication, ma 
niente ( 
https://www.tabsoverspaces.com/233642-ado-net-provider-5-11-0-0-for-firebird-is-ready-with-net-standard-2-0-support/
 
)
 
Visto che mi sembra di capire che l'hai fatto, posso chiederti la 
cortesia di passarmi un frammento di programma per Windows ce, che si 
connetta ed estragga dati da un db remoto qualsiasi?
 

 connetta ed estragga dati da un db remoto qualsiasi?
 
Questo funziona. Uso sempre gli alias sui palmari, perchč editare un file č
scomodo lě sopra, e nel caso edito il server.
 
            dbConnectionString = "user
id=SYSDBA;password=masterkey;character set=NONE;initial
catalog=miodb;datasource=192.168.1.1"
 
            ' testo la connection
            Using cn As New FbConnection(dbConnectionString)
                cn.Open()
                cn.Close()
            End Using
 
FirebirdSql.Data.FirebirdClient.dll č un file da 368kb

 
 
Si, la FirebirdSql.Data.FirebirdClient.dll e' quella, la mia e' datata 
14/02/2010
E quell'esempio funziona pure a me
Se pero' parto scegliendo File/Project/VisualC#/SmartDevice e sul 
pannellino dove mi chiede Target platform (metto Windows CE) e dove 
chiede ".Net Compact Framework version" (metto la 2.0) allora non 
funziona piu' restituendo un bel MissingMethodException
Non posso mettere la 3.5 perche' altrimenti i controlli Datalogic per il 
Memor non li vedo piu'
E quindi credo sia la versione di framework usata dal programma l'inghippo
Purtroppo sono legato a quella perche' altrimenti non 'parlo' col 
terminalino
 
 

 terminalino
 
Da quel che mi ricordo la minima č la 3.5 per avere la libreria firebird.
Altrimenti devi valutare altri database se ci sono compatibili fwk2.0. Se
si parla di pochi dati puoi usare anche un file di testo in rete.

 
Il Jiri Cincura mi ha risposta ( 
http://disq.us/p/1mccx8a
 ) 
consigliandomi la versione 2.1.0 del provider :net per Firebird
Ho provato, carico progetto nuovo su Visual Studio, aggiungo la ddl di 
Firebird, metto un tasto sulla form e nel codice metto il tuo esempio 
minimale, ovviamente con nome db ed ip corretti
Niente, spara fuori un errore MissingMethod ....... sull'apertura dela 
connessione
Mi arrendo, pazienza
 
Basterebbe trovare l'sdk Datalogic che funzioni anche col CF 3.5
Ma sul loro sito c'e' solo quello per CF 1.1 e 2.0, questo:
Datalogic Mobility Developer Assistant for VS2005 (Version 2.0.2)
 
Avendo un po' di coraggio si potrebbe tentare di aggiornare il firmware 
del Memor per metterci il Windows Mobile 6.1, se il processore e' uguale 
e la scheda wifi e' la stessa ci sono buone probabilita' che l'hardware 
sia lo stesso tra i due modelli Windows CE 5.0 / Windows Mobile 6.1
Certo che se qualcosa va storto mi blocco il terminalino e non posso 
piu' provare dovrei prenderne un altro


Alla fine ci sono riuscito
Anche se Datalogic ufficialmente fornisce l'sdk per i Memor solo per il 
CF 2.0, installando l'sdk per i MemorX3 funziona tutto lo stesso anche 
sui Memor normali
Ma l'sdk per i MemorX3 e' basato sul CF 3.5 e quindi nessun problema ad 
usare anche il provider .Net per Firebird
Ho usato la 2.5.2.0 e funziona correttamente
Provando a salire gia' la 3.2.0 butta fuori problemi vari, quindi 
restero' con la 2.5.2
Piuttosto, la connessione porta via un'enormita' di tempo tipo 15-20 
secondi, mi sembra una cosa abbastanza strana e sicuramente non normale
Intendo da palmare a database su pc in rete wifi, il task manager del pc 
non mostra nessuna attivita'
Sembra il palmare piantato ad attendere qualcosa
Qualcuno sa da cosa possa dipendere ?

 Qualcuno sa da cosa possa dipendere ?
 
Se non lo fai vai per IP invece che per nome macchina e prova ad usare i
soliti alias.
Altrimenti se non trovi la soluzione la metti su un background worker e poi
la usi appena disponibile.


Vado gia' con l'indirizzo ip numerico ma ci mette 15 secondi, non capisco
Ma dai tuoi terminali, quanto ci mette ad aprire una connessione?
Che e' sto backgroud worker?
 
 
 

 Che e' sto backgroud worker?
 
Avvii il programma e fai la connessione in un thread separato, così
l'interfaccia è reattiva. Ovviamente fino a quando non si è connesso non la
puoi usare, ma magari l'operatore nei primi secondi non la utilizza.


Tocca tenerla aperta SEMPRE la connessione
E se si stacca il wifi?
E se riavvi il programma?
Il wifi non e' raro che si stacchi qualche attimo, poi si riprende subito
Comunque ho fatto anche senza connessione diretta al db
Un programma in ascolto su porta xy messo su uno dei pc in lan e che 
comunica col database
I terminalini 'parlano' via socket tcp col programma 'server terminalini'
E' tutto abbastanza rapido, per interrogare un articolo sparando col 
terminalino, la risposta arriva entro due-tre decimi di secondo, tutto 
compreso, e' reattivo ed usabile a sufficienza
Certo che poter interrogare il db, direttamente dal terminalino, avrebbe 
risparmiato tutto l'ambaradan dei messaggi che partono ed arrivano ed il 
server custom su un pc
Diciamo che ora non mi serve, ma se ci fosse stato sarebbe stato meglio
Vorrei proprio capire cosa ci fa in quei 15 secondi prima di connettersi
E' sicuramente un timeout di qualcosa, ma de che' non si sa