W

Communities, Communities, Communities! (semicit.)

Fare parte di una community tecnologica (nel mio caso 3) può essere davvero impegnativo, ma al tempo stesso molto molto appagante.

Seguo molto assiduamente gli eventi che tutte le community italiane (sopratutto del mondo .NET) organizzano e quando è possibile cerco di parteciparvi di persona.

Questo sopratutto perchè credo che a parte il contenuto strettamente tecnico che si può erogare in una sessione (che per altro può tranquillamente essere vista via web) il vero valore stia nelle persone, nel poterle conoscere, il loro valore, le loro passioni. le loro idee.

In questo ovviamente c’è anche la possibilità di togliersi il dubbio su un certo problema che abbiamo incontrato e che non riusciamo a risolvere, o addirittura mettere le basi per collaborazioni di lavoro.

Insomma quello che comunemente viane chiamato fare Networking.

A questo proposito negli ultimi giorni di febbraio si sono svolti presso la sede Microsoft di Milano I CommunityDays 2014 che quest’anno hanno davvero battuto ogni record!

Infatti la prima novità era l’estensione dell’evento su 3 giornate in cui le prime due seguivano uno schema “classico” di tracce multiple con sessioni su tutto l’arco della giornata per coprire tutto lo spettro tecnologico del mondo Microsoft.

La terza giornata, definita °fabbrichetta edition° (cit.) poneva làaccento sulle problematiche da affrontare oggi per avviare una nuova azienda o startup.

Lo sforzo organizzativo per Daniele ed Andrea è stato improbo, ma credo che I risultati abbiano ampiamente ripagato gli sforzi.

Praticamente tutte le community italiane erano coinvolte in un modo o nell’altro nell’evento; o nelle sessioni, o nelle operazioni di checkin e nel controllo delle sale.

Da parte mia ho avuto il piacere di erogare due sessioni insieme all’amico e collega Marco Minerva, la prima dal titolo “Interagire con device esterni” e la seconda “Sviluppare applicazioni con Azure Mobile Services”.

Durante la prima sessione fra l’altro abbiamo anche mostrato come interfacciare il Drone AR.Parrot con WIndows Phone e WIndows 8, a tale riguardo ho realizzato un piccolo video che mostra la demo relativa.

Drone FlyWithMe.mp4 from Marco Dal Pino on Vimeo.

Sono tornato a casa davvero caricato da questo evento e non posso che ringraziare tutti coloro che lo hanno organizzato e vi hanno partecipato per aver reso indimenticabili quei tre giorni.

Tagged with:  
W

Microsoft Embedded Conference 2014

Quest’anno farò parte dello staff speaker dell’evento Microsoft Embedded Conference 2014, che si terrà il prossimo 15 Febbraio a Napoli.

mec_w

Organizzato dalle vulcaniche menti dei ragazzi di DotNetCampania ed in particolare da Paolo Patierno, questo evento è alla sua seconda edizione; ho avuto la fortuna di assistere alla prima edizione lo scorso anno e posso garantirvi che ne vale la pena.

Insieme a me si alterneranno sul palco altri speaker molto importanti per la scena Embedded italiana e mondiale, eccoli in rigoroso ordine alfabetico:

Clemente Giorio

Lorenzo Maiorfi

Valter Minute

Paolo Patierno

Beppe Platania

Gianni Rosa Gallina

Mirco Vanini

Avremo anche una Guest star davvero importante, direttamente dagli stati uniti dove vive e lavora Samuel Phung.

Spero di vedervi di persona il prossimo 15 Febbraio, a presto!

W

Come determinare se un auricolare è inserito nel telefono

in Dev, Windows Phone , by dpcons

WP_20130916_08_23_11_Pro

Qualche tempo fa, un amico che lavorava su un grosso progetto WP8, mi chiese se conoscevo un modo di determinare quando il jack della cuffia venisse inserito o disinserito dal device, visto che all’apparenza non c’erano API specifiche che espletassero a questa funzione.

Anche io non conoscevo la risposta e nemmeno le mie ricerche su internet sortirono esito positivo.

