Voici une méthode permettant de calculer la distance entre 2 coordonnées (Latitude & Longitude) placées sur la carte affichée sur l’application mobile comme vu précédemment :

public double GetDistance(double pLat1, double pLong1, double pLat2, double pLong2)
{
double DEGTORAD = Math.PI / 180.0;
double RADTODEG = 180.0 / Math.PI;
double theta = pLat1 – pLat2;
double d = Math.sin(pLat1 * DEGTORAD) * Math.sin(pLat2 * DEGTORAD) + Math.cos(pLat1 * DEGTORAD) * Math.cos(pLat2 * DEGTORAD) * Math.cos(theta * DEGTORAD);
d = Math.acos(d);
d *= RADTODEG;
d *= 60 * 1.1515;
d *= 1.609344;
return d;
}

Cette méthode se trouve dans le service web dans la partie JEE.

Nous devions utiliser la plate forme Azure de Microsoft pour héberger le site Internet et la base de données. Nous avons abandonné cette option et nous avons choisi d’utiliser les solutions libres GlassFish (Site Internet) et PhpMyAdmin (Base de données). Pour utiliser le serveur GlassFish nous avons créé une application Web en JEE sous NetBeans et utilisé le Framework JavaServerFace.

Afin de faire communiquer l’application sur le mobile avec le site Internet nous décidons d’utiliser les “Services Web” qui nous permet donc d’envoyer des données, de traiter ces données, de récupérer certaines données de la base de données et de les retourner à l’application sur le mobile.

Si vous souhaitez connaître les bases afin de créer un service web sous JAVA et l’interroger à partir d’une application mobile en C#, veuillez consulter ce lien :

http://epsimobiledev.blogspot.com/

Ce lien vous redirige sur le blog d’une des équipes de l’EPSI qui travaille aussi sur ce projet défini dans un article précédent.

Détaillons tout de même notre méthode pour mettre en place le Web Service et faire en sorte que les applications communiquent entre elles grâce à ce dernier :

Afin de faire communiquer l’application sur le mobile avec le site Internet nous décidons d’utiliser les « Web Services » qui nous permet donc d’envoyer des données, de les traiter, d’en récupérer certaines provenant de la base de données et de les retourner à l’application sur le mobile.

Notre Web Service est implémenté dans l’application web hébergée sur Glassfish. L’application mobile envoie au Web Service ses propres coordonnées GPS (latitude & longitude) ainsi que son numéro de téléphone. Grâce à ces informations, le Web Service récupère la liste des contacts (contenue dans notre smart phone), puis vérifie la distance qui nous sépare des positions de nos contacts contenues dans la base de données MySql. Lorsque la position d’un ou plusieurs contacts est assez proche de la notre, le Web Service renvoie au mobile les coordonnées et le numéro de téléphone de ces contacts. L’application mobile peut alors affichée la carte avec le marquage des différentes positions des contacts proches.

Création du Web Service :

Faites un clique droit soit sur votre application web soit sur la partie EJB (si vous en utilisez pour faire la persistance des données avec votre base de données). Puis cliquez sur Web Service, saisissez le nom que vous souhaitez lui attribuer et choisissez le package dans lequel vous voulez qu’il apparaisse et enfin cliquez sur “Terminer”.

Votre Web Service est alors créé. Il ne reste donc plus qu’à implémenter les méthodes que vous désirez.

Implémentation du Web Service du côté JEE :

package <votre nom de package>;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class WebService1 {

}

// Constructeur du Web Service : WebService1

public WebService1() {

}

// Déclaration d’une méthode : ici la méthode classique permettant d’afficher “Hello World”.

// L’operationName est le nom qui sera utilisé pour accéder à cette méthode depuis votre application mobile par exemple.

@WebMethod(operationName = “hello”)
public String hello() {
return “Hello World”;
}

Communication avec le Web Service à partir de l’application mobile :

// Permet d’utiliser le Web Service : “NomDeLAppli.NomDeLaRéférenceWeb”

using AppliEPSI.WebReference1;

namespace AppliEPSI
{
public partial class Form1 : Form
{

//Service1 ws;
WebReference1.WebService1Service ws;

}

public Form1()
{
InitializeComponent();

ws = new WebReference1.WebService1Service(); // Instanciation du Web Service

}

private void Form1_Load(object sender, EventArgs e)
{

LabelMsg.Text = ws.hello(); // Appel de la méthode “hello” présente dans le Web Service et assignation du résultat (Hello World) dans le Label “LabelMsg” présent dans le Form1.

}

Voila, vous avez toutes les billes en main pour faire communiquer une application développée sur un mobile avec une application web par l’intermédiaire d’un Web Service.

Lorsqu’un contact est proche de notre position, l’application doit afficher une carte par l’intermédiaire de l’API Google Maps en plaçant sur la carte un point qui représente sa propre position et un autre qui représente la position du contact à proximité. La carte s’affiche dans une pictureBox (ici : pictureBox2) présente sur la Form de notre application Smart Device.

Voici une méthode qui permet de réaliser cette fonctionnalité :

private Bitmap GetItineraire(string lat1, string long1, string lat2, string long2)
{
Bitmap myMap = null;

#region Construction des arguments de l’URL
StringBuilder args = new StringBuilder();
args.Append(“center=” + lat1 + “,” + long1);
args.Append(“&zoom=8″);  //Le zoom peut être modifié selon si l’on définie la “proximité” plus ou moins grande.
args.Append(“&size=” + 512 + “x” + 512);
args.Append(“&maptype=mobile”); // satellite, terrain, hybrid, mobile
args.Append(“&markers=color:blue|label:O|”+lat1+”,”+long1+”");
args.Append(“&markers=color:red|label:H|” + lat2 + “,” + long2 + “”);
args.Append(“&sensor=false”);   // true if my app uses GPS sensor
args.Append(“&key=” + Properties.Resources.GoogleMapsApiKey);

#endregion
try
{
WebRequest myRequest = WebRequest.Create(Properties.Resources.GoogleMapsBaseUrlItineraire + args.ToString());
WebResponse myResponse = myRequest.GetResponse();
myMap = new Bitmap(myResponse.GetResponseStream());
myResponse.Close();
}
catch (WebException ex)
{
MessageBox.Show(ex.Message);
}

pictureBox2.Image = myMap;

return myMap;

}

Suivre

Get every new post delivered to your Inbox.