Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ways to guess if C2DM is connected

I'm trying to place a best guess estimate as to whether C2DM messages can be received.

I've created an application that relies on pushing information to a phone while it is physically inaccessible. I understand that C2DM isn't guaranteed delivery, but I'd at least like to know when the delivery of a message is even possible; when it isn't we fall back to our own push service (and can actually tell when we're connected).

I've noticed C2DM on android will still issue auth tokens even when there is not a logged in google account; messages still seem to be delivered in this instance even though it's stated that they shouldn't be. If GTalk isn't connected (firewall or other reasons), no response at all is returned when requesting an auth token. Auth tokens are returned to the application when the phone is in airplane mode. This means it's not as simple as checking if an internet is available. I can't find a reliable way of checking if GTalk is logged in.

Again, I don't need to guarantee the delivery of messages, but I'd at least like to know if delivery is even possible. Does anyone have interesting solutions?

like image 929
Ian Elliott Avatar asked Oct 26 '11 06:10

Ian Elliott


3 Answers

Go watch this video, it's a Google I/O talk about C2DM, how to use it and how it works. AFAIK, you can't know if it's connected or not. Probably most of the time they don't even know (until they have to deliver a message and fail).

However, it is highly recommended (in the video as well) that you do not send important data through C2DM (as messages can get lost). The service should only be used as a "network tickle" (with a footprint as small as possible). Your application should be woken up by this tickle and it should start fetching the information it needs itself.

Now, if you implement it this way, it should be easy to implement a polling mechanism. Since you already separated the "tickle" from the actual information retrieval, you can just trigger the retrieval every once in a while if there's no tickle.

Something you can do to check whether C2DM is connected is something like a ping:

  1. Send message to phone via C2DM
  2. The app receives (or doesn't receive) the message and sends a "pong" back to your server
  3. The server waits for the "pong" for a predetermined amount of time (1-2 minutes, I'd say) before marking the device as "offline".

Edit: relying on GTalk is not feasible. GTalk relies on C2DM just like your app, it doesn't have anything "extra". Also, GTalk is not present on all devices. I'm not sure how the GTalk app determines whether it's offline or not (it's not open source, unfortunately), but I'd guess it just tries to ping a server and fails.

like image 189
Felix Avatar answered Nov 18 '22 16:11

Felix


No that is impossible.As you device authenticated once and generate registration ID and send to third party server(As you already know).Now your work is over once the device has been registered.So Wait for message either you got or not(No guarantee of delivering message as C2DM used UDP Protocol ).

Alternative Solution

Although its impossible to check from Google side directly as i mentions above,But if you have any urgency to check connection from your phone then you can take approach like this

Step 1): Make one Web service to check connection

Step 2): Call this web service from application that will command to server to send push notification for checking purpose.

Step 3): Now from server side,server will immediately send push notification for particular device(FROM which it get command)

Step 4): Now if you got push notification that means you are still connected to C2DM.

this will not take much time.But follow it only when checking connection is urgent and it is on user

like image 25
Tofeeq Ahmad Avatar answered Nov 18 '22 16:11

Tofeeq Ahmad


This may be a bit naive as I am not an active C2DM user, but wouldn't it be possible to read

/proc/net/netstat

and see if there are any active TCP connections. If there aren't any, then C2DM can't possibly be working. You could also make this technique more versatile by forming a C2DM whitelist that you would expect to find (or maybe its possible to filter on a special C2DM port?)

like image 29
Justin Breitfeller Avatar answered Nov 18 '22 15:11

Justin Breitfeller