• Come un abito cucito su misura, i nostri progetti software uniscono le potenzialità di tecnologie innovative alle specifiche esigenze del cliente.

    Showcase progetti
  • Analizziamo e razionalizziamo con il cliente i processi e le attività della propria azienda, per poi seguirlo nella scelta delle giuste strategie IT da adottare.

    Le nostre competenze
  • Crediamo nelle potenzialità di un percorso formativo che unisca forti basi teoriche e metodologiche ad una continua applicazione pratica di quanto si apprende.

    Dettaglio dei corsi
  • Progettiamo e sviluppiamo sistemi e progetti basati su dispositivi mobile consumer (iPhone, Windows Phone 7 Series), industriali (Windows CE) e custom (basati su microcontrollori 8/16/32 bit).

    Approfondimenti
 

Innovactive cerca nuovi sviluppatori!

February 6, 2012 09:59 by l.maiorfi

La nostra società sta selezionando nuovi sviluppatori da inserire nel proprio organico.

Le persone che stiamo cercando saranno valutate in base ai seguenti criteri:

  • Passione e motivazione nello svolgimento della propria attività professionale
  • Capacità di analisi e progettazione di sistemi informatici per la gestione di processi business reali
  • Conoscenza dello stack Microsoft (ASP.NET, WPF, Windows Forms, Silverlight, WCF, ecc.)
  • Conoscenza delle tecnologie relative al mondo dello sviluppo Web (JavaScript, jQuery, HTML4/5, CSS, ecc.)
  • Conoscenza delle tecnologie relative al mondo dello sviluppo Mobile (iPhone, Android, WP7)
  • Autonomia nella gestione dei progetti (stima, pianificazione e rendicontazione delle attività, gestione dei contatti con gli interlocutori del Committente, ecc.)

Se pensate che la cosa possa interessarvi, potete inviare una mail con il vostro CV e/o qualsiasi altra cosa riteniate utile ad essere valutati all’indirizzo staff@innovactive.it. Risponderemo a tutti ed organizzeremo un incontro conoscitivo con tutti i candidati compatibili con il profilo cercato.


Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Supervisione e controllo real-real-time con SignalR e .NETMF

February 5, 2012 12:51 by l.maiorfi

Chi segue gli sviluppi e l’evoluzione dei sistemi per quella che viene denominata “Internet-delle-cose” (IoT, Internet of Things), sa che uno degli aspetti più intriganti riguarda la possibilità di supervisionare (ossia osservare ed agire) sistemi fisici remoti. Le piattaforme più interessanti in tal senso, Pachube e ThingSpeak, forniscono l’infrastruttura di base per una comunicazione bidirezionale, strutturata tipicamente intorno a interfacce REST/JSON, con cui i client (web, app, servizi, ecc.) interagiscono da remoto con device elettronici che a loro volta fanno capo a sensori, motori, sistemi di comunicazione periferici, ecc.

Quello che di fatto però servizi quali Pachube e ThingSpeak non permettono, per motivi legati agli inevitabili compromessi tra costi di infrastruttura e valore dell’implementazione, sono il controllo del sistema fisico veramente in real-time, ossia quello che scherzosamente ho chiamato nel titolo “real-real-time”, in cui ogni azione svolta sul sistema da remoto, ogni variazione autonoma dello stesso così come ogni notifica di variazione vengono gestite in tempi inferiori al decimo di secondo, oltre il quale l’utente perde la percezione di “tempo reale”.

Se ci poniamo come obiettivo inoltre quello di utilizzare client realizzati come applicazioni web in senso tradizionale, ossia che non utilizzino naturalmente un modello di messaging “push”, le scelte tecnologiche possibili restano poche, anzi pochissime: Flash (poco portabile soprattutto in ambito mobile), Silverlight (anch’esso un po’ troppo vincolante come potenziale platea di client), WebSockets (non ancora stabili né implementati completamente nella maggior parte dei browser, mobile e non), Applet Java (praticamente scomparse dal web e comunque poco portabili sulle nuove piattaforme) e, l’attuale miglior candidato, lo straordinario SignaR.

Senza addentrarci nei dettagli, per i quali vi rimando al Wiki del progetto su GitHub e ad un post di “recensione” di Scott Hanselman, SignalR è un framework per ASP.NET (lato server) e HTML+JS, .NET4 e WP7 (lato client) che implementa il supporto per la comunicazione bidirezionale tra client e server. Sfruttando un modello costruito intorno ai tipi “dynamic”, SignalR rende ad esempio possibile chiamare un metodo di una classe server-side da parte di uno script JavaScript e, decisamente più stupefacente, chiamare una funzione JavaScript del client da parte del server! Quello che è ancora più interessante è che SignalR semplifica in maniera imbarazzante la creazione di “concentratori" (chiamati Hub) che, oltre a ricevere chiamate dai client,  possono diramare in broadcasting messaggi a tutti i client collegati a quell’Hub.

Nell’esempio che ho realizzato, finalizzato proprio al controllo di N uscite digitali, N ingressi digitali e N ingressi analogici di un sistema, ho creato un Hub SignalR che comunica, con la mediazione di un oggetto Singleton che serializza le comunicazioni che per loro natura sarebbero parallele proveniendo da più client simultaneamente, con una scheda .NET MF (un FezPanda-II con collegati 2 led, un pulsante e un potenziometro) via Socket TCP/IP, bidirezionale e full-duplex per natura.

L’applicazione client è costituita da una singola pagina ASPX che contiene il pochissimo markup relativo ai due pulsanti per il toggling delle uscite digitali e ad un <div> per ciascuna delle grandezze rilevate (gli stati del pulsante, dei led e del potenziometro) e una cinquantina di righe di JavaScript per la attivazione dell’Hub SignalR e per il processing dei messaggi scambiati con il server. Nella sua attuale (e temporanea) implementazione l’applicazione si presenta così, più o meno indipendentemente dal browser (desktop, tablet o smartphone) su cui è stata testata:

Il sistema da controllare invece è illustrato nella foto che segue:

Nel test complessivo del sistema ho tenuto aperti simultaneamente 3 browser (Chrome, Firefox e IE) su due diversi PC, IE su un telefono WP7 e il browser di default su un telefono Android, rilevando ad esempio che (su rete locale) premendo il pulsante rosso lo stato delle otto istanze di browser veniva aggiornato simultaneamente dopo molto meno di un decimo di secondo!

Nei prossimi giorni pubblicherò il sistema su rete pubblica, così da poterr meglio valutare (magari anche grazie al vostro contributo in qualità di utenti client) gli effettivi tempi di risposta su Internet.

Diamo un’occhiata a dietro le quinte, ad iniziare dalla porzione di JavaScript client deputata a stabilire la connessione con il server e a gestire la comunicazione bidirezionale:

   1: var out1state = 0;
   2: var out2state = 0;
   3:  
   4: $(function () {
   5:  
   6:     // Creazione Proxy Automatica
   7:     var miohub = $.connection.mioHub;
   8:  
   9:     // Questa funzione è richiamata dal server all'arrivo di ogni nuova notifica
  10:     miohub.notifyMessage =
  11:     function (msg) {
  12:  
  13:         // E' l'aggiornamento dello stato iniziale (pagina appena caricata)?
  14:         if (msg.indexOf('DUMP:') != -1) {
  15:  
  16:             var dumppayload=msg.split(':')[1];
  17:  
  18:             var dumpparts = dumppayload.split(';');
  19:  
  20:             for (var i = 0; i < dumpparts.length; i++) {
  21:                 processMessage(dumpparts[i]);
  22:             }
  23:  
  24:             // mando un ack al server che mi sono allineato allo stato corrente del sistema
  25:             window.setTimeout(function () {
  26:                 miohub.sendMessage('DUMP_OK');
  27:             }, 1000);
  28:         }
  29:         else {  // E' invece un aggiornamento dello stato?
  30:             
  31:             processMessage(msg);
  32:         }
  33:  
  34:     };
  35:  
  36:     // Invocazione del metodo server SendMessage() da parte del client, al click sui pulsanti
  37:     $('#btnOUT1').click(
  38:     function () {
  39:  
  40:         out1state = (out1state == 1 ? 0 : 1);
  41:  
  42:         miohub.sendMessage('OUT 1,' + out1state);
  43:     });
  44:  
  45:     $('#btnOUT2').click(
  46:     function () {
  47:  
  48:         out2state = (out2state == 1 ? 0 : 1);
  49:  
  50:         miohub.sendMessage('OUT 2,' + out2state);
  51:     });
  52:  
  53:     // Avviamento dell'Hub SignalR
  54:     $.connection.hub.start();
  55:  
  56:     // 1 secondo e poi richiedo l'aggiornamento iniziale
  57:     window.setTimeout(function () {
  58:         miohub.sendMessage('DUMP');
  59:     }, 1000)
  60: });

Il codice server-side (semplificato per renderlo più leggibile) consiste nella definizione di una classe derivata da Hub di SignalR, in cui sia definito il metodo SendMessage(string msg) richiamato dal client e che all’occorrenza richiami la funzione notifyMessage(msg) del client:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using SignalR.Hubs;
   6: using SocketChannel;
   7: using SignalR;
   8:  
   9: namespace DemoHub
  10: {
  11:     // Definisco un mio Hub
  12:     public class MioHub : Hub
  13:     {
  14:         // Nel costruttore mi sottoscrivo all'evento di ricezione dei messaggi
  15:         // via Socket da parte del dispositivo .NET MF
  16:         public MioHub()
  17:             : base()
  18:         {
  19:             ChannelManager.MessageReceived += new Channels.MessageEventHandler(ChannelManager_MessageReceived);
  20:         }
  21:  
  22:         // All'arrivo di un messaggio da parte del dispositivo...
  23:         void ChannelManager_MessageReceived(object sender, Channels.MessageEventArgs e)
  24:         {
  25:             // ChannelManager è un singleton che gestisce la comunicazione via Socket con il dispositivo,
  26:             // poiché gli Hub sono reistanziati per ogni nuova connessione stabilita da un client,
  27:             // devo assicurarmi di spedire le notifiche solo una volta, evitando invii multipli
  28:             // ChannelManager resetta Notified a false prima di sollevare l'evento MessageReceived
  29:             if (ChannelManager.Notified) return;
  30:  
  31:             string msg=e.Message.Trim('\n','\r','\t');
  32:  
  33:             // Richiesta iniziale per conoscere lo stato corrente del sistema?
  34:             if (msg.ToUpper().StartsWith("DUMP:"))
  35:             {
  36:                 // Notifico con lo stato corrente solo il gruppo dei client
  37:                 // che si sono appena collegati
  38:                 Clients["DUMP"].notifyMessage(msg);
  39:             }
  40:             else
  41:             {
  42:                 // Notifico le variazioni a tutti i client
  43:                 Clients.notifyMessage(msg);
  44:             }
  45:  
  46:             ChannelManager.Notified = true;
  47:         }
  48:  
  49:         // Questo metodo viene chiamato direttamente dai client
  50:         public void SendMessage(string message)
  51:         {
  52:             // Il client ha allineato il proprio stato allo stato corrente del sistema
  53:             if (message == "DUMP_OK")
  54:             {
  55:                 RemoveFromGroup("DUMP");
  56:                 return;
  57:             }
  58:  
  59:             // Il client vuole lo stato corrente del sistema
  60:             if (message == "DUMP")
  61:             {
  62:                 AddToGroup("DUMP");
  63:             }
  64:  
  65:             // Il client ha mandato un messaggio che altera lo stato del sistema
  66:             // Invio il comando al dispositivo .NETMF (ad es. per impostare un'uscita digitale)
  67:             ChannelManager.SendMessage(message);
  68:         }
  69:     }
  70: }

Che dire…prodigioso!


Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Innovactive a SMAU Milano 2011

October 25, 2011 17:57 by l.maiorfi

Si è da poco conclusa la partecipazione di Innovactive a SMAU Milano 2011. In questa occasione la nostra società ha presentato due differenti progetti basati su .NET Micro Framework presso altrettanti stand.

Presso la stand di Microarea ed in collaborazione con Proximo, Innovactive ha presentato il dispositivo già in mostra a SMAU Padova 2011, dedicato alla acquisizione dei dati di produzione, in fiera provenienti da un “simulatore” di impianto (realizzato interamente con Lego) che nel caso specifico è costituito da una linea scorrevole infinita sulla quale vengono rilevati e riconosciuti diversi “blocchetti” in base al loro colore.

Il fine ultimo del dispositivo è quello di comunicare i dati che provengono dalla linea, come il conteggio dei pezzi buoni, di seconda scelta e scarti o rilevati da una serie di operazioni “utente”, quali la lettura di badge RFID identificativi o la scansione di codici a barre relativi ad esempio a specifiche fasi di lavorazione riportate in un programma di lavoro, ad un servizio HTTP/REST/JSON esposto appositamente dal software per il controllo di produzione James, sviluppato da Proximo.

Il device presentato comprende la scheda a microcontrollore, un display alfanumerico (pilotato tramite un controller I2C prodotto da ByVac, un lettore RFID seriale prodotto da SeeedStudio, un traslatore di livelli RS-232/TTL prodotto da SureElectronics, un modulo con sensore CMOS prodotto dalla stessa Sure, una scheda ethernet DFRobot basata sul chip WizNET 5100, una scheda a Relay (per l’attivazione del motore del simulatore di linea di produzione) ed una coppia di fotocellule, più un po’ di led diagnostici.

Il firmware che equipaggia il dispositivo comunica periodicamente a James i conteggi effettuati per ciascun colore, l’accesso da parte di un operatore tramite badge RFID e le letture dei codici relativi alle fasi di lavoro, mentre riceve da parte di James dei “comandi” che si riflettono sulla diagnostica (messaggi sul display e stato dei led di allarme) e sullo stato del motore del simulatore di linea (fermo o in moto).

 

Innovactive era inoltre presente presso lo stand Intrac, società del gruppo Arneg, con un progetto dedicato all’implementazione della parte embedded di un nuovo banco cassa per “Self Checkout”. Il progetto è stato sviluppato in partnership con Cocai, che ha sviluppato il software di front-end e l’integrazione con i dispositivi di pagamento. Le informazioni divulgabili sul prodotto sono al momento abbastanza limitate, ma con ogni probabilità sarà possibile vedere in opera il dispositivo sul campo molto presto.


Currently rated 3.8 by 8 people

  • Currently 3.75/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5