Una idea che mi venne in mente fu quella di utilizzare le API della radio FM per misurare la potenza del segnale, poichè l’auricolare viene sfruttata come antenna per la sintonizzazioine della radio, pensai che la presenza dello spinotto nel device avrebbe fatto aumentare il livello del segnale ricevuto.

Feci qualche esperimento con FMRadio.Instance.SignalStrength misurando il cambiamento del SignalStrength inserendo o togliento una auricolare.

Questo approccio però presentava dei problemi, infatti sui device Windows Phone 8 di prima generazione (quelli per intenderci fino all’aggiornamento GDR1) non avevamo accesso alle API della radio FM ed il semplice istanziamento generava una eccezione.

Ho quindi condotto le mie prove con dei device WP7, ma anche lì le variazioni nel segnale non erano tali da determinare nettamente ed inequivocabilmente la presenza o meno dell’auricolare.

Ho condotto delle prove analoghe su device WP8 con GDR2, ma I risultati sono stati gli stessi.

Capito che questo approccio non era risolutivo ho cercato nelle API di WP8 ed ho trovato che fra quel relative al VOIP esisteva una interessante classe AudioRoutingManager.

Di per sé l’utilizzo di questa API è quello di indirizzare l’audio di comunicazioni VOIP ad endpoint diversi dall’altoparlante del telefono.

Tuttavia la classe implementa un evento AudioEndPointChanged che permette di conoscere l’attuale endpoint audio del device o se c’è stato un cambiamento dallo stato precedente, I valori riportati sono esposti da un enumeratore AudioRoutingEndpoint con I seguenti membri:

Membro

Descrizione

Default L’endpoint di default, il vivavoce
Earpiece Una auricolare
Speakerphone Il vivavoce (dall’altoparlante)
Bluetooth Un dispositivo Bluetooth
WiredHeadset Una cuffia con cavo
WiredHeadsetSpeakerOnly Cuffia cablata solo per Out, l’IN dal microfono predefinito
BluetoothWithNoiseAndEchoCancellation Disp. Bluetooth con cancellazione eco e rumori

 

Voilà! registrandosi all’evento è possibile essere “avvisati” quando lo stato cambia e di conseguenza sapere se il famoso jack è inserito o meno.

In realtà possiamo sapere anche molto di più, come visto nella tabella precedente, dipenderà quindi dalle nostre necessità nel gestire tutti I casi o solo quelli di nostro interesse.

Vediamo allora un po’ di codice tratto dall’esempio che troverete linkato alla fine del post.

Per prima cosa dobbiamo aggiungere una capability al WMAppManifest, ed in particolare la ID_CAP_VOIP.

Poi vediamo come registrare l’evento con il nostro handler:

1: AudioRoutingManager.GetDefault().AudioEndpointChanged += MainPage_AudioEndpointChanged;

 

Poi vediamo come gestire I vari casi nel nostro metodo:

   1:  public void MainPage_AudioEndpointChanged(AudioRoutingManager sender, object args)
   2:  {
   3:     var AudioEndPoint = sender.GetAudioEndpoint();
   4:     switch (AudioEndPoint)
   5:     {
   6:         case AudioRoutingEndpoint.Default:
   7:             {
   8:                 txtActual = "Default";
   9:                 break;
  10:             }
  11:         case AudioRoutingEndpoint.Earpiece:
  12:             {
  13:                 txtActual = "Earpiece";
  14:                 break;
  15:             }
  16:         case AudioRoutingEndpoint.Speakerphone:
  17:             {
  18:                 txtActual = "Speakerphone";
  19:                 break;
  20:             }
  21:         case AudioRoutingEndpoint.Bluetooth:
  22:             {
  23:                 txtActual = "Bluetooth";
  24:                 break;
  25:             }
  26:         case AudioRoutingEndpoint.WiredHeadset:
  27:             {
  28:                 txtActual = "WiredHeadset";
  29:                 break;
  30:             }
  31:         case AudioRoutingEndpoint.WiredHeadsetSpeakerOnly:
  32:             {
  33:                 txtActual = "WiredHeadsetSpeakerOnly";
  34:                 break;
  35:             }
  36:         case AudioRoutingEndpoint.BluetoothWithNoiseAndEchoCancellation:
  37:             {
  38:                 txtActual = "BluetoothWithNoiseAndEchoCancellation";
  39:                 break;
  40:             }
  41:         default:
  42:             throw new ArgumentOutOfRangeException();
  43:     }
  44:  }

 

