2012-09-19 15 views
6

Cualquiera conoce buenos ejemplos sobre cómo configurar un cliente pjsip para recibir mensajes. puedo enviar mensajes desde el cliente mediante:pjsip recibir sms

pjsua_im_send(sip_acc_id, &to, NULL, &msgbody, NULL, NULL); 

a cualquier número.

Pero no tengo idea de qué hacer para recibir mensajes en la cuenta de sip ya registrada.

Cualquier información sería muy apreciada.

Nota: Solo puedo usar pjsip y ninguna otra biblioteca.

Editar: algunas cosas nuevas que he encontrado:

http://trac.pjsip.org/repos/ticket/1070

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (sin embargo todo este documento dice acerca de Mensajes entrantes es la siguiente:

16.1.2 recepción de mensajes

Las solicitudes de MENSAJE entrantes fuera de los cuadros de diálogo se recibirán mediante la aplicación módulo. Las solicitudes de MENSAJE entrantes dentro de un diálogo se notificarán al uso del diálogo a través del on_tsx_state() devolución de llamada del cuadro de diálogo.

que aún no aclara mucho sobre cómo manejar los mensajes entrantes.

http://www.ietf.org/rfc/rfc3261.txt

http://trac.pjsip.org/repos/wiki/SIP_Message_Buffer_Event

Edit2: me han dicho que on_pager función tiene que ser utilizado para esta funcionalidad. Así que lo intenté, pero todavía no tuve éxito, por desgracia.

Esto es lo que hice:

/* Initialize application callbacks */ 
    app_config->cfg.cb.on_call_state = &on_call_state; 
    app_config->cfg.cb.on_call_media_state = &on_call_media_state; 
    app_config->cfg.cb.on_incoming_call = &on_incoming_call; 
    app_config->cfg.cb.on_reg_state = &on_reg_state; 
    app_config->cfg.cb.on_pager = &on_pager; 

Y la aplicación on_pager:

static void on_pager(pjsua_call_id call_id, const pj_str_t *from, const pj_str_t *to, const pj_str_t *contact, const pj_str_t *mime_type, const pj_str_t *body) { 

    NSLog(@"**************** on_pager called **********************"); 
    AppDelegate *app = (AppDelegate *)[AppDelegate sharedApplication]; 

    pjsua_call_info ci; 

    pjsua_call_get_info(call_id, &ci); 

    PJ_UNUSED_ARG(call_id); 
    PJ_UNUSED_ARG(to); 
    PJ_UNUSED_ARG(contact); 
    PJ_UNUSED_ARG(mime_type); 

    [app ring]; 

    //PJ_LOG(3,(THIS_FILE, "MESSAGE from %.*s: %.*s (%.*s)", (int)from->slen, from->ptr, (int)text->slen, text->ptr, (int)mime_type->slen, mime_type->ptr)); 

    postMessageStateNotification(call_id, &ci); 

} 

yo esperaba que la aplicación llame on_pager cuando se recibe un mensaje, pero no lo hizo. on_incoming_call sin embargo, recibe una llamada.

Respuesta

6

Resulta que lo que hice fue correcto y solo fue un problema con el servidor. ¡Recibir mensajes ahora está funcionando!

Para resumir, básicamente:

cuando se registra para sip:

app_config->cfg.cb.on_pager = &on_pager; 

que registrarán para la función on_pager() para llamar a la recepción de un SMS. El resto depende de usted qué hacer dentro de esa función.

Este es el encabezado de la función:

static void on_pager(pjsua_call_id call_id, const pj_str_t *from, const pj_str_t *to, const pj_str_t *contact, const pj_str_t *mime_type, const pj_str_t *body) 

Creo que todo se explica por sí para los parámetros de función, etc. Gracias a todos por tratar de todos modos!

Y app_config se pasa dentro de la función pjsua_init().

Además, en sipStartup() registramos las funciones NSNotification para iOS.

/***** SIP ********/ 
/* */ 
- (BOOL)sipStartup 
{ 
    kSIPCallState   = @"CallState"; 
    kSIPRegState   = @"RegState"; 
    kSIPMwiInfo   = @"MWIInfo"; 

    if (_app_config.pool) 
     return YES; 

    self.networkActivityIndicatorVisible = YES; 

    if (sip_startup(&_app_config) != PJ_SUCCESS) 
    { 
     self.networkActivityIndicatorVisible = NO; 
     return NO; 
    } 
    self.networkActivityIndicatorVisible = NO; 

    CTTelephonyNetworkInfo *phoneInfo = [[CTTelephonyNetworkInfo alloc] init]; 
    CTCarrier *phoneCarrier = [phoneInfo subscriberCellularProvider]; 
    NSLog(@"Carrier = %@", phoneCarrier); 

    [self checkForConnection]; 

    NSTimer *timer; 
    receiveCallTask = [[UIApplication sharedApplication] 
         beginBackgroundTaskWithExpirationHandler:^{ 

         }]; 

    //timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(checkForConnection) userInfo:nil repeats:YES]; 


    /** Call management **/ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(processCallState:) 
               name: kSIPCallState object:nil]; 

    /** Registration management */ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(processRegState:) 
               name: kSIPRegState object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(processMessageState:) 
               name:kSIPMwiInfo object:nil]; 

    return YES; 
} 

y processMessageState: es a continuación:

- (void)processMessageState:(NSNotification *)notification 
{ 
    NSLog(@"*****  processMessageState is called  *****"); 
    NSNumber *value = [[ notification userInfo] objectForKey:@"CallID"]; 
    pjsua_call_id callId = [value intValue]; 

    int state = [[[ notification userInfo] objectForKey:@"Event"] intValue]; 

    switch (state) { 
     case PJSIP_EVENT_UNKNOWN: 
      NSLog(@"unknown event"); 
      break; 
     case PJSIP_EVENT_TIMER: 
      NSLog(@"timer event"); 
      break; 
     case PJSIP_EVENT_RX_MSG: 
      NSLog(@"received --> rx_msg"); 
      break; 
     case PJSIP_EVENT_TX_MSG: 
      NSLog(@"tx_msg"); 
      break; 
     case PJSIP_EVENT_TRANSPORT_ERROR: 
      NSLog(@"msg transport error"); 
      break; 
     case PJSIP_EVENT_TSX_STATE: 
      NSLog(@"event tsx state"); 
      break; 
     case PJSIP_EVENT_USER: 
      NSLog(@"event user"); 
      break; 
     default: 
      NSLog(@"processMessageState was called"); 
      break; 
    } 
} 
Cuestiones relacionadas