Como vemos la función smpp34_unpack( ... )
toma cuatro parámetros y retorna un valor entero que describe el
resultado de la operación. Un valor distinto de 0 en el retorno,
indica que hubo un error en el intento de desempaquetado, luego hay una
descripción en modo texto en la variable global smpp34_strerror.
extern int smpp34_errno;
extern char smpp34_strerror[2048];
int smpp34_unpack( uint32_t type, /* in */
void *tt, /* out */
uint8_t *ptrBuf, /* in */
int ptrLen, /* in */ )
|
type: es el command_id del PDU que se quiere desempacar, el valor de este parámetro esta directamente relacionado a una estructura de datos específica.
tt: Es un puntero a una de las estructuras de datos listadas en la introducción y que se corresponde con el valor del primer parámetro. El puntero a dicha esctructura describe donde va a volcare el contenido del buffer.
ptrBuf: es un puntero a un buffer, donde va a almacenado el PDU empacado.
ptrLen: en esta variable va el largo del buffer anteriormente descripto.
Se detalla a continuación un pequeño ejemplo de uso, en el mismo, se detalla la creación de un buffer con data binaria. Luego se aplica la función de desempacado y se carga una estructura de datos con la data.
Ejemplo 2. Ejemplo de unpack y dumpPdu.
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <netinet/in.h>
#include "smpp34.h"
#include "smpp34_structs.h"
#include "smpp34_params.h"
char bufPDU[] = { 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x5F, 0x69,
0x64, 0x00, 0x70, 0x61, 0x73, 0x73, 0x00, 0x73,
0x79, 0x73, 0x74, 0x65, 0x00, 0x00, 0x02, 0x01,
0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5F,
0x72, 0x61, 0x6E, 0x67, 0x65, 0x00 };
int bufPDULen = 0;
char bPrint[2048];
int
main( int argc, char *argv[] )
{
int ret = 0;
bind_receiver_t pdu;
uint32_t tempo;
uint32_t cmd_id;
/* Init PDU ***********************************************************/
memset(&pdu, 0, sizeof(bind_receiver_t));
memset(&bPrint, 0, sizeof(bPrint));
memcpy(&tempo, bufPDU+4, sizeof(uint32_t));
cmd_id = ntohl( tempo );
/* unpack PDU *********************************************************/
ret = smpp34_unpack(cmd_id, (void*)&pdu, bufPDU, sizeof(bufPDU));
if( ret != 0){
printf( "Error in smpp34_unpack():%d:%s\n",
smpp34_errno, smpp34_strerror);
return( -1 );
};
/* Print PDU **********************************************************/
memset(bPrint, 0, sizeof(bPrint));
ret = smpp34_dumpPdu(cmd_id, bPrint, sizeof(bPrint), (void*)&pdu );
if( ret != 0){
printf( "Error in smpp34_dumpPdu():%d:%s\n",
smpp34_errno, smpp34_strerror );
return( -1 );
};
printf("El PDU recibido es: \n%s\n", bPrint);
return( 0 );
};
|
smpp34_dumpPdu( ... )
.
El ejemplo se compila y ejecuta:
[rtremsal@localhost dist]$ gcc -o ll ll.c -I ./include -static -L ./lib -lsmpp34
[rtremsal@localhost dist]$ ./ll
El PDU recibido es:
command_length [00000036] - [54]
command_id [00000001] - [BIND_RECEIVER]
command_status [00000000] - [ESME_ROK]
sequence_number [00000001] - [1]
system_id [system_id]
password [pass]
system_type [syste]
interface_version [00] - [0]
addr_ton [02] - [TON_National]
addr_npi [01] - [NPI_ISDN_E163_E164]
address_range [address_range]
|