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

Receiver, CGM et + 1 Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction Notes de cours jean-michel Douin, douin au cnam point fr.

Présentations similaires


Présentation au sujet: "Receiver, CGM et + 1 Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction Notes de cours jean-michel Douin, douin au cnam point fr."— Transcription de la présentation:

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

2 Receiver, CGM et + 2 Sommaire Le socle, les fondements –Le patron publish-subscribe Lentité 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 soccupe de tout Compte gmail dédié Abonnement de plusieurs mobiles Librairies, BroadcastReceiver et service, prêts à lemploi –Ce qui reste à faire: Une classe dérivée + un appel de méthodes, cest tout

3 Receiver, CGM et + 3 Principale bibliographie Le tutorial indispensable –http://developer.android.com/google/gcm/index.html Avant il y avait c2dm –Vogella –http://blog.octo.com/notifications-push-android-c2dm/http://blog.octo.com/notifications-push-android-c2dm/ –https://github.com/joemoore/c2demohttps://github.com/joemoore/c2demo

4 Receiver, CGM et + 4 Les fondements Le patron publish/subscribe –Publication à loccurrence dun é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 Receiver, CGM et + 5 Publish-Subscribe,cf NSY102 source:

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

7 Receiver, CGM et + 7 Un exemple, mode push Source:

8 Receiver, CGM et + 8 En Java/ notation UML/BlueJ Source:

9 Receiver, CGM et + 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 à lapplication, … –Google Cloud Messaging une API prête à lemploi plusieurs mobiles peuvent souscrire et être notifiés « Over the Air »

10 Receiver, CGM et + 10 Android/Publish-Subscribe : les bases Source : souscription publication

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

12 Receiver, CGM et + 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 Receiver, CGM et + 13 Souscription effective Déclarative, AndroidManifest.xml –Au sein dune application Par programme –getApplicationContext().registerReceiver( new ReceiverTemplate(), new IntentFilter(Intent.SMS_RECEIVED_ACTION));

14 Receiver, CGM et + 14 Les acteurs classe Context, le Mediator –http://developer.android.com/reference/android/content/Context.htmlhttp://developer.android.com/reference/android/content/Context.html classe BroadcastReceiver, le Subscriber –http://developer.android.com/reference/android/content/BroadcastReceiver.htmlhttp://developer.android.com/reference/android/content/BroadcastReceiver.html classe Intent + IntentFilter, X,Y les thèmes –http://developer.android.com/reference/android/content/Intent.htmlhttp://developer.android.com/reference/android/content/Intent.html À suivre: deux exemples avec le système Android –Le niveau de la batterie vient dêtre réactualisé, –Un sms vient darriver

15 Receiver, CGM et + 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 Receiver, CGM et + 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 Receiver, CGM et + 17 Exemple 2 : réception dun SMS // le souscripteur public class SMSReceiver extends public void onReceive(Context context, Intent intent) { Toast.makeText(context, "sms received", Toast.LENGTH_SHORT).show(); }

18 Receiver, CGM et + 18 Configuration du souscripteur, // AndroidManifest.xml // La souscription Souscription effectuée (appel de registerReceiver) au chargement de lapplication

19 Receiver, CGM et + 19 Démonstration Les deux exemples Intent.ACTION_BATTERY_CHANGED android.intent.action.SMS_RECEIVED_ACTION

20 Receiver, CGM et + 20 Autre façon de souscrire PendingIntent Intent à effet immédiat PendingIntent à effet retardé –Destiné à un tiers A destination dun service existant –AlarmManager, NotificationManager … Souscription auprès du service –Exécution de lintent passé en paramètre, à laide dun PendingIntent

21 Receiver, CGM et + 21 Souscription auprès dun 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 dalarme

22 Receiver, CGM et + 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 dalarme

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

24 Receiver, CGM et + 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 Receiver, CGM et + 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 lintent 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 Receiver, CGM et + 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 Receiver, CGM et + 27 Démonstration

28 Receiver, CGM et + 28 GCM Google Cloud Messaging –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 lon dédiera à cet usage

29 Receiver, CGM et + 29 Architecture : Objectifs Un client, tout système connecté –Sadresse 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 Receiver, CGM et + 30 Architecture : Mise en œuvre, inscription Chaque participant –Doit avoir un compte google gmail –Sinscrit auprès de GCM, en retour un identifiant lui est attribué Un serveur mémorise, lidentifiant retourné par GCM –Un serveur au protocole HTTP de préférence –Ces serveur contient les abonnés 1)inscription 2)identifiant 3) dépôt de lidentifiant GCM

