Yocto-Meteo : Application mobile sous Android

02 mai 2017 rdorigny 0 commentaires

Un article pour réaliser une application mobile assez simple qui affichera les données de la sonde Yocto-Meteo. Elle vous permettra de prendre connaissance à distance de la température de votre maison.

La principale difficulté consiste à récupérer les données stockées dans la base de données. Pour cela nous allons réaliser un petit web service en REST/JSON avec un script php.






Pour mémoire, nous avons réalisé un script qui enregistre tous les quarts d'heure les données d'une sonde météo de chez Yoctopuce. Notre objectif est d'afficher les valeurs de la dernière mesure. Pour cela nous allons créer un script qui reçoit une requête web et qui retourne les données dans une réponse en JSON.

Voici le script, n'oubliez pas d'initialiser la variable de connexion à la base de données:
<?php // ************************************************************************************************************* // // Ceci est l'API du web service restfull/json du serveur domotique // // DORIGNY Robert - rdorigny@free.fr - 25/08/2014 // // ************************************************************************************************************* //**************************Ici vous devrez gérer la connexion à la base de données ....c'est à vous d'initialiser la variable $Connection if ((isset($_GET["action"]))&&(isset($_GET["var"]))) { switch ($_GET["action"]) { case ("get") : api_get($_GET["var"]); break; default: print("L'action appelée n'existe pas."); } } else print("Erreur lors de l'utilisation de l'API"); function api_get($var) { global $Connection; switch ($var) { case ("temp") : //Récupération des données $requete="select tempp,pres,humidite,date from masonde BY num DESC LIMIT 1 "; $resultat=mysql_query($requete,$Connection); if ($resultat) { $t=mysql_fetch_row($resultat); $temp=$t[0]; } else $temp="Impossible d'obtenir la température."; $tab = array(); $tab["context"] = array("id"=>"441618","owner"=>"DORIGNY Robert","local"=>"fr,Saint Remy les chevreuse"); $tab["pht"] = array("pres"=>$t[1],"hum"=>$t[2],"temp"=>$t[0],"date"=>$t[3]); print(json_encode($tab)); break; default: print("La variable appelée n'existe pas."); } } ?>



Si on envoie la requête sur http://www.lesite.fr/api.php?action=get&var=temp, vous obtiendrez la réponse json avec les données:

{"context":{"id":"441618","owner":"DORIGNY Robert","local":"fr,Saint Remy les chevreuse"},"pht":{"pres":"1015.00", "hum":"48.40","temp":"22.94","date":"08 05 2017 18:45:32"}}

Ensuite, il suffit de transmettre cette requête via l'application mobile, et afficher les données extraites. L'élément important à prendre en compte, c'est que la réception d'un web service est considéré dans le framework Android comme une opération lente et risqué. Donc le traitement de cette opération sera réalisée via une tâche asynchrone (AsyncTask).

Le layout de notre application:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:context="fr.doritique.maison.MainActivity" tools:layout_editor_absoluteY="81dp" tools:layout_editor_absoluteX="0dp"> <RelativeLayout android:layout_width="368dp" android:layout_height="495dp" tools:layout_editor_absoluteX="8dp" tools:layout_editor_absoluteY="8dp"> <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true"> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_weight="1" android:text="Pour le bureau " tools:text="Pour le bureau " /> </TableRow> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/textView9" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Date - Heure" tools:text="Date - Heure" /> <TextView android:id="@+id/textView10" android:layout_width="25dp" android:layout_height="15dp" android:layout_weight="1" android:text=":" tools:text=":" /> <TextView android:id="@+id/ladate" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" "/> </TableRow> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/textView3" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Temperature" tools:text="Temperature" /> <TextView android:id="@+id/textView8" android:layout_width="25dp" android:layout_height="15dp" android:layout_weight="1" android:text=":" tools:text=":" /> <TextView android:id="@+id/latemperature" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" "/> </TableRow> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/textView4" android:layout_width="70dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Humidité" tools:text="Humidité" /> <TextView android:id="@+id/textView6" android:layout_width="25dp" android:layout_height="15dp" android:layout_weight="1" android:text=":" tools:text=":" /> <TextView android:id="@+id/lhumidite" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </TableRow> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Pression" tools:text="Pression" /> <TextView android:id="@+id/textView7" android:layout_width="25dp" android:layout_height="15dp" android:layout_weight="1" android:text=":" tools:text=":" /> <TextView android:id="@+id/lapression" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </TableRow> </TableLayout> <Button android:id="@+id/MyBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="rafraichir" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout> </android.support.constraint.ConstraintLayout>


Le code de l'application:
package fr.doritique.maison; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity { public Toast toast; public static final String TAG ="Mon_TAG"; public TextView latemperature, lapression, lhumidite, ladate; public String t; //température public String p; //pression public String h; //humidité public String d; //date @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); latemperature=(TextView) findViewById(R.id.latemperature); lapression=(TextView) findViewById(R.id.lapression); lhumidite=(TextView) findViewById(R.id.lhumidite); ladate=(TextView) findViewById(R.id.ladate); Button btn = (Button) findViewById(R.id.MyBtn); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Affiche(); } }); } public void Affiche(){ //toast=Toast.makeText(this,"test",Toast.LENGTH_LONG); //toast.show(); new RequestTask().execute("http://www.monsite.fr/api.php?action=get&var=temp"); } private class RequestTask extends AsyncTask<String, Void, String> { private String response = ""; @Override protected String doInBackground(String... urls) { Recup_WS_domo(); response=p; return response; } public void Recup_WS_domo(){ h="Ca ne marche pas..."; t="Ca ne marche pas..."; p="Ca ne marche pas..."; d="Ca ne marche pas..."; HttpURLConnection urlConnection = null; BufferedReader reader = null; String forecastJsonStr = null; try { URL url = new URL("http://www.monsite.fr/api.php?action=get&var=temp"); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.connect(); // Read the input stream into a String InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedreader=new BufferedReader(new InputStreamReader(inputStream)); StringBuilder strinbulder=new StringBuilder(); String ligne=bufferedreader.readLine(); while (ligne!=null){ strinbulder.append(ligne+"n"); ligne=bufferedreader.readLine(); } bufferedreader.close(); JSONObject jso=new JSONObject(strinbulder.toString()); JSONObject jsomain=jso.getJSONObject("pht"); h=jsomain.getString("hum"); t=jsomain.getString("temp"); p=jsomain.getString("pres"); d=jsomain.getString("date"); StringBuffer buffer = new StringBuffer(); forecastJsonStr = buffer.toString(); } catch (IOException e) { Log.e("PlaceholderFragment", "Error ", e); } catch (JSONException e) { e.printStackTrace(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } } @Override protected void onPostExecute(String result) { latemperature.setText(t+" °C"); lapression.setText(p+" Pa"); lhumidite.setText(h+" %"); ladate.setText(d); } } }


Sans oublier d'autoriser les échanges de données Internet dans le fichier manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.doritique.maison"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>


Ce qui donne une fois le fichier apk installé sur votre téléphone:


Voilà, le début d'une application domotique qui affiche les données de la sonde Yocto-Meteo. Je vous laisse reprendre le code et l'adapter à votre guise. Bon code!





Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2017 www.doritique.fr par Robert DORIGNY