Como yo sé que mas de uno se ha perdido y mientras presentais vustros problemas vamos con un trozo de código del PIC.
Me considero una persona recicladora, así que he utilizado los archivos GenericTCPClient.c y GenericTCPServer.c del Stack de Microchip, ¿para qué programar algo que ya está programado?
Por supuesto, los he modificado y adaptado a mis necesidades, que no son otras que recibir y enviar datos, mediante socket utilizando un sencillo e inacabado protocolo.
Veamos el GenericTCPServer:
// 48 = '0'
iCentenasDisp = AppBuffer[0] - 48; // Dispositivo
iDecenasDisp = AppBuffer[1] - 48;
iUnidadesDisp = AppBuffer[2] - 48;
i[0] = AppBuffer[3]; // Comando
Arg[0]= AppBuffer[4]; // argumento1
Arg[1]= AppBuffer[5]; // argumento2
Arg[2]= AppBuffer[6]; // argumento3
iDisp = ( iCentenasDisp * 100 ) + ( iDecenasDisp * 10 ) + iUnidadesDisp ;
switch(i[0]) {
case 'V':
...
case 't':
...
break;
case 's':
...
break;
case 'e':
...
break;
case 'a':
....
break;
case 'd':
...
break;
case 'b':
...
break;
case 'c':
...
break;
case 'i':
iFueraTiempo = 0;
for(w2 = 0 ; w2 <=162;w2++){
registration_id[w2] = AppBuffer[w2+4];
} .
strcpy(data_ticker,"Recibido el RegId");
strcpy(data_contentTitle,"RSI-EtU");
strcpy(data_contentText,"Recibido el identificador del dispositivo móvil correctamente");
strcpy(data_contentInfo,"Ok");
itoa(data_contentCode,9,10);
GCMenviadoOK = FALSE;
enviarGCM = TRUE ;
break;
}
A nosotros nos interesa el último case, donde vemos claramente como guardamos en registration_id el RegId recibido desde la aplicación Android.
Mas adelante veremos como es enviado este RegId desde la aplicación Android.
A continuacion vemos como ya se está generando el mensaje para enviar a la aplicación, ¿recuerdan los "campos" data_ticker, data_contentTitle, data_contentText, data_contentInfo y data_contentCode?
GCMenviadoOK y enviarGCM son simples banderas para el flujo normal del programa del pic.
Y ahora un problema: El RegId (que google envia a nuestra aplicacion y que posteriormente enviamos al PIC), puede caducar y google genera otro, este es enviado al pic sin problemas, pero no sé ni cada cuanto tiempo caduca, ni el tamaño en caracteres que pueda a tener, esto es muy importante para nuestra apreciada y limitada memoria.
Si alguien encuentra información sobre esto, por favor comuniquenlo.
Sabemos que podemos enviar los datos mediante Json o texto plano. Como el stack de microchip que yo sepa no nos da la posibilidad de usar JSON, pues texto plano
Ahora veamos como enviamos el mensaje a la aplicación android, aquí esta toda la potencia de este sitema de mensajería y para eso una porción de GenericTCPClient:
debemos hacer unas definiciones:
static BYTE ServerName[] = "android.googleapis.com";
static WORD ServerPort = HTTP_PORT;
static ROM BYTE RemoteURL[] = "/gcm/send";
itoa( (char*)ContentLength, ( strlen( (ROM char*) registration_id )
+ strlen ( data_ticker )
+ strlen ( data_contentTitle )
+ strlen ( data_contentText )
+ strlen ( data_contentInfo )
+ strlen( data_contentCode )
+ 102 ),10 );
TCPPutROMString(MySocket, (ROM BYTE*)"POST ");
TCPPutROMString(MySocket, RemoteURL);
TCPPutROMString(MySocket, (ROM BYTE*)" HTTP/1.1\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Host: ");
TCPPutString(MySocket, ServerName);
TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Content-Length: ");
TCPPutString(MySocket,ContentLength);
TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Content-Type: application/x-www-form-urlencoded\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Authorization:key= *********************************** \r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"Connection: close\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");
TCPPutROMString(MySocket, (ROM BYTE*)"registration_id=");
TCPPutString(MySocket,registration_id);
TCPPutROMString(MySocket, (ROM BYTE*)"&data.ticker=");
TCPPutString(MySocket,(BYTE*)data_ticker);
TCPPutROMString(MySocket, (ROM BYTE*)"&data.contentTitle=");
TCPPutString(MySocket,(BYTE*)data_contentTitle);
TCPPutROMString(MySocket, (ROM BYTE*)"&data.contentText=");
TCPPutString(MySocket,(BYTE*)data_contentText);
TCPPutROMString(MySocket, (ROM BYTE*)"&data.contentInfo=");
TCPPutString(MySocket,(BYTE*)data_contentInfo);
TCPPutROMString(MySocket, (ROM BYTE*)"&data.contentCode=");
TCPPutString(MySocket,(BYTE*)data_contentCode);
102 es la longitud de los textos depositados en el servidor y que no forman parte de las variable. Es importante que ContentLength sea correcto si no el servidor respondera con un error.
Por supuesto debemos adaptar el tamaño de los buffer en nuestro TCPIPConfig.
Fácil verdad...