Nel mio caso come potete vedere ho gestito tutti I casi possibili per poter verificare tutte le casistiche possibili all’interno della applicazione.

Una volta lanciata la applicazione è sufficiente inserire una auricolare o disinserirla per vedere un messaggio corrispondente indicante lo stato attuale.

wp_ss_20130915_0003

ATTENZIONE: ho effettuato test su device GDR1 e GDR2, benchè l’applicazione giri correttamente su tutti I device, su GDR1 NON vedrete cambiare I valori visualizzati.

Non ho idea del perchè non funzioni, visto che le API del VOIP sono implementate e funzionanti fin dall’uscita di WP8.

Ovviamente quanto detto si applica SOLO a device WP8.

Potete trovare I sorgenti dell’applicazione di esempio a questo link.

Tagged with:  
W

Piccole soddisfazioni personali…

in Community, Dev, Eventi, News, Windows Phone , by dpcons

NDC

Negli ultimi mesi devo dire che il mio impegno all’interno delle Community italiane mi ha dato delle belle soddisfazioni, infatti ho avuto la possibilità di partecipare in qualità di speaker o di semplice spettatore ad eventi che hanno espresso dei livelli molto alti per contenuti, organizzazione e livello complessivo.

Mi riferisco ai ComunityDays di Milano e Catania, a DotNetCampus, a Codemotion o recentissimo Better Embedded.

Senza contare I numerosissimi eventi delle singole community con cui ho maggiori rapporti tipo DotNetToscana, DotNetLombardia, DomusDotNet, DotNetCampania, DotNetLiguria che mese dopo mese continuano ad organizzare eventi, erogare contenuti, sessioni, blog post.

Oltre a questo ho avuto il piacere di ricevere nello scorso mese di marzo il riconoscimento da parte di Nokia del titolo di Nokia Developer Champion e più recentemente anche quello di Nokia developer Champion del mese di Giugno 2013; cosa posso chiedere di più? Occhiolino

Tagged with:  
W

Prossimi eventi per Dev Embedded

Vista l’onda di uscita dei nuovi prodotti Windows Embedded avremo presto parecchi eventi per conoscere I nuovi prodotti, intanto volevo segnalarvi due eventi che si svolgeranno nei prossimi mesi in cui sarà già possibile vederne un assaggio.

DotNetCampus il 13 Aprile presso Università Roma Tre

.NET Campus 2013

 

Better Embedded l’8 e 9 Luglio a Firenze

Better Embedded 2013

In queste due conferenze presenterò alcune sessioni riguardo Windows Embedded Handeld e le Applicazioni Enterprise.

W

E’ arrivata la nuova ondata

in Dev, Embedded, Generale, News , by dpcons

A partire da oggi sono disponibili le prime incarnazioni di Windows 8 per il mondo embedded.

Le versioni rilasciate oggi sono:

Windows Embedded 8 Standard: permette di creare delle versioni personalizzate del sistema operativo inserendo solo le funzionalità necessarie per le vostre applicazioni o il vostro business.

Windows Embedded Pro: è una versione full di Windows 8 ma con una speciale versione di licenza che permette di preparare I device preinstallati senza che necessitino fasi di installazione o configurazione iniziale.

Sul blog di windows embedded è disponibile una intervista a Kevin Dallas (General Manager di Windows Embedded) che parla delle nuove opportunità offerte dalla piattaforma.

Sotto trovate un link diretto all’intervista.

W

Portiamo una applicazione Enterprise da Windows Mobile a Windows Phone (Parte 1 di ??)

in Dev, Embedded, Handheld, Windows Phone , by dpcons

Sta arrivando! Il (vero) successore di Windows Mobile (Windows Embedded Handheld 6.5.x) arriverà nei prossimi mesi (settimane?), come già ben sappiamo.

Abbiamo anche ben compreso che la prossima generazione di terminali portatili sarà basata su Windows Phone OS (il nome corretto è Windows Embedded 8 Handheld o WE8H), per questo ho iniziato il porting, o forse sarebbe meglio dire riscrittura, di una delle mie applicazioni gestionali che ho sviluppato negli ultimi anni, verso il nuovo sistema operativo.

