android - google - Formas de adivinar si C2DM está conectado
google cloud messaging price (8)
Algo relacionado con la conexión C2DM de larga duración que se utiliza para entregar los activadores:
- En WLAN envía un latido cada 15 minutos.
- En las redes móviles el tiempo de espera es de 28 minutos.
28 minutos pueden ser demasiado largos, dependiendo del hardware que use su operador de telefonía móvil, repetidores de 2g / 3g en garajes, etc.
Puede obtener mucha información sobre la conexión abriendo la aplicación Monitor de servicio de Google Talk: http://www.honeytechblog.com/monitor-google-talk-service-android/
Marque: # # 8255 # #
También hay un botón que envía un latido en este momento y restablece el tiempo de espera.
Si desea asegurarse (en el lado del cliente) de que los mensajes c2dm se pueden recibir en un momento dado, lo mejor que puede hacer es reenviar el latido del corazón. Esto se puede hacer programáticamente, aunque solo en dispositivos rooteados. Podría lanzar una aplicación al mercado en algún momento que haga exactamente eso.
Estoy tratando de hacer una estimación aproximada de si se pueden recibir mensajes C2DM.
He creado una aplicación que se basa en enviar información a un teléfono mientras está físicamente inaccesible. Entiendo que C2DM no tiene una entrega garantizada, pero al menos me gustaría saber cuándo es posible la entrega de un mensaje; cuando no es así, recurrimos a nuestro propio servicio push (y podemos saber cuándo estamos conectados).
He notado que C2DM en Android aún emitirá tokens de autenticación incluso cuando no haya una cuenta de Google registrada; Parece que los mensajes aún se entregan en este caso, aunque se afirma que no deberían ser enviados. Si GTalk no está conectado (firewall u otras razones), no se devuelve ninguna respuesta cuando se solicita un token de autenticación. Los tokens de autenticación se devuelven a la aplicación cuando el teléfono está en modo avión. Esto significa que no es tan simple como verificar si hay internet disponible. No puedo encontrar una manera confiable de verificar si GTalk está conectado.
Nuevamente, no necesito garantizar la entrega de mensajes, pero al menos me gustaría saber si la entrega es posible . ¿Alguien tiene soluciones interesantes?
Esto puede ser un poco ingenuo ya que no soy un usuario activo de C2DM, pero ¿no sería posible leerlo?
/ proc / net / netstat
y ver si hay alguna conexión TCP activa. Si no hay ninguno, entonces C2DM no puede estar funcionando. También puede hacer que esta técnica sea más versátil formando una lista blanca de C2DM que esperaría encontrar (¿o tal vez es posible filtrar en un puerto especial de C2DM?)
He trabajado un poco con C2Dm, he creado mi propio servidor de terceros. He implementado un pequeño código de respuesta http basado en la lógica oh C2DM para saber si se envió un mensaje push o no. Aquí está algo del código que utilicé:
int responseCode = conn.getResponseCode();
if (responseCode == HttpServletResponse.SC_UNAUTHORIZED || responseCode == HttpServletResponse.SC_FORBIDDEN) {
LOGGER.warn("Unauthorized - need token");
return false;
}
aquí estoy casi seguro de que el mensaje push fue enviado desde los servidores c2dm porque tengo una identificación en la respuesta:
if (responseParts[0].equals("id")) {
LOGGER.info("Successfully sent data message to device: " + responseLine);
return true;
}
He usado otros métodos para obtener otros códigos de resultados de Google, si quieres, puedo publicarlos. Espero haberte ayudado un poco.
No creo que haya ninguna manera de determinar ADELANTAMENTE si existe alguna posibilidad de que un intento de inserción funcione, pero se me ocurre una forma bastante sencilla de verificar el recibo (pero no hacer cola para la entrega futura a través de C2DM): solo complete el mensaje lazo.
Recuerde, el principal beneficio de C2DM es que permite notificaciones cuando el teléfono está inactivo y nominalmente fuera de línea. Una vez que su aplicación recibe la notificación, hay poco que le impida despertar el teléfono en ese momento, activar la red y enviar una confirmación. No creo que tenga que solicitar permisos de "mantener el teléfono despierto", porque creo que el mero hecho de haberse registrado para recibir notificaciones de C2DM y recibir una es suficiente para activar el teléfono y permitir que la aplicación continúe ejecutándose normalmente ( al menos, el tiempo suficiente para abrir la red y enviar la confirmación).
Mientras lo hace, debe hacer un seguimiento de las confirmaciones que se producen LARGO después de esperar que sean una causa perdida. Si ve más que unos pocos, es posible que deba modificar la estrategia de reenvío.
El único caso del mundo real en el que esto podría fallar es si tuviera usuarios que se inclinaron hacia atrás para deshabilitar los datos mientras dejaban la voz / SMS habilitados (estoy bastante seguro de que C2DM usa 4 bytes del datagrama de respuesta que se envía cuando un teléfono sondea para recibir llamadas) las llamadas y los mensajes de texto que originalmente se reservaron para RIM y luego se reutilizaron para Apple y Google).
No, eso es imposible. Como su dispositivo se autenticó una vez y genera un ID de registro y lo envía a un servidor de terceros (como ya sabe). Ahora su trabajo termina una vez que el dispositivo se ha registrado. Así que espere el mensaje que recibió o no (No Garantía de entrega de mensaje como C2DM utiliza el protocolo UDP).
Solución alternativa
Aunque es imposible verificarlo desde el lado de Google directamente como lo mencioné anteriormente, pero si tiene alguna urgencia de verificar la conexión desde su teléfono, entonces puede hacerlo de esta manera.
Paso 1): hacer un servicio web para comprobar la conexión
Paso 2): llame a este servicio web desde la aplicación que ordenará al servidor que envíe una notificación de inserción para verificar el propósito.
Paso 3): Ahora, desde el lado del servidor, el servidor enviará inmediatamente una notificación de inserción para un dispositivo en particular (DESDE el cual recibe el comando)
Paso 4): Ahora, si recibió una notificación de inserción, eso significa que todavía está conectado a C2DM.
esto no tomará mucho tiempo. Pero sígalo solo cuando la verificación de la conexión sea urgente y esté en el usuario
Si el dispositivo es inaccesible, incluso su sistema de mensajería de respaldo no funcionaría. El C2DM no garantiza que entregará su mensaje, pero el evento de no entrega sería muy raro. Así sería el caso con cualquier otro servicio. La mejor solución que podría tener es encuestar a su servidor para verificar si tiene algún mensaje nuevo que aún no se haya entregado. Supongo que su aplicación es tal que es muy importante no perder ni un solo mensaje en 500 o puede que sea 1000. En ese caso, podría implementar un híbrido de empujar y tirar.
Ve a ver este video , es una charla de Google I / O sobre C2DM, cómo usarlo y cómo funciona. AFAIK, no puedes saber si está conectado o no. Probablemente la mayoría de las veces ni siquiera lo saben (hasta que tienen que entregar un mensaje y fallar).
Sin embargo, es muy recomendable (también en el video) que no envíe datos importantes a través de C2DM (ya que los mensajes pueden perderse). El servicio solo se debe utilizar como un "cosquilleo de la red" (con una huella lo más pequeña posible). Su aplicación debe despertarse con este cosquilleo y debe comenzar a buscar la información que necesita.
Ahora, si lo implementa de esta manera, debería ser fácil implementar un mecanismo de sondeo. Dado que ya ha separado el "cosquilleo" de la recuperación de información real, puede activar la recuperación de vez en cuando si no hay cosquilleo.
Algo que puedes hacer para verificar si C2DM está conectado es algo así como un ping:
- Enviar mensaje al teléfono vía C2DM
- La aplicación recibe (o no recibe) el mensaje y envía un "pong" a su servidor
- El servidor espera el "pong" durante un tiempo predeterminado (1-2 minutos, diría yo) antes de marcar el dispositivo como "fuera de línea".
Edición: confiar en GTalk no es factible. GTalk se basa en C2DM al igual que su aplicación, no tiene nada "extra". Además, GTalk no está presente en todos los dispositivos. No estoy seguro de cómo la aplicación GTalk determina si está desconectada o no (no es de código abierto, desafortunadamente), pero creo que solo intenta hacer ping a un servidor y falla.
intente cerrar todas las conexiones de red y vuelva a conectarse. Si obtiene una identificación de registro, entonces puede recibir mensajes.