2012-09-19 10 views
6

Qualcuno conosce qualche buon esempio su come configurare un client pjsip per ricevere messaggi. posso inviare messaggi dal client utilizzando:pjsip receive sms

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

a qualsiasi numero.

Ma non ho idea di cosa fare per ricevere messaggi nell'account sip già registrato.

Qualsiasi informazione sarebbe molto apprezzata.

Nota: Posso utilizzare solo pjsip e nessun'altra libreria.

Edit: alcune cose nuove che ho trovato:

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

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (comunque tutto questo documento dice di msg in entrata è questo:

16.1.2 Ricezione MESSAGGIO

Le richieste di MESSAGGIO in arrivo all'esterno di qualsiasi finestra di dialogo verranno ricevute dall'applicazione modulo. Le richieste di MESSAGGIO in entrata all'interno di una finestra di dialogo verranno notificate all'utilizzo della finestra di dialogo tramite on_tsx_state() richiamata della finestra di dialogo.

che ancora non illumina molto su come gestire i messaggi in arrivo.

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

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

Edit2: Mi è stato detto che on_pager funzione deve essere utilizzato per questa funzionalità. Così ho provato, ma purtroppo non ho avuto successo.

Ecco quello che ho fatto:

/* 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; 

e l'implementazione 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); 

} 

mi aspettavo all'applicazione di chiamare on_pager quando un messaggio viene ricevuto, ma non fu così. on_incoming_call tuttavia viene chiamato.

risposta

6

Risulta, quello che ho fatto era corretto, ed era solo un problema con il server. La ricezione di messaggi ora funziona!

Per riassumere, in fondo:

al momento della registrazione per SIP:

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

che registrerà per la funzione on_pager() per essere chiamato dopo aver ricevuto uno SMS. Il resto sta a voi decidere cosa fare all'interno di quella funzione.

Questa è l'intestazione funzione di:

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) 

penso che tutto si spiega da sé per i parametri della funzione, ecc Grazie a tutti in ogni modo per provare!

E app_config viene passato all'interno della funzione pjsua_init().

Inoltre, in sipStartup() registriamo le funzioni NSNotification per 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; 
} 

e processMessageState: è qui sotto:

- (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; 
    } 
}