imageTQuesto è il primo di una numero imprecisato di post, in cui cercheò di analizzare e mostrare ogni aspetto del porting/riscrittura dell’applicazione.

 

La  App

E’ stata sviluppata per alcuni clienti operanti nel settore della moda e abbigliamento per gestire I trasferimenti di merce fra negozio e negozio, fra magazzini e negozi e vice versa.

Oltre ai trasferimenti la applicazione implementa le procedure di inventario della merce per il magazzino o per il negozio. Gli articoli sono identificati naturalmente dal loro codice a barre che corrisponde ad un articolo in un certo colore (o variante) e taglia. Gestiamo anche alcune altre informazioni di cui vedremo I dettagli in uno dei prossimi post.

 

I Dati

Di solito I barcode risiedono in un DB locale installato sul device e sincronizzato ogni notte con il server centrale dell’azienda. Ai tempi in cui fu scritta questa applicazione la disponibilità reti WiFi affidabili nei magazzini non era comune, per questo la maggior parte delle installazioni utilizzano il DB locale sul device.

In molti casi il numero di barcode (record) è molto elevato, ho delle installazioni di questa procedura con 4 Milioni di record nel DB, si 4.000.000 righe in un file sdf di un DB SQLCe che necessita di essere sincronizzato ogni notte (moltiplicato per il numero di dispositivi installati).

In molti casi ho cercato di di convincere il cliente ad installare un server di backoffice, degli access point ed utilizzare un servizio WCF sul server per reperire il barcode e le altre informazioni dal terminale via connessione WiFi. Ho quasi sempre fallito! Crying face

Considerare di passare questa struttura su WP8 non è molto difficile, possiamo continuare ad utilizzare SQLCe ma non con le metodologie di accesso precedenti (connessione, command esecuzione della query ecc) ma solo via LINQ to SQL, non c’è supporto per T-SQL su WP8. potremmo anche considerare l’adozione di un DB SQLite, che viene utilizzato sempre più spesso nelle applicazioni WP8 e Win8, visto anche che su quest’ultimo non c’è supporto a SQLCe.

Al giorno d’oggi tutti (la maggior parte ) dei magazzini sono equipaggiati con una copertura WiFi che permetterebbe più semplicemente di utilizzare lo scenario di lavoro connesso. C’è comunque da tenere in considerazione e gestire le modalità di lavoro disconnesse per tutte le situazioni di lavoro fuori copertura, o in negozio dove potrebbe non esserci copertura o accesso al server.

 

I device

image

Solitamente io ho sempre installato dispositivi Symbol (Motorola) ed in particolare I modelli MC70/75 e MC3000/3100.

Questi device montano dei processori ARM a 600 MHz ed hanno un massimo di 256 MB Ram /1GB Flash (per I modelli più recenti) nulla al confronto dei requisiti minimi di un device WP8: processore Snapdragon a non meno di 1 GHz dual core, 512 MB Ram /4GB Storage.

Per ora non sono disponibili e non sono stati ancora annunciati device WE8H, Suppongo però che le specifiche tecniche non differiranno di molto da quelle di WP8. La principale differenza sarà la costruzione di tipo rugged (1), il lettore di codici a barre, le tipologie di radio che avranno a bordo (Wi-Fi, GSM/3G/LTE, Bluetooth), o I tipi di interfacce di scrittura/lettura tipo NFC or RFID.

 

Nel prossimo post vedremo la struttura della applicazione ed inizieremo ad analizzare come “portare” alcune caratteristiche valutando le differenze dei sistemi operativi e considerando le guideline  per le Modern UI app per la User Experience e per la User Interface.

 

(1) Contenitori  e strutture del device che permettono di resistere a cadute a terra o schizzi e polvere, o di lavorare in ambienti con agenti ambientali sfavorevoli.

W

Un’altra conferenza, un’altra sessione

in Community, Dev, Eventi, News, Sensor Platform , by dpcons

