La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

jean-michel Douin, douin au cnam point fr

Présentations similaires


Présentation au sujet: "jean-michel Douin, douin au cnam point fr"— Transcription de la présentation:

1 jean-michel Douin, douin au cnam point fr
Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction jean-michel Douin, douin au cnam point fr version : 23 Avril 2013 Notes de cours

2 Sommaire Le socle, les fondements L’entité Android de base : Receiver
Le patron publish-subscribe L’entité Android de base : Receiver Publication sendBroadcast(Intent i) , sendOrderedBroadcast Souscription onReceive, (BroadcastReceiver) Exemples: Abonnement à un évènement Batterie, réception de SMS Abonnement à une alarme Service déjà installé sur le mobile GCM, Google Cloud Messaging Google/Cloud s’occupe de tout Compte gmail dédié Abonnement de plusieurs mobiles Librairies, BroadcastReceiver et service, prêts à l’emploi Ce qui reste à faire: Une classe dérivée + un appel de méthodes, c’est tout

3 Principale bibliographie
Le tutorial indispensable Avant il y avait c2dm Vogella https://github.com/joemoore/c2demo

4 Les fondements Le patron publish/subscribe
Publication à l’occurrence d’un évènement Un sms entrant, la batterie déchargée, … Un évènement utilisateur Souscription à un évènement Agir en conséquence Un médiateur se charge De la réception des évènements, de leur filtrage De la diffusion auprès des souscripteurs sélectionnés

5 Publish-Subscribe,cf NSY102
source:

6 Publish-subscribe/ pull-push
Les news d’internet, ou le forum de jfod … Enregistrement d’un « client » à un sujet de discussion, Un des « clients » décide de poster un message, Les utilisateurs à leur initiative vont chercher l’information, Publish-subscribe, mode pull Les listes de diffusion, logiciels de causerie, (« chat ») Abonnement d’un « client » à une liste de diffusion, Tous les abonnés reçoivent ce message, Publish-subscribe, mode push

7 Un exemple, mode push Source:

8 En Java/ notation UML/BlueJ
Source:

9 Android et le patron Publish/Subscribe
Une application Android peut : Souscrire à un thème de publication, réception de SMS, niveau de batterie, … Publier un évènement une alarme à son échéance, un évènement interne à l’application, … Google Cloud Messaging une API prête à l’emploi plusieurs mobiles peuvent souscrire et être notifiés « Over the Air »

10 Android/Publish-Subscribe : les bases
souscription publication Source :

11 Publish-Subscribe/Intent & Context
Receiver X,Y Intent

12 Souscription : schéma de programme
Basée sur les Intent (Topic), Context (Mediator), BroadcastReceiver (Subscriber). import android.content.Intent; import android.content.Context; import android.content.BroadcastReceiver; import android.util.Log; public class ReceiverTemplate extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.i(TAG, "onReceive action: "+intent.getAction() ); } }

13 Souscription effective
Déclarative, AndroidManifest.xml Au sein d’une application <receiver android:name=".ReceiverTemplate"> <intent-filter> <action android:name=" android.intent.action.SMS_RECEIVED_ACTION " /> </intent-filter> </receiver> Par programme getApplicationContext().registerReceiver( new ReceiverTemplate(), new IntentFilter(Intent.SMS_RECEIVED_ACTION));

14 Les acteurs classe Context, le Mediator
classe BroadcastReceiver, le Subscriber classe Intent + IntentFilter, X,Y les thèmes À suivre: deux exemples avec le système Android Le niveau de la batterie vient d’être réactualisé, Un sms vient d’arriver

15 Exemple 1 : la batterie a changé d’état
public class LowBatteryActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); // Souscription registerReceiver(new BatteryChangedReceiver(), filter); } // le Souscripteur private static class BatteryChangedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Toast.makeText(context, "battery changed", Toast.LENGTH_SHORT).show(); Log.d(TAG, "onReceive action: "+intent.getAction() );

16 La publication par Android ressemblerait à
android.os.BatteryManager Intent broadcastIntent = new Intent(); broadcastIntent.setAction("ACTION_BATTERY_CHANGED"); broadcastIntent.putExtra("level", 3567); // // context.sendBroadcast(broadcastIntent);

17 Exemple 2 : réception d’un SMS
// le souscripteur public class SMSReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "sms received", Toast.LENGTH_SHORT).show(); }

18 Configuration du souscripteur, <receiver />
// AndroidManifest.xml // La souscription <receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.intent.action.SMS_RECEIVED_ACTION"/> </intent-filter> </receiver> Souscription effectuée (appel de registerReceiver) au chargement de l’application

19 Démonstration Les deux exemples Intent.ACTION_BATTERY_CHANGED
android.intent.action.SMS_RECEIVED_ACTION

