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] |