In quest’ultimo periodo ci sto davvero prendendo gusto, infatti è uscita oggi pomeriggio l’agenda ufficiale dell’evento Codemotion,image e dopo l’esperienza avuta nell’edizione veneziana dello scorso novembre, sarò presente con una nuova sessione, stavolta in compagnia di due carissimi amici: Massimo Bonanni e Nicolò Carandini entrambi membri e fondatori della community DomusDotNet

Presenteremo una sessione molto particolare come potete capire dal titolo:

“Morra cinese in salsa gesture con contorno di SignalR”.

L’appuntamento quindi è per il 22 Marzo alle ore 10.50 presso la facoltà di Ingegneria dell’Università Roma tre di Roma, vi garantisco che ci sarà da divertirsi!!! Winking smile

 

Tagged with:  
W

La mia “prima volta” ai Community Days

La scorsa settimana presso la sede Milanese di Microsoft si sono svolti I CommunityDays 2013, un evento che riunisce le community italiane legate allo sviluppo .NET e Windows.

Una due giorni di sessioni su tutte le novità relative alle tecnologie Microsoft.

CommunityDays.it

Io, alla mia prima presenza in qualità di speaker, ho presentato due sessioni (una delle quali per sostituire un collega indisposto).

Le sessioni erano:

MFX02 Kinect e gadgeteer: Al giorno d’oggi, l’utilizzo di NUI (Natural User Interface) rende possibili nuove modalità di interazione con i dispositivi. In questa sessione utilizzeremo .NET Gadgeteer per costruire un robot dotato di telecamera e sistema di difesa, mostreremo come controllare i suoi movimenti e i suoi accessori utilizzando sia Kinect, con gesture e riconoscimento vocale, sia il nuovo Sensor and Location Platform di Windows 8.

Questa sessione è stata preparata e presentata insieme a due amici Marco Minerva e Massimo Bonanni.

Trovate due brevi video relativi a questa sessione qui e qui

 

WP806 – Mappe su Windows Phone 8: Tra le molte novità arrivate con Windows Phone 8 vi sono i nuovi servizi di geolocazione e il nuovo Map Control basato su Nokia Maps. In questo ‘crash course’ di mezzora illustreremo velocemente i concetti principali per poi soffermarci sull’implementazione delle funzionalità di background tracking e di fast resume e dei relativi metodi di notifica all’utente.

Riporto il link al blog di Nicolò Carandini che era lo speaker originariamente previsto per questa sessione.

Tagged with:  
W

Stampiamo con Windows Phone

in Dev, Embedded, Windows Phone , by dpcons

La scorsa settimana ho partecipato in qualità di speaker a WPReborn, un evento organizzato dalla Community DotNetLombardia presso la sede Microsoft di Milano.

Come indica il nome l’evento poneva l’accento su Windows Phone ed in particolare tutte le novità che WP8 ha portato ma anche parecchi aspetti che di solito vengono meno trattati.

Il mio speech riguardava le applicazioni Enterprise su WP8.

In particolare ho sviluppato la demo applicativa di una app per la gestione dei parcheggi a pagamento cittadini, con relativa stampa del ticket relativo alla sanzione di parcheggio.

Questo tipo di applicazioni sono ovviamente sotto I nostri occhi tutti I giorni, ma ovviamente (per ora) non ce ne sono per Windows Phone.

Vorrei condividere la mia esperienza relativa alla connessione della stampante e alla stampa vera e propria dello scontrino.

Partiamo parlando della stampante: ho utilizzato una Custom MY Printer Bluetooth.

La azienda ha recentemente annunciato il supporto per Windows Phone 8 e dovrebbe rendere disponibile un piccolo SDK per interfacciarsi alla stampante.

Visto che io non avevo ancora a disposizione l’SDK del costruttore, ho seguito un approccio “a mano”.

Connessione e comunicazione

La connessione con la stampante avviane tramite Bluetooth che deve (ovviamente) essere attivato sul telefono e stabilita una relazione con la stampante.