31 Receiver, CGM et + 31 Architecture : Mise en œuvre, inscriptions Le serveur contient une liste des identifiants Un identifiant par application –Application : un service sous Android Exemple : Une liste didentifiants accessible depuis le web id1 id2 id3 …

32 Receiver, CGM et + 32 Architecture : Mise en œuvre, publications 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 … 2) [id1, id2, id3, ……] 1) Demande de la liste 3) Demande de publication [id1, id2, id3, ……] + message id1 message id2 id3

33 Receiver, CGM et + 33 Architecture : publications Chaque mobile ayant préalablement souscrit de la liste est notifié –Cest un « Receiver » prêt à lemploi 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) id1 message id2 id3

34 Receiver, CGM et + 34 Le tutorial que lon se doit de lire

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

36 Receiver, CGM et + 36 Création du projet https://code.google.com/apis/console/#project: API_Key ProjectId

37 Receiver, CGM et + 37 Inscription, mise en oeuvre 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 1)inscription 2)identifiant 3) dépôt de lidentifiant GCM

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

39 Receiver, CGM et + 39 Liste des indentifiants Service web, servlette, php –http://jfod.cnam.fr/registration/demo/?cmd=toString 1)inscription 2)identifiant 3) dépôt de lidentifiant GCM id1 id2 id3 … id1 id2 id3 …

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

41 Receiver, CGM et + 41 Librairie toute prête \android-sdk\extras\google\gcm\gcm-client\dist\ –gcm.jar Souscription, abonnement –Un service quil suffit de dériver public class GCMIntentService extends GCMBaseIntentService { Réception dun message : un Receiver + un service –Un Receiver prêt à lemploi Une classe IntentBaseService quil suffit de dériver

42 Receiver, CGM et + 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 2. onRegistered(Context context, String regId) –Au retour de Google, la méthode du service est déclenchée Le lidentifiant reçu par le mobile: APA91bGy- GWQqqrgyFc652jghpTPygBsKyDHNFPWqzJDCMvtcIx7rtVecmxAYkDItfgztJcEJhyA Rnx0fmmp6FtqrFKNXqftmGXhRIGM5eObyLY67YkT_Aez3RJeOZFVkOpjv- _FRNASI0ZJL6VQk95Y925MQ9Wihw Exemples ici :

43 Receiver, CGM et + 43 Souscription suite Souscription du mobile –Permissions –Le receveur, un extrait de AndroiManifest.xml –

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

45 Receiver, CGM et + 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 Receiver, CGM et + 46 Publication : Envoi de message Publication dun message –Send devices : une liste de regId –MulticastResult result = sender.send(message, devices, 5); // 5 essais en cas dindisponibilité des serveurs google –Ensuite le cloud soccupe de tout …

47 Receiver, CGM et + 47 Démonstration Installez cet apk sur votre mobile … –http://jfod.cnam.fr/cgm/GCM_Client_Demo.apkhttp://jfod.cnam.fr/cgm/GCM_Client_Demo.apk le souscripteur/publieur –Les sources

48 Receiver, CGM et + 48 Démonstration –Service web Interrogations –La liste des abonnés »http://jfod.cnam.fr/registration/demo/?cmd=toStringhttp://jfod.cnam.fr/registration/demo/?cmd=toString »http://jfod.cnam.fr/registration/demo/?cmd=listhttp://jfod.cnam.fr/registration/demo/?cmd=list –Un journal des notifications »http://jfod.cnam.fr/registration/demo.log.htmlhttp://jfod.cnam.fr/registration/demo.log.html Publication –http://jfod.cnam.fr/registration/demo/?cmd=send&message=hello&source=url&valeur=-1http://jfod.cnam.fr/registration/demo/?cmd=send&message=hello&source=url&valeur=-1 Un formulaire –http://jfod.cnam.fr/cgm/demo.htmlhttp://jfod.cnam.fr/cgm/demo.html id1 id2 id3 …

49 Receiver, CGM et + 49

50 Receiver, CGM et + 50 Mise en œuvre Répertoire du projet eclipse du client souscripteur Depuis lexplorateur windows, (eclipse nest 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 » Depuis lexplorateur windows, (eclipse nest pas démarré) 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 lexécution json est requis D:\android-sdk\extras\google\gcm\gcm-server\lib\ json_simple-1.1.jar

51 Receiver, CGM et + 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 Receiver, CGM et + 52 Annexe consommation en « polling »


Télécharger ppt "Receiver, CGM et + 1 Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction Notes de cours jean-michel Douin, douin au cnam point fr."

Présentations similaires


Annonces Google