Upload
vineet-garg
View
91
Download
3
Embed Size (px)
DESCRIPTION
A short report on google cloud messaging
Citation preview
SELF STUDY REPORTON
Google Cloud Messaging
Department of Computer Engineering (COE)
Submitted By:VINEET GARG2K13/CO/142
CERTIFICATEThis is to certify that this project report entitled “Google Cloud Messaging”
submitted by Vineet Garg (2K13/CO/142) in partial fulfilment for the requirements
for the award of Bachelor of Technology Degree in Computer Engineering (COE) at
Delhi Technological University is an authentic work carried out by the student under
my supervision and guidance.
To the best of my knowledge, the matter embodied in the thesis has not been
submitted to any other university or institute for the award of any degree or diploma.
Ms. INDU SINGH
(Asst. Professor)
Dept. of Computer Engineering
Delhi Technological University
2
ACKNOWLEDGEMENT
I would like to express my greatest gratitude to the people who have helped and
supported me throughout the project.
Firstly, I express my heartiest gratitude towards the authorities who gave me a chance
to explore the intricacies of various aspects of Google Cloud Messaging. I would
also sincerely thank my esteemed mentor, Ms. Indu Singh, who lent a huge helping
hand in the process of making this project with her valuable guidance and blessings.
I would also not forget to thank the department authorities, who played an
indispensable role in the process. In the end, I would thank my friends and family for
their extended support throughout the project.
Vineet Garg
3
ABSTRACT
Google Cloud Messaging for Android (GCM) is a service that helps developers to
send data from servers to their Android applications on Android devices. The service
was unveiled on June 27, 2012, at Google I/O 2012 held at the Moscone Center in
San Francisco . The GCM service handles all aspects of queuing of messages and
delivery to the target Android application running on the target device. It is
completely free whatever your messaging needs are and it can be used in some
applications like smart notification systems.
This report gives an overview about the Google GCM service and about its working
and usage.
4
INDEX
S.No Topic Page no.
1 Introduction 6
2 Key Concepts 7
3 Architectural Overview 9
4 Lifecycle Flow 10
5 Implementing Gcm Service 12
6 Properties of Payload 18
7 Possible Problems 19
8 Applications 20
9 Conclusion 21
10 References 22
5
INTRODUCTION
Google Cloud Messaging (GCM) is a service that enables developers to send data from servers to both Android applications or Chrome apps and extensions.The service provides a simple, lightweight mechanism that servers can use to tell mobile applications to contact the server directly, to fetch updated application or user data. The service handles all aspects of queueing of messages and delivery to the target application running on the target device.
The free service has the ability to send a lightweight message informing the Android application of new data to be fetched from the server. Larger messages can be sent with up to 4 KB of payload data. Each notification message size is limited to 1024 bytes, and Google limits the number of messages a sender sends in aggregate, and thenumber of messages a sender sends to a specific device.
Applications on an Android device don’t need to be running to receive messages. Thesystem will wake up the application via a mechanism called Intent Broadcast when the message arrives, as long as the application is set up with the proper broadcast receiver and permissions. GCM does not provide any built-in user interface or other handling for message data. Instead, it simply passes raw message data received straight to the application, which has full control of how to handle it. For example, the application might post a notification, display a custom user interface, or silently sync data.
6
KEY CONCEPTS This table summarizes the key terms and concepts involved in GCM. It is divided into these categories:
• Components — The entities that play a primary role in GCM. • Credentials — The IDs and tokens that are used in different stages of GCM to ensure that
all parties have been authenticated, and that the message is going to the correct place.
Table 1. GCM components and credentials.
Components
Client App
The GCM-enabled Android application that is running on a device. This must be a 2.2 Android device that has Google Play Store installed, and it must have at least one logged in Google account if the device is running a version lower than Android 4.0.4. Alternatively, for testing you can use an emulator running Android 2.2 with Google APIs.
3rd-party Application Server
An application server that you write as part of implementing GCM. The 3rd-party application server sends data to an Android application on the device via the GCM connection server.
GCM Connection Servers
The Google-provided servers involved in taking messages from the 3rd-party application server and sending them to the device.
Credentials
Sender ID A project number you acquire from the API console, as described in Getting Started. The sender ID is used in the registration process to identify a 3rd-party application server that is permitted to send messages to the device.
Application ID The Android application that is registering to receive messages. The Android application is identified by the package name from the manifest. This ensures that the messages are targeted to the correct Android application.
Registration ID
An ID issued by the GCM servers to the Android application that allows it to receive messages. Once the Android application has the registration ID, it sendsit to the 3rd-party application server, which uses it to identify each device that has registered to receive messages for a given Android application. In other words, a registration ID is tied to a particular Android application running on a particular device. Note that registration IDs must be kept secret.
Note: If you use backup and restore, you should explicitly avoid backing up registration IDs. When you back up a device, apps back up shared prefs indiscriminately. If you don't explicitly exclude the GCM registration ID, it could get reused on a new device, which would cause delivery errors.
Google User Account
For GCM to work, the mobile device must include at least one Google account if the device is running a version lower than Android 4.0.4.
Sender Auth An API key that is saved on the 3rd-party application server that gives the
7
Tokenapplication server authorized access to Google services. The API key is included in the header of POST requests that send messages.
8
ARCHITECTURAL OVERVIEW
A GCM implementation includes a Google-provided connection server, a 3rd-party app server that interacts with the connection server, and a GCM-enabled client app running on an Android device:
This is how these components interact:
• Google-provided GCM Connection Servers take messages from a 3rd-party
application server and send these messages to a GCM-enabled Android application (the "client app") running on a device. Currently Google provides connection servers for HTTP and XMPP.
• The 3rd-Party Application Server is a component that you implement to
work with your chosen GCM connection server(s). App servers send messages to a GCM connection server; the connection server enqueues and stores the message, and then sends it to the device when the device is online. For more information, see Implementing GCM Server.
• The Client App is a GCM-enabled Android application running on a device.
To receive GCM messages, this app must register with GCM and get a registration ID. If you are using the XMPP (CCS) connection server, the client app can send "upstream" messages back to the connection server. For more information on how to implement the client app, see Implementing GCM Client.
9
Illustration 1: GCM Architecture
LIFECYCLE FLOW
(a)Enable GCM. An Android application running on a mobile device registers to receive messages.
(b)Send a message. A 3rd-party application server sends messages to the device. (c)Receive a message. An Android application receives a message from a GCM
server.
These processes are described in more detail below.
(a) Enable GCM
The first time the Android application needs to use the messaging service, it calls the GoogleCloudMessaging method register(), as discussed in Implementing GCM Client. The register() method returns a registration ID. The Android application should store this ID for later use (for instance, to check in onCreate() if it is already registered).
(b) Send a message
Here is the sequence of events that occurs when the application server sends a message:
1. The application server sends a message to GCM servers. 2. Google enqueues and stores the message in case the device is offline. 3. When the device is online, Google sends the message to the device. 4. On the device, the system broadcasts the message to the specified Android
application via Intent broadcast with proper permissions, so that only the targeted Android application gets the message. This wakes the Android application up. The Android application does not need to be running beforehand to receive the message.
5. The Android application processes the message. If the Android application is doing non-trivial processing, you may want to grab a PowerManager.WakeLock and do any processing in a service.
An Android application can unregister GCM if it no longer wants to receive messages.
10
(c) Receive a message
This is the sequence of events that occurs when an Android application installed on a mobile device receives a message:
1. The system receives the incoming message and extracts the raw key/value pairs from the message payload, if any.
2. The system passes the key/value pairs to the targeted Android application ina com.google.android.c2dm.intent.RECEIVE Intent as a set ofextras.
3. The Android application extracts the raw data from the
com.google.android.c2dm.intent.RECEIVE Intent by key and processes the data.
11
IMPLEMENTING GCM SERVICE
1) Create project on Google Developer Console and get project
number.
2) Enable GCM service on that project from API's and Auth section.
3) Create new Server Key from APIs & auth > Credentials.
4) Implement GCM client
a) Set up Setup Google Play Services SDK for the Android project.
b) Edit applications manifest file and set up required permissions and
package and necessary broadcast reciever.
12
c) Write your application:
i) Write check play service for checking is the device
compatible with GCM or not.
private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i(TAG, "This device is not supported."); finish(); } return false; } return true; }
ii) Register device to GCM server.
private String getRegistrationId(Context context) { final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); if (registrationId.isEmpty()) { Log.i(TAG, "Registration not found."); return ""; } // Check if app was updated; if so, it must clear the registration ID // since the existing regID is not guaranteed to work with thenew // app version. int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion) { Log.i(TAG, "App version changed."); return ""; } return registrationId; }
iii) Register Device Id on your own server.
13
private void registerInBackground() { new AsyncTask() { @Override protected String doInBackground(Void... params) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid;
// You should send the registration ID to your server over HTTP, // so it can use GCM/HTTP or CCS to send messages to your app. // The request to your server should be authenticated if your app // is using accounts. sendRegistrationIdToBackend();
// For this demo: we don't need to send it becausethe device // will send upstream messages to a server that echo back the // message using the 'from' address in the message.
// Persist the regID - no need to register again. storeRegistrationId(context, regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); // If there is an error, don't just keep trying toregister. // Require the user to click a button again, or perform // exponential back-off. } return msg; }
@Override protected void onPostExecute(String msg) { mDisplay.append(msg + "\n"); } }.execute(null, null, null); ...
14
}
iv) Send a message via gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);
v) Recive message via registered Broadcast Reciever.
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); // Start the service, keeping the device awake while it islaunching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } }
vi) Pass recived message to Intent Service for payload parsing and pertorming necessary action.
public class GcmIntentService extends IntentService { public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder;
public GcmIntentService() { super("GcmIntentService"); }
@Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); // The getMessageType() intent parameter must be the intent you received // in your BroadcastReceiver. String messageType = gcm.getMessageType(intent);
if (!extras.isEmpty()) { // has effect of unparcelling
15
Bundle /* * Filter messages based on message type. Since it is likely that GCM * will be extended in the future with new message types, just ignore * any message types you're not interested in, or thatyou don't * recognize. */ if (GoogleCloudMessaging. MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { sendNotification("Send error: " + extras.toString()); } else if (GoogleCloudMessaging. MESSAGE_TYPE_DELETED.equals(messageType)) { sendNotification("Deleted messages on server: " + extras.toString()); // If it's a regular GCM message, do some work. } else if (GoogleCloudMessaging. MESSAGE_TYPE_MESSAGE.equals(messageType)) { // This loop represents the service doing some work. for (int i=0; i<5; i++) { Log.i(TAG, "Working... " + (i+1) + "/5 @ " + SystemClock.elapsedRealtime()); try { Thread.sleep(5000); } catch (InterruptedException e) { } } Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); // Post notification of received message. sendNotification("Received: " + extras.toString()); Log.i(TAG, "Received: " + extras.toString()); } } // Release the wake lock provided by the WakefulBroadcastReceiver. GcmBroadcastReceiver.completeWakefulIntent(intent); }
// Put the message into a notification and post it. // This is just one simple example of what you might choose todo with // a GCM message.
16
private void sendNotification(String msg) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, DemoActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_gcm) .setContentTitle("GCM Notification") .setStyle(new NotificationCompat.BigTextStyle() .bigText(msg)) .setContentText(msg);
mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } }
5) Write Application server
a) Implement necessary server side code to handle the payload send from
device.
b) Parse the data recieved from device and send it to GCM Server
c) Handle response of GCM Server.
6) The device would recieve message almost instantaneously.
17
PROPERTIES OF PAYLOAD
1) The payload message sent to GCM Server is a JSON encoded string.
2) We can send at max of 4kB of payload to GCM server.
3) A message sent to GCM server has a lifetime of 4 weeks, that is it will reside
on GCM Server till 4 weeks or till delivered whichever comes first.
4) Structure of a message sent to GCM Server
Content-Type:application/json
Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA{ "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "data" : { "Team" : "18", "Score" : "3", "Player" : "Varela", },}
18
POSSIBLE PROBLEMS
There may be a case that user has uninstalled the applications. Thus the sender id we are referring to does not exit. In that case GCM server will response back to application server that the following Id does not exist.In that its entry from database of application server shoulb be deleted
Although Sender Id is constant for an install of application, it changes if there is an update to the application, in that care must be taken to re-register device to GCM and also change it's Sender Id in database of application server.
The payload limit is only 4kb, so we can not send data greater than 4kB like genarally media files etc.
19
APPLICATIONS
GCM has the following applications:
1) Widely used in Instant Messaging Services like Whatsapp, Hike,
Telegram etc.
2) Used to push notifications on devices by other 3rd party applications.
20
CONCLUSION
1) GCM stands for Google Cloud Messaging
2) It enables to send messages to mobile devices, without using polling
in devices.
3) Thus it does not consume much battery on devices.
4) At most of 4kB of data can be sent using GCM.
5) The message sent to GCM server is a JSON encoded string with keys
registration_id and data.
6) The response sent back to 3rd party server from GCM server is also a
JSON encoded string telling about seccess and faliure of messages.
7) There are no quota limit in GCM Service.
8) GCM services is almost instantaneous.
9) The message date resides on server for atmost 4 weeks if not
delievered
10) Instant messangers on Android use this service to send their
messages.
11) Other third party apps uses this services to push new notifications for
their apps.
21
REFERENCES
1) http://developer.android.com/google/gcm/gcm.html
2) http://developer.android.com/google/gcm/gs.html
3) http://developer.android.com/google/gcm/client.html
4) http://developer.android.com/google/gcm/server.html
5) http://developer.android.com/google/gcm/notifications.html
6) http://developer.android.com/google/gcm/adv.html
7) http://en.wikipedia.org/wiki/Google_Cloud_Messaging
22