20 Autre façon de souscrire PendingIntent
Intent à effet immédiat PendingIntent à effet retardé Destiné à un tiers A destination d’un service existant AlarmManager, NotificationManager … Souscription auprès du service Exécution de l’intent passé en paramètre, à l’aide d’un PendingIntent

21 Souscription auprès d’un service existant
Intent intent = new Intent(this, ReceiverTemplate.class);                 PendingIntent appIntent = PendingIntent.getBroadcast(this, 0, intent, 0); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 3);                 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);               am.set(AlarmManager.RTC, calendar.getTimeInMillis(), appIntent); // sendBroadcast(intent) par le service d’alarme

22 Variante de l’écriture précédente
PendingIntent appIntent = PendingIntent.getBroadcast (this, 0, new Intent(), 0); Calendar calendar = Calendar.getInstance(); // idem diapositive précédente              am.set(AlarmManager.RTC, calendar.getTimeInMillis(), appIntent); // Ce sont les receveurs déclarés dans AndroidManifest.xml // qui seront déclenchés, (méthode onReceive) // puis sendBroadcast(intent) par le service d’alarme

23 Notification Souvent associée à la réception d’un évènement
Déclenchée par le souscripteur Un « Receiver », un service, … Exemple: Une notification à la réception d’un message sms telnet localhost 5554 send 1234 SMS test message

24 Notification : affichage
private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); Intent intent = // page suivante notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); }

25 Autre exemple : une notification
Au clic sur la notification une application est déclenchée private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); Intent notificationIntent = new Intent(context,GCMClientActivity.class); // afin que l’intent retardée démarre une nouvelle activité notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); } Source:

26 Autre usage : une notification, sans effet au clic
Au clic sur la notification rien ne se passe private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); PendingIntent intent = PendingIntent.getActivity(context, 0, null, 0); notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); } Source:

27 Démonstration

28 GCM Google Cloud Messaging >= Android 2.2 Message <= 4ko
Anciennement c2dm, Cloud to Delivering Message >= Android 2.2 Message <= 4ko Trafic illimité Nécessite une inscription auprès de Google Avec de préférence un compte gmail que l’on dédiera à cet usage

29 Architecture : Objectifs
Un client, tout système connecté S’adresse au serveur Google qui se chargera de publier auprès des mobiles Mobiles ayant préalablement souscrits Mise en œuvre : une librairie toute prête, un appel de méthode suffit

30 Architecture : Mise en œuvre, inscription
GCM 2)identifiant 3) dépôt de l’identifiant Chaque participant Doit avoir un compte google gmail S’inscrit auprès de GCM, en retour un identifiant lui est attribué Un serveur mémorise, l’identifiant retourné par GCM Un serveur au protocole HTTP de préférence Ces serveur contient les abonnés

31 Architecture : Mise en œuvre, inscriptions
id1 id2 id3 Le serveur contient une liste des identifiants Un identifiant par application Application : un service sous Android Exemple : Une liste d’identifiants accessible depuis le web

32 Architecture : Mise en œuvre, publications
1) Demande de la liste 2) [id1, id2, id3, ……] 3) Demande de publication [id1, id2, id3, ……] + message id1 message id2 message id3 message Publication par tout système connecté 1,2) Obtention de la liste des identifiants, des abonnés 3) Envoi de cette liste au serveur Google/GCM accompagnée du message à transmettre GCM se charge de publier le message, de le ré-émettre, de le conserver …

33 Architecture : publications
id1 message id2 message id3 message Chaque mobile ayant préalablement souscrit de la liste est notifié C’est un « Receiver » prêt à l’emploi qui est déclenché sur chaque mobile Un service est créé afin de prendre en compte cette notfication Une de ses méthodes est appelée (onMessage)

34 Le tutorial que l’on se doit de lire

35 Comment ? Création d’un projet auprès des serveurs Google
https://code.google.com/apis/console En retour : un numéro_de_projet (ProjectId) https://code.google.com/apis/console/#project:numéro_de_projet Une API key est nécessaire Exemple ProjectId: , API_KEY: AIzaSyC60sIgG-fB3JSW47X2zGrOqJHGzV1jh0g Un mobile s’inscrit auprès du serveur Google (API_KEY, ProjectId) En retour un jeton d’identification lui est attribué Chaque participant doit posséder un compte gmail Cet identifiant est déposé sur un serveur, connu de tous les participants Envoi d’un message aux participants Obtention de la liste des identifiants auprès du serveur Publication du message Librairies toutes prêtes

36 Création du projet ProjectId API_Key
https://code.google.com/apis/console/#project:

