'iOSPush.Start 'comment these two lines to disable iOS notifications
'iOSFeedback.Start
El push server es una aplicacion no UI, es decir, se ejecuta como un programa residente; puedes ver si está corriendo mirando el Log o accediendo al servidor en la dirección IP y puerto configurado y ver si te carga la página inicial del servidor
2016-03-03 16:48:09.536:INFO::main: Logging initialized @259ms
2016-03-03 16:48:09.632:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT
2016-03-03 16:48:09.676:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@1b40d5f0{/,file:///C:/Users/DeSof/Downloads/B4X-PushServer/PushServer/Objects/www,AVAILABLE}
2016-03-03 16:48:09.679:INFO:oejs.AbstractNCSARequestLog:main: Opened C:\Users\DeSof\Downloads\B4X-PushServer\PushServer\Objects\logs\b4j-2016_03_03.request.log
main._appstart (java line: 66)
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:326)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:244)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:384)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at anywheresoftware.b4j.object.ServerWrapper.Start(ServerWrapper.java:182)
at b4j.example.main._appstart(main.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:93)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:84)
at b4j.example.main.main(main.java:29)
main.main (java line: 29)
java.lang.RuntimeException: java.net.BindException: Address already in use: bind
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:114)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:84)
at b4j.example.main.main(main.java:29)
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:326)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:244)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:384)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at anywheresoftware.b4j.object.ServerWrapper.Start(ServerWrapper.java:182)
at b4j.example.main._appstart(main.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:93)
... 2 more
java.net.BindException: Address already in use: bind
Cool !!Lo pruebas en tu PC y si te funciona, lo subes a un VPS (por ejemplo Amazon con una instancia en Linux), a un servidor en tu casa configurado para responder a un puerto de tu IP pública de Internet, a una Raspberry Pi , etc...
De esa manera podrás enviar notificaciones a todos tus usuarios; el tema del PC es por comodidad para testear el entorno
<?php
/**
* Google Cloud Messenger
* Ejemplo de HTTP POST REQUEST
* Extraido de la documentacion de google: https://developers.google.com/cloud-messaging/
*
*
* https://gcm-http.googleapis.com/gcm/send
* Content-Type:application/json
* Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
*
* { "data": {
* "score": "5x1",
* "time": "15:10"
* },
* "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
* }
**/
function enviarMensajeGCM($GCMregid, $mensaje, $otrodato, $apiKey){
$GCMapiKey = $apiKey;
// Registro Id del dispositivo
$registrationIDs = $GCMregid;
// Se establecen las variables que se van a mandar por POST
$cty="Content-Type: application/json";
// URL para el envio de los mensajes
//$url = 'https://android.googleapis.com/gcm/send'; //Antigua URL
$url = 'https://gcm-http.googleapis.com/gcm/send';
$fields = array(
'data' => array( "mensaje" => $mensaje , "dato" => $otrodato),
'to' => $registrationIDs
);
$headers = array(
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);
// Abre una conexión
$ch = curl_init();
// Establece el url, numero de variables Post y los datos del mensaje
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
// Ejecuta el post
$res_GCM_funcion = curl_exec($ch);
if ($res_GCM_funcion === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
// Cierra la conexión
curl_close($ch);
//decodifica en el array $res la cadena Json que devuelve Google
$res = json_decode($res_GCM_funcion,true);
//Devuelve el array
return $res;
}
?>
Para las notificaciones push intervienen tres partes: Cliente (Dispositivo) - Servidor de Google - Mi servidor.seria bueno q expliques por favor un poco como es la implementación..
Sub Process_Globals
Public SenderId As String
'Set this field to match the project ID in Google Console.
SenderId = "123456789012"
End Sub
Sub HandleRegistrationResult(Intent As Intent)
If Intent.HasExtra("error") Then
Log("Error: " & Intent.GetExtra("error"))
ToastMessageShow("Error: " & Intent.GetExtra("error"), True)
Else If Intent.HasExtra("unregistered") Then
'No lo usamos
Else If Intent.HasExtra("registration_id") Then
Dim rid As String
rid = Intent.GetExtra("registration_id")
Dim j As HttpJob
j.Initialize("RegisterTask", Me)
j.PostString("http://miservidor.com/registro.php","codigoRegistro=" & rid)
End If
End Sub
Ese archivo va en mi servidorDonde va ese archivo ?
Nada, es una función, sólo hay que pasarle los parámetros correspondientesQue hay q modificarle?
No dispongo de un ejemplo generalizado, pero sea lo que sea donde te atasques no dudes en preguntar hasta que lo consigas.No puedes :incluir el ejemplo completo.?
Como todo en esta vida lo primero es entender la teoría (lógica) de las cosas, después se puede implementar de varias maneras, me da la impresión que si alguien te pasa algo ya montado y funcionando, lo usarías sin entender como funciona, vale, pero luego seguro que te surgen problemas, problemas que no vas a poder resolver si no sabes lo que hace como lo hace y por que lo hace.
Si quieres vamos paso a paso, yo te ayudaré en lo que pueda (acabo de implementar otra vez push gcm en otra de mis app) enséñanos lo que tienes echo y lo que quieres hacer, si no quieres enseñar lo que tienes, tenemos algo ya con todo echo aquí: https://www.b4x.com/android/forum/threads/b4x-push-server.48560/
Descárgatelo y lo hacemos funcionar aquí entre todos, así puede valernos de tutorial para todos, por el camino aprenderemos lo que es b4j y todo lo necesario para hacer funcionar gcm, te parece?
Para las notificaciones push intervienen tres partes: Cliente (Dispositivo) - Servidor de Google - Mi servidor.
Cliente y Servidor de Google digamos que es fijo. La parte que puede variar dependiendo de tus necesidades es "mi servidor". Yo uso un VPS donde tengo alojado un dominio, una base de datos MYSQL y PHP. Imagínate que por cada registro que se introduce en una tabla de mi BD yo quiero notificar a un dispositivo. Lo primero que hice fue crear una tabla que alberga cada uno de los dispositivos que intervienen con dos campos importantes entre otros:
- ID dispositivo (un identificador único creado por mi para cada dispositivo )
- ID Registro de Google (un identificador que facilita Google para cada dispositivo)
Un requisito obligatorio es que Google exige registrar la aplicación. Para ello Google te permite crear un proyecto API (API Proyect en https://console.developers.google.com) donde te dan un numero de proyecto que nosotros conocemos en B4A como SenderId en los ejemplos de Erel.
Absolutamente de acuerdopero luego seguro que te surgen problemas, problemas que no vas a poder resolver si no sabes lo que hace como lo hace y por que lo hace.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?