TI Sensortag : Application Android pour afficher les mesures (partie 4)

30 aout 2014 rdorigny 0 commentaires

Ceci est l’ultime étape du projet de station météo à base du Sensortag CC2541. Nous allons réaliser une application Android pour afficher les mesures réalisées de température, pression et humidité avec le Sensortag.

Vous pourrez ainsi connaitre à distance la température de votre maison ou de votre jardin!





1)Première étape : Mise en place du web service

Je reprends ici, un article qui explique comment réaliser un service web simplement sous PHP. Pour mémoire, l'article est ici. Vous trouverez toutes les explications sur le principe des web services REST/JSON.

Donc en reprenant quelque peu le script PHP :
<?php // ************************************************************************************************************* // // Ceci est l'API du web service restfull/json du serveur domotique // // DORIGNY Robert - rdorigny@free.fr - 25/08/2014 // // ************************************************************************************************************* //**************************Chargement des librairies //N'oubliez pas d'initialiser la connexion à la base de données! 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 tp,pr,hum,date from matable ORDER 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."); } } ?>

Et donc notre API retourne un fichier json, pour le tester il suffit de taper dans un navigateur une url de la forme http://votreserveurweb/api.php?action=get&var=temp . Ce qui retournera :
{"context":{"id":"441618","owner":"DORIGNY Robert","local":"fr,Saint Remy les chevreuse"}, "pht":{"pres":"1009.59","hum":"64.68","temp":"22.16","date":"30 08 2014 18:52:11"}}

2)Seconde étape : Création de l'application

De la même façon, je reprends ce que j'avais initié dans l'article cité précédemment. Pour faire simple, l'application lance à la demande de l'utilisateur (clic sur le bouton) une tâche asynchrone du framework Android qui est chargée de récupérer les données des mesures via le web service puis de rafraîchir l'affichage de la fenêtre principale de l'application.

Donc le programme principale MainActivity.java:
package fr.doritique.sensortag; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONObject; import android.os.AsyncTask; 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 android.app.Activity; public class MainActivity extends Activity { public Toast toast; public static final String TAG ="Mon_TAG"; public TextView latemperature, lapression, lhumidite,datemesure; 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_main2); latemperature=(TextView) findViewById(R.id.latemperature); lapression=(TextView) findViewById(R.id.lapression); lhumidite=(TextView) findViewById(R.id.lhumidite); datemesure=(TextView) findViewById(R.id.datemesure); Button btn = (Button) findViewById(R.id.MyBtn); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Affiche(); } }); } public void Affiche(){ new RequestTask().execute("http://monsiteweb.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..."; HttpClient httpclient= new DefaultHttpClient(); try { HttpGet httpGet=new HttpGet("http://monsiteweb.fr/api.php?action=get&var=temp"); HttpResponse httpresponse=httpclient.execute(httpGet); HttpEntity httpentity=httpresponse.getEntity(); if (httpentity!=null){ InputStream inputstream=httpentity.getContent(); 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"); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } @Override protected void onPostExecute(String result) { latemperature.setText(t+" °C"); lapression.setText(p+" Pa"); lhumidite.setText(h+" %"); datemesure.setText(d); } } }

Le Layout:
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:useDefaultMargins="true" android:alignmentMode="alignBounds" android:columnOrderPreserved="false" android:columnCount="5" > <TextView android:text="Météo maison" android:textSize="24dip" android:layout_columnSpan="5" android:layout_gravity="center_horizontal"/> <TextView android:layout_columnSpan="5" android:layout_gravity="left" android:layout_width="fill_parent" android:text="Pour le bureau :" android:textSize="18sp" /> <TableLayout android:layout_column="4" android:layout_width="fill_parent" android:layout_gravity="left|top" android:layout_row="4" > <TableRow android:id="@+id/tableRow1" android:layout_height="wrap_content" android:layout_gravity="left|top" android:layout_width="fill_parent" android:layout_row="1"> <TextView android:id="@+id/textView1" android:layout_column="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Température" /> <TextView android:id="@+id/textView2" android:gravity="center" android:layout_width="40px" android:layout_height="wrap_content" android:layout_column="2" android:text=":" /> <TextView android:id="@+id/latemperature" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </TableRow> <TableRow android:id="@+id/tableRow2" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView5" android:layout_column="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pression" /> <TextView android:id="@+id/textView6" android:layout_column="2" android:layout_width="40px" android:gravity="center" android:layout_height="wrap_content" android:text=":" /> <TextView android:id="@+id/lapression" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </TableRow> <TableRow android:id="@+id/tableRow3" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView9" android:layout_column="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Humidité" /> <TextView android:id="@+id/textView10" android:layout_column="2" android:gravity="center" android:layout_width="40px" android:layout_height="wrap_content" android: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:id="@+id/tableRow4" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView13" android:layout_column="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Date" /> <TextView android:id="@+id/textView14" android:layout_column="2" android:gravity="center" android:layout_width="40px" android:layout_height="wrap_content" android:text=":" /> <TextView android:id="@+id/datemesure" android:layout_column="3" android:gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </TableRow> </TableLayout> <Space android:layout_row="5" android:layout_column="0" android:layout_columnSpan="3" android:layout_gravity="fill" /> <Button android:id="@+id/MyBtn" android:layout_column="4" android:layout_gravity="center_horizontal|bottom" android:layout_row="6" android:gravity="center" android:text="Rafraîchir" /> </GridLayout>

Sans oublier d'autoriser l'accès à Internet pour l'application Android avec le fichier AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.doritique.sensortag" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

Ce qui affichera :

Conclusion

Voila pour la création d'une station météo à base du Sensortag. Evidemment, l'application Android n'est pas obligatoire, c'est un peu le truc gadget. A noter que le script python peut être adapté pour réaliser des mesures avec plusieurs Sensortag (le script PHP le prend déjà en compte par le numéro de sonde).






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




© 2024 www.doritique.fr par Robert DORIGNY