37 Inscription, mise en oeuvre
2)identifiant 3) dépôt de l’identifiant GCM Depuis une activity 1) Inscription auprès du cloud String regId = GCMRegistrar.getRegistrationId(this); if ("".equals(regId)) { GCMRegistrar.register(this, " "); Démarrage du service… Attente asynchrone de la réponse de GCM

38 Le service hérite d’une classe toute prête
1)inscription 2)identifiant 3) dépôt de l’identifiant GCM public class GCMIntentService extends GCMBaseIntentService { Méthode déclenchée à la suite de la demande d’inscription au GCM 2) onRegistered(Context context, String identifiant) 3) Dépôt de l’identifiant sur un serveur onMessage(Context context, Intent intent) onError …. onUnregistered

39 Liste des indentifiants
1)inscription 2)identifiant 3) dépôt de l’identifiant GCM id1 id2 id3 id1 id2 id3 Service web, servlette, php

40 Publication API_KEY + Message id1 id2 id3 …
Envoi de la liste des identifiants au GCM + un message + API_KEY Et se charge de tout

41 Librairie toute prête \android-sdk\extras\google\gcm\gcm-client\dist\
gcm.jar Souscription, abonnement Un service qu’il suffit de dériver public class GCMIntentService extends GCMBaseIntentService { Réception d’un message : un Receiver + un service Un Receiver prêt à l’emploi <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> Une classe IntentBaseService qu’il suffit de dériver

42 Démonstration, Obtention du jeton
GCMRegistrar: Classe interface avec le service GCM ProjectId: GCMRegistrar.getRegistrationId(this, " "); Une demande est faite auprès de Google onRegistered(Context context, String regId) Au retour de Google, la méthode du service est déclenchée Le l’identifiant reçu par le mobile: APA91bGy-GWQqqrgyFc652jghpTPygBsKyDHNFPWqzJDCMvtcIx7rtVecmxAYkDItfgztJcEJhyARnx0fmmp6FtqrFKNXqftmGXhRIGM5eObyLY67YkT_Aez3RJeOZFVkOpjv-_FRNASI0ZJL6VQk95Y925MQ9Wihw Exemples ici :

43 Souscription suite Souscription du mobile Permissions
<uses-permission android:name="com.google.android.c2dm.permission.REGISTRATION" /> <uses-permission android:name="android.permission.INTERNET" /> Le receveur, un extrait de AndroiManifest.xml <receiver android:name=".C2DMRegistrationReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter > <action android:name="com.google.android.c2dm.intent.REGISTRATION" > </action> </intent-filter> </receiver>

44 Le service public class GCMIntentService extends GCMBaseIntentService
onRegistered(Context context, String regId) Déclenchée par le Receiver pré-installé à la suite de l’abonnement Mémorisation de regId onMessage(Context context, Intent intent) Déclenchée par le Receiver pré-installé à la suite de la réception d’un message String msg = intent.get("message");

45 Publication : le message
Par tout système connecté, \android-sdk-new\extras\google\gcm\gcm-server\dist\ gcm-server.jar Sender sender = new Sender(API_KEY); String msg = "un message"; Message message = new Message.Builder() //.collapseKey("1") .timeToLive(60*60*24) // 24 heures //.timeToLive(0) // maintenant ou jamais .delayWhileIdle(true) .addData("message",msg) .build();

46 Publication : Envoi de message
Publication d’un message Send devices : une liste de regId MulticastResult result = sender.send(message, devices, 5); // 5 essais en cas d’indisponibilité des serveurs google Ensuite le cloud s’occupe de tout …

47 Démonstration Démonstration Installez cet apk sur votre mobile …
le souscripteur/publieur Les sources

48 Démonstration id1 id2 id3 …
Service web Interrogations La liste des abonnés Un journal des notifications Publication Un formulaire

49

50 Mise en œuvre Répertoire du projet eclipse du client souscripteur
Depuis l’explorateur windows, (eclipse n’est pas démarré) créer un répertoire libs dans lequel vous copiez gcm.jar libs>copy D:\android-sdk\extras\google\gcm\gcm-client\dist\gcm.jar . Répertoire du projet eclipse du client « publieur » créer un répertoire libs dans lequel vous copiez gcm-server.jar libs>copy D:\android-sdk\extras\google\gcm\gcm-server\dist\gcm-server.jar . . Si bluej, installez gcm-server.jar dans le répertoire +libs A l’exécution json est requis D:\android-sdk\extras\google\gcm\gcm-server\lib\json_simple-1.1.jar

51 Conclusion Simple Push/polling (voir en annexe) … Indispensable
Note: Sous eclipse dans le projet créer un dossier libs Dans lequel sont copiés : gcm.jar pour souscrire gcm-server.jar et json-simple-1.1.jar pour publier

52 Annexe consommation en « polling »


Télécharger ppt "jean-michel Douin, douin au cnam point fr"

Présentations similaires


Annonces Google