imageA questo punto nella applicazione possiamo ricercare i device Bluetooth disponibili (e connessi) tramite il seguente:

 1:  PeerFinder.AlternateIdentities["Bluetooth:PAIRED"] = "";
 2:             try
 3:             {
 4:                 IReadOnlyList<PeerInformation> devices =
 5:          await PeerFinder.FindAllPeersAsync();

 

La lista che otteniamo potrà essere scandita per cercare il device per nome (nel mio caso cercavo nel nome del device la stringa “MY”Printer”.

A questo punto siamo in grado di aprire effettivamente il canale di comunicazione con il dispositivo:

 1:    this.btsocket = new StreamSocket();
 2:    try
 3:    {
 4:        await this.btsocket.ConnectAsync
 5: (hname, "{00001101-0000-1000-8000-00805F9B34FB}");
 6:    }
 7: ...
 8:    if (this.btsocket != null)
 9:    {
 10:        this.txData = new DataWriter
 11:           (this.btsocket.OutputStream);
 12:        this.rxData = new DataReader
 13:           (this.btsocket.InputStream)
 14:    }

 

E successivamente creare un DataWriter ed un DataReader che utilizzeremo per scrivere e leggere sulla stampante.

Stampiamo

A questo punto inizia la parte “divertente”, ovvero inizieremo a mandare stringhe alla stampante che verranno impresse sulla sottile striscia di carta termica.

C’è da tenere conto che la stampante funziona in emulazione ESC/POS e pertanto è possibile cambiare la tipologia del carattere, allargarlo, allungarlo o stampare in negativo semplicemente inviando gli opportuni caratteri di controllo prima della stringa da stampare.

Ad esempio per stampare in modalità negativa è sufficiente inviare la sequenza esadecimale “1D” “42” “01” seguito dalla stringa da stampare, successivamente invieremo la sequenza “1D” “42” “00” che disabiliterà questa modalità, ovvero:

 1: txData.WriteBytes(Cmd_ALTCMD);
 2: txData.WriteBytes(Cmd_Inverse);
 3: txData.WriteBytes(Cmd_ON);
 4: txData.WriteString("| Enterprise APP on WP8 |");
 5: txData.WriteBytes(Cmd_CommandLF);
 6: txData.WriteBytes(Cmd_ALTCMD);
 7: txData.WriteBytes(Cmd_Inverse);
 8: txData.WriteBytes(Cmd_OFF);
 9:  
 10: await (IAsyncOperation<uint>)
 11:    txData.StoreAsync();

 

dove I vari “Cmd…” sono definiti nel seguente modo:

 1: byte[] Cmd_CommandLF = new byte[] { 10 };
 2: byte[] Cmd_ESC = new byte[] { 27 };
 3: byte[] Cmd_ALTCMD = new byte[] { 29 };
 4: byte[] Cmd_Enlarged = new byte[] { 69 };
 5: byte[] Cmd_ON = new byte[] { 1 };
 6: byte[] Cmd_OFF = new byte[] { 0 };
 7: byte[] Cmd_Inverse = new byte[] { 66 };
 8: byte[] Cmd_ModoStampa = new byte[] { 33 };
 9: byte[] Cmd_D_LargALT = new byte[] { 48 };
 10: byte[] Cmd_D_LargALT_font2 = new byte[] { 49 };
 11: byte[] Cmd_D_Larg = new byte[] { 32 };
 12: byte[] Cmd_D_Alte = new byte[] { 16 };

 

La chiamata a “StoreAsync()” prende lo stream di dati precedentemente predisposto e lo invia (in maniera asincrona) alla stampante.

Questo approccio ovviamente ci riporta indietro di parecchi anni quando per programmare un report bisognava impazzire fra codici di controllo e salti riga in una impari lotta giornaliera.

Discorso analogo, ma molto più complicato per quanto riguarda la stampa di immagini o grafiche personalizzate, in questo caso infatti l’immagine da stampare (ovvero la sua rappresentazione a mappa di bit) deve essere scomposta in “strisce” di bit rappresentanti l’immagine ed inviati a pacchetti secondo una specifica sintassi.

In questi giorni ho ricevuto dal produttore la conferma della disponibilità a breve dell’SDK completo per la stampante in cui sarà possibile stampare una bitmap partendo direttamente da dal file e senza necessità di fare conversioni di nessun tipo.

 

UPDATE: La Custom ha pubblicato una applicazione di prova sullo store per WP8 che permette di testare le funzionalità di stampa testuale e grafica della stampante in maniera molto intuitiva, la potete trovare a questo link.

Tagged with: