Autore Topic: [medio] Android app e webserver Arduino  (Letto 7468 volte)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
[medio] Android app e webserver Arduino
« il: 04 Novembre 2013, 09:11:34 CET »
0
Livello di difficoltà: medio
Sorgenti arduino : WebserverSendjson.ino
Sorgenti android : Cantuina android app
YouTube video : http://youtu.be/0ggJLiD6sDA


<a href="http://www.youtube.com/watch?v=0ggJLiD6sDA" target="_blank">http://www.youtube.com/watch?v=0ggJLiD6sDA</a>

In occasione dei primi esperimenti di dialogo in rete tra un'app android e un webserver implementato su arduino, rendo disponibili i codici sorgenti di una prima semplice implementazione. L'idea di partenza era quella di una tipica applicazione di domotica: una scheda arduino (con ethernet shield) che su richiesta fornisse in rete i dati ambientali (temperatura, pressione, umidità) ad un'app android che poi si occupasse della presentazione dei dati.

Due sono i blocchi costitutivi:
  • la scheda arduino, su cui implementare un webserver che fornisce i dati su richiesta http
  • l'app android che esegue tale richiesta e presenta a schermo i dati ricevuti


LA SCHEDA ARDUINO

La scheda processore utilizzata è una delle più semplici, la Arduino UNO, su cui deve essere montato il così detto Ethernet Shield, una scheda di espansione che fornisce alla scheda l'hardware (connettore e chip di interfaccia) necessario a collegare un cavo di rete Ethernet.



Tra le librerie di Arduino ci sono anche quelle per gestire la rete Ethernet ed implementare lo scheletro di un WebServer, e lo sketch usato in questo esempio ne fa un uso il più possibile semplificato (lo scopo è arrivare a poco più di un hello world). Viene fatto uso anche della seriale UART del processore, per soli scopi di debug (si fa in modo da far uscire sul terminale della seriale dei messaggi in stile LogCat).

Per chi non è familiare con la struttura degli sketch arduino, ci sono due funzioni fondamentali da implementare nel codice, la funzione setup() e la funzione loop(). La funzione setup() viene eseguita una sola volta subito dopo il reset della scheda, e svolge tutte quelle funzioni di setup necessarie (è un po' come se fosse la OnCreate di android). Dopo l'esecuzione della setup(), il processore della scheda comincia ad eseguire la funzione loop() e, come fa suggerire il nome, una volta terminata la richiama come in un loop infinito. In questa funzione andremo a mettere tutte le azioni che vorremo siano ripetute "ad ogni giro".

Nella funzione setup() andremo a mettere l'inizializzazione della seriale UART (quella che usiamo per debug, come se fosse un LogCat) e l'inizializzazione della Ethernet. Per questo esempio si è scelto di usare il DHCP e quindi di ricevere l'IP dalla rete, che poi andremo a far uscire sulla seriale per debug. Ricevere l'IP è una situazione più comoda, perchè consente di collegarsi alla rete casalinga senza preoccuparsi di impostare niente, però ci crea il problema di come far sapere agli utilizzatori qual'è l'IP della scheda (vedremo nell'app android come si è scelto di risolvere questo problema).

La funzione loop(), quella eseguita continuamente in un ciclo infinito, non fa altro che controllare se c'è stata una richiesta http. In caso affermativo fa il parsing della richiesta ed assembla una risposta. Nel nostro caso si è scelto di far rispondere con un JSON minimale contenente dei dati ambientali generati randomicamente.

Questo il codice dello sketch:

Codice (C): [Seleziona]
// include
#include <SPI.h>
#include <Ethernet.h>

// globals
char cmd;
char _buf[50];
int ethok=0;
byte mac[] = { 0x00,0xAA,0xBB,0xCC,0xDE,0x02 };
IPAddress ip;

boolean isreqline = true;
String req = String();
String par = String();

// Ethernet server
EthernetServer server(80);

// the setup routine runs once when you press reset:
void setup() {
  // open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect
  }
  Serial.println("-- UART READY");
 
  // ethernet setup (using DHCP can be blocking for 60 seconds)
  ethok = Ethernet.begin(mac);
  if (ethok==0) Serial.println("ERROR : failed to configure Ethernet");
  else {
    ip = Ethernet.localIP();
    formatIP(ip);
    Serial.print("-- IP ADDRESS is ");
    Serial.println(_buf);
  }
}

// loop routine
void loop() {
 
  // web server
  if (ip[0]!=0) {
    EthernetClient client = server.available();   // listen to client connecting
    if (client) {
      Serial.println("ETHERNET : new client http request");
      boolean currentLineIsBlank = true;   // an http request ends with a blank line
      while (client.connected()) {
        if (client.available()) {
          // read char from client
          char c = client.read();
          // append to request string
          if ((isreqline)&&(req.length()<127)) req += c;
          // stop parsing after first line
          if (c=='\n') isreqline = false;
         
          // if you've gotten to the end of the line (received a newline character) and the line is blank,
          // the http request has ended, so you can send a reply
          if ((c=='\n') && currentLineIsBlank) {
           
            // if request does not contain "cantuina" keyword send 404
            if (req.indexOf("cantuina")==-1) send_404(client);
            // else send JSON response
            else {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: application/json");  // JSON response type
              client.println("Connection: close");               // close connection after response
              client.println();
              // open JSON
              client.print("{");
              // result
              client.print("\"res\":\"OK\"");
              // temperature
              client.print(",\"temp\":\"");
              client.print(15.5+random(0,20));
              client.print("\"");
              // pressure
              client.print(",\"pres\":\"");
              client.print(980+random(0,50));
              client.print("\"");
              //humidity
              client.print(",\"humi\":\"");
              client.print(25+random(0,50));
              client.print("\"");
              // close json
              client.println("}");              
            }

            // prepare for next request
            req = "";
            isreqline = true;
            // exit
            break;
          }
          if (c == '\n') {
            // you're starting a new line
            currentLineIsBlank = true;
          }
          else if (c != '\r') {
            // you've gotten a character on the current line
            currentLineIsBlank = false;
          }
        }
      }
      // give the web browser time to receive the data
      delay(1);
      // close the connection:
      client.stop();
    }
  }
}

void formatIP(IPAddress ii) {
  sprintf(_buf,"%d.%d.%d.%d",ii[0],ii[1],ii[2],ii[3]);
}

static void send_404(EthernetClient client) {
  client.println("HTTP/1.1 404 Not Found");
  client.println("Content-Type: text/html");
  client.println();
  client.println("404 NOT FOUND");
}


L'APP ANDROID

Anche per l'app android da usare nell'esempio si è scelto di usare un approccio il più possibile semplificato, cioè senza quei ritocchi che sarebbero necessari in un'app da rilasciare (controlli vari e preferences per i parametri), per cui è stata sufficiente una singola activity. Unica aggiunta esterna sono le due librerie, la android-async-http per la gestione delle richieste http e la holographlibrary per disegnare graficamente i dati ricevuti.



Il grafico presente nella schermata dell'app serve a mostrare l'andamento del parametro temperatura di lettura in lettura. I bottoni ADD e SHIFT permettono di testare questo componente, il primo permette di aggiungere dinamicamente un punto alla linea del grafico, il secondo fa la stessa cosa, ma quando i punti sono più di 10, butta via il più vecchio, così da averne sempre e solamente massimo 10 visualizzati.

Sotto il grafico è presente il bottone SCAN, che svolge una funzione fondamentale. Se ricordate abbiamo detto che la scheda Arduino riceve il suo IP dinamicamente tramite il DHCP, per cui un utente con la sua app android molto difficilmente sarà in grado di sapere quale sia questo IP. Per risolvere questo problema, si fornisce all'app la subnet della rete locale (nel mio caso nel formato http: // 10.0.0.*) e premendo SCAN l'app si occupa di testare tutti gli IP partendo da PINGSTART fino a PINGTO (nell'esempio da 1 a 20). In questo esempio ho cablato l'indirizzo nel codice, ma è chiaro che in un'app vera e propria vorrete avere una preference in cui impostarlo o addirittura fare in modo che lo trovi da sola.

Cliccando SCAN si avvia la funzione scanNet() che esegue la scansione IP per IP, mostrando i tempi di risposta e l'esito di ciascun tentativo. Questo genere di informazione è visibile solo a scopi di test, e difficilmente meriterà visualizzarla in un'app vera e propria. Quando una richiesta riceve risposta, l'indirizzo viene memorizzato e la scansione ha termine.

Cliccando sul bottone FETCH si esegue una richiesta HTTP del tutto analoga a quella usata per la scansione, ma in aggiunta viene anche processata la risposata JSON. Trattandosi di un'app di test non ci si è preoccupati di validare le risposte e nemmeno di implementare il parsing del JSON in un thread separato (è comunque molto breve). Le informazioni estratte dal JSON sono mostrate in TextView ed un particolare quella relativa alla temperatura viene anche aggiunta al grafico.

Una demo dell'intero funzionamento è disponibile nel video youtube citato all'inizio del tutorial.

Questo il codice della MainActivity,java

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

   // views
   Button btnAdd,btnShift,btnScan,btnFetch;
   TextView tvNetresult,tvTemp,tvPres,tvHumi;
   
   // graph vars
   LineGraph li;
   Line l;
   LinePoint p;
   int dx = 15;

   // net vars
   String starturl = "";    // starting URL with * on the 4th IP number
   String pingurl = "";     // URL being pinged during scanning
   String serverurl = "";   // final URL after successful scanning
   int pingFrom,pingTo;     // 4th IP number scanned From and To
   long mTime = 0;          // Time and DeltaTime for measuring network latency
   long mDeltaTime = 0;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.ac_main);
     
      // get views
      getViews();
     
      // line example
      l = new Line();
      l.addPoint(new LinePoint(0,5));
      l.addPoint(new LinePoint(8,8));
      l.addPoint(new LinePoint(10,4));
      l.setColor(Color.parseColor("#6699CC"));
      l.setStrokeWidth(2);
     
      // set graph
      li.addLine(l);
      li.setRangeY(0,40);
      li.setOnPointClickedListener(new OnPointClickedListener(){
         @Override
         public void onClick(int lineIndex,int pointIndex) {          
         }
      });
     
      // add button listener
      btnAdd.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {    
            li.addPoint(0,new LinePoint(dx,(dx%11)));
            dx += 1;
         }
      });
     
      // shift button listener
      btnShift.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            li.shiftPoint(0,new LinePoint(dx,(dx%11)),10);
            dx += 3;
         }
      });
     
      // scan button listener
      btnScan.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            starturl = "http://10.0.0.*/cantuina";
            pingFrom = 1;
            pingTo = 20;
            scanNet();
         }
      });
     
      // fetch button listener
      btnFetch.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            if (!serverurl.isEmpty()) fetchValues();
         }
      });
     
   }

   // SCANNET : scan addresses in local subnet
   // if starturl = "[url]http://10.0.0.*" and pingFrom=1 pingTo=20
   // scans from 10.0.0.1 to 10.0.0.19 until someone answers
   private void scanNet() {
      // http client instance
      AsyncHttpClient client = new AsyncHttpClient();
      client.setTimeout(1000);
      // calculating url to ping
      pingurl = starturl.replace("*",Integer.toString(pingFrom));
      mTime = System.currentTimeMillis();
      // ping url
      client.get(pingurl,new AsyncHttpResponseHandler() {
         // callback called on success
         @Override
         public void onSuccess(String response) {
            mDeltaTime = System.currentTimeMillis() - mTime;
            String txt = pingurl.substring(0,pingurl.indexOf("/",8));
            tvNetresult.setText(txt+" OK in "+mDeltaTime+" ms");
            // save server url on success
            serverurl = pingurl;
         }
         // callback called on failure
         @Override
         public void onFailure(Throwable e,String response) {
            mDeltaTime = System.currentTimeMillis() - mTime;
            String txt = pingurl.substring(0,pingurl.indexOf("/",8));
            tvNetresult.setText(txt+" FAILED in "+mDeltaTime+" ms");
            // continue scanning on failure
            if (pingFrom<pingTo) {
               pingFrom++;
               scanNet();
            }
         }
      });
   }
   
   // FETCHVALUES : fetch values from serverurl
   private void fetchValues() {
      // http client instance
      AsyncHttpClient client = new AsyncHttpClient();
      client.setTimeout(1000);
      // fecth values
      client.get(serverurl,new AsyncHttpResponseHandler() {
         // callback called on success
         @Override
         public void onSuccess(String response) {

            // parse json from server
            // example : {"res":"OK","temp":"25.0","pres":"1020","humi":"45"}
            try {
               JSONObject jso = new JSONObject(response);
               float iTemp = (float) jso.getDouble("temp");
               int iPres = jso.getInt("pres");
               int iHumi = jso.getInt("humi");
               tvTemp.setText(iTemp+" °C");
               tvPres.setText(iPres+" mbar");
               tvHumi.setText(iHumi+" %");
               li.shiftPoint(0,new LinePoint(dx,iTemp),20);
               dx++;
            } catch (JSONException e) {
            }
           
         }
         // callback called on failure
         @Override
         public void onFailure(Throwable e,String response) {
            tvTemp.setText("ERROR fetching values");
         }
      });
   }
   
   // [UNUSED] PINGADDRESS : ping given address
   private void pingAddress(String url) {
      AsyncHttpClient client = new AsyncHttpClient();
      client.setTimeout(1000);
      pingurl = url;
      mTime = System.currentTimeMillis();
      client.get(pingurl,new AsyncHttpResponseHandler() {
         // callback called on success
         @Override
         public void onSuccess(String response) {
            mDeltaTime = System.currentTimeMillis() - mTime;
            tvNetresult.setText(pingurl+" OK in "+mDeltaTime+" ms");
         }
         // callback called on failure
         @Override
         public void onFailure(Throwable e,String response) {
            mDeltaTime = System.currentTimeMillis() - mTime;
            tvNetresult.setText(pingurl+" FAILED in "+mDeltaTime+" ms");
         }
      });
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   // initialize views references
   private void getViews() {
      li = (LineGraph)findViewById(R.id.linegraph);
      btnAdd = (Button)findViewById(R.id.btnAdd);
      btnShift = (Button)findViewById(R.id.btnShift);
      btnScan = (Button)findViewById(R.id.btnScan);
      tvNetresult = (TextView)findViewById(R.id.tvNetresult);
      btnFetch = (Button)findViewById(R.id.btnFetch);
      tvTemp = (TextView)findViewById(R.id.tvTemp);
      tvPres = (TextView)findViewById(R.id.tvPres);
      tvHumi = (TextView)findViewById(R.id.tvHumi);
   }
}


BIBLIOGRAFIA

sito web arduino : Arduino - HomePage
loopj/android-async-http library : https://github.com/loopj/android-async-http
com.echo.holographLibrary : https://bitbucket.org/danielnadeau/holographlibrary/overview
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline kalacta269

  • Utente normale
  • ***
  • Post: 152
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Asus Transformer pad tf300
  • Sistema operativo:
    windows7
Re:[medio] Android app e webserver Arduino
« Risposta #1 il: 08 Novembre 2013, 09:43:40 CET »
0
Ciao ho alcune domande su questo tutorial
eccole di seguito:

1) Ma i dati che arrivano sono reali? cioè la scheda arduino ha dei sensori che rilevano temperatura pressione ecc....ecc....? o sono inventati?  ed è mostrato solo come arduino comunica con un app android?

2) Come si programma la scheda arduino c'è un ide che mi consigli? si deve fare una qualche operazione?

Praticamente questo campo mi interessa ma non ho nessuna esperienza in merito tranne che per la programmazione android dove me la cavicchio un po.........

Grazie

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:[medio] Android app e webserver Arduino
« Risposta #2 il: 08 Novembre 2013, 11:48:49 CET »
0
1) Ma i dati che arrivano sono reali? cioè la scheda arduino ha dei sensori che rilevano temperatura pressione ecc....ecc....? o sono inventati?  ed è mostrato solo come arduino comunica con un app android?

Per lo scopo di questo tutorial, i dati sono generati in modo random sull'arduino, ma in prospettiva possono essere letti anche da sensori ambientali collegati alla board.

2) Come si programma la scheda arduino c'è un ide che mi consigli? si deve fare una qualche operazione?

Praticamente questo campo mi interessa ma non ho nessuna esperienza in merito tranne che per la programmazione android dove me la cavicchio un po.........

Per il mondo arduino parti da qua ( Arduino - HomePage ), ci trovi software, documentazione, board ed anche il forum di una community.

Tieni conto che se non hai nessun background di elettronica, le difficoltà di ingresso alla materia non sono banali, principalmente perchè non hai come nel caso software uno strumento integrato e user-friendly di sviluppo-simulazione-deployment-debug. Hai un compilatore, ma non hai un simulatore, devi programmare il device fisico e fare debug sul device, ma non hai un debugger software con cui controlli tutto, quello che vedi lo vedi sull'hardware (led, tester, a limite fai uscire qualche parola dalla seriale).

A chi veramente vuol cominciare ad armeggiare con l'elettronica a livello hobbystico, consiglio di esplorare con calma il mondo arduino e frequentarne la community, proprio come per lo sviluppo android si frequenta anddev.it o altri forum.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline kalacta269

  • Utente normale
  • ***
  • Post: 152
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Asus Transformer pad tf300
  • Sistema operativo:
    windows7
Re:[medio] Android app e webserver Arduino
« Risposta #3 il: 08 Novembre 2013, 11:50:35 CET »
0
Grazie mille per le risposte adesso do una bella occhiata :-)

Offline Gianni Gallo

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei y300
  • Sistema operativo:
    windows 7
Domotichome e webserver Arduino
« Risposta #4 il: 17 Luglio 2014, 15:16:02 CEST »
0
Buon giorno a tutti

Mi chiamo Gianni, vivo ad Olbia e sono appassionato di elettronica
Volevo chiedervi un consiglio sull'affidabilità dell'App domotichome se qualcuno di Voi l'ha testato.
Inoltre ho scaricato i codici in formato .zip, ma non ho capito quale file devo caricare su Arduino?
Grazie
a presto


Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:[medio] Android app e webserver Arduino
« Risposta #5 il: 18 Luglio 2014, 09:05:15 CEST »
0
Arduino usa degli sketches in formato .ino, se hai già installato l'ide dovresti vedere quel tipo di file rappresentato dal simbolo di arduino

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:[medio] Android app e webserver Arduino
« Risposta #6 il: 18 Luglio 2014, 09:20:05 CEST »
0
Bella guida bradipao!
Potresti darmi una dritta su come inviare dati ad arduino? Per esempio per cambiare una variabile.
Inoltre se mi permetti vorrei consigliare di commentare la riga Serial.begin() una volta finiti i test perché la comunicazione seriale con il PC rallenta arduino in modo significativo a volte

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:[medio] Android app e webserver Arduino
« Risposta #7 il: 18 Luglio 2014, 09:35:29 CEST »
0
Potresti darmi una dritta su come inviare dati ad arduino? Per esempio per cambiare una variabile.

Premetto che questo tutorial era il mio primo esperimento con Arduino, da allora sono andato un po' avanti ed ho smussato diversi spigoli rispetto all'implementazione rozza di questo sketch. Nel repository github ci sono tutti i miei successivi esperimenti.

Per inviare dati devi fare il parsing della stringa di http request ricevuta da Arduino. Se vedi nel mio codice faccio un parsing molto molto rozzo usando req.indexOf(). Se però mandi dei parametri, devi estrarli con un parsing vero e proprio.

Inoltre se mi permetti vorrei consigliare di commentare la riga Serial.begin() una volta finiti i test perché la comunicazione seriale con il PC rallenta arduino in modo significativo a volte

Si hai perfettamente ragione. Una volta sistemato lo sketch, l'ideale sarebbe rimuovere tutti gli output di log e debug.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Gianni Gallo

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei y300
  • Sistema operativo:
    windows 7
Re:[medio] Android app e webserver Arduino
« Risposta #8 il: 19 Luglio 2014, 12:32:58 CEST »
0
Ciao Bradipao
L'ide l'ho scaricato tempo fa
Ho verificato i file inseriti nel file zip domotichome-master ma non c'è nessun file con l'icona di arduino.
Inoltre ho provato ad aprire i file attraverso l'ide di arduino ma mi esce il messaggio
" nessun elemento corrispondente alla ricerca"
Pls puoi indicarmi un percorso da seguire
Grazie Gianni

Offline Paso

  • Utente junior
  • **
  • Post: 98
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy sIII mini
  • Sistema operativo:
    Linux Mint 17 64-bit
Re:[medio] Android app e webserver Arduino
« Risposta #9 il: 19 Luglio 2014, 14:42:12 CEST »
0
Ciao Gianni,
ti rispondo io visto visto che con arduino ho parecchia familiarità.
Per prima cosa verifica che la versione dell'ide sia la 1.0.5 scaricabile da http://arduino.cc/en/Main/Software
Poi apri l'IDE File -> Apri (Ctrl+O) e cerchi la cartella che hai scompattato. L'IDE dovrebbe vedere solo i file .ino che è un formato di testo come il .txt ; casomai non te li aprisse direttamente puoi aprirli con l'editor di testo e fare copia incolla.
Se proprio non riesci posta il link con lo zip così dò un'occhiata al contenuto e magari riesco a dirti qualcosa di più.

Offline Gianni Gallo

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei y300
  • Sistema operativo:
    windows 7
Re:[medio] Android app e webserver Arduino
« Risposta #10 il: 19 Luglio 2014, 16:21:19 CEST »
0
Ciao a tutti

Allora dopo un po di prove sono arrivato al seguente punto:
1 Caricato lo sketch su arduino
Aperto il monitor seriale e vedo che tra il PC / smartphone ed arduino c'è comunicazione.
Domanda come faccio a caricare le librerie su android per scaricare APP?
Pare che il punto critico sia proprio caricare l'app
Qualcuno può aiutarmi?

Post unito: 19 Luglio 2014, 16:45:55 CEST
saluto a tutti

Scusate ma mi sono espresso male in precedenza
Allora il l'app domotichome lo scaricata; poi ho caricato il framework su arduino e ho verificato la comunicazione tra i vari nodi.
Quando apro l'app appare il messaggio " attention you should sync domoticgome with your arduino.
Da quanto ho capito devo scaricare due librerie android-async-http e la holographlibrary
A qusto punto mi blocco perchè non so come procedere
Tra l'altro sono riuscito a scaricare la cartella zip di sync ma la cartella holograph no.
Come avrete capito mi mancano un po di passaggi per arrivrare ad attivare l'App
TKS Gianni
« Ultima modifica: 19 Luglio 2014, 16:45:55 CEST da Gianni Gallo, Reason: Merged DoublePost »