2012-09-19 18 views
6

Każdy zna wszelkie dobre przykłady, jak skonfigurować klienta pjsip do odbierania wiadomości. mogę wysyłać wiadomości z klientem za pomocą:pjsip otrzymywać sms

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

do dowolnej liczby.

Ale nie mam pojęcia, co zrobić, aby otrzymywać wiadomości na już zarejestrowane konto sip.

Wszelkie informacje będą mile widziane.

Uwaga: Mogę używać tylko biblioteki pjsip i innych bibliotek.

Edit: Niektóre nowych rzeczy znalazłem:

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

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (jednak cały ten dokument mówi o przychodzących wiad to:

16.1.2 odebraniu wiadomości

Przychodzące żądania MESSAGE poza dowolnymi oknami dialogowymi będą odbierane przez aplikacjęModuł. Przychodzące żądania MESSAGE w oknie dialogowym będą powiadamiane o użyciu okna dialogowego przez on_tsx_state() wywołanie zwrotne okna dialogowego.

, która wciąż nie rzuca dużo światła na sposób obsługi wiadomości przychodzących.

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

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

Edit2: Powiedziano mi, że on_pager funkcja powinna być używana do tej funkcji. Próbowałem, ale niestety nie udało mi się osiągnąć sukcesu.

Oto co zrobiłem:

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

i wdrożenie 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); 

} 

Spodziewałem aplikację aby zadzwonić on_pager po odebraniu wiadomości, ale tak się nie stało. on_incoming_call jednak zostanie wywołany.

Odpowiedz

6

Okazuje się, że to, co zrobiłem, było poprawne, a był to tylko problem z serwerem. Odbieranie wiadomości już działa!

Podsumowując, w zasadzie:

podczas rejestracji SIP:

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

To będzie rejestrować funkcji on_pager(), aby zostać wezwany odbierania wiadomości SMS. Reszta zależy od Ciebie, co zrobić w środku tej funkcji.

To jest nagłówek funkcji:

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) 

Myślę, że wszystko jest oczywista dla parametrów funkcyjnych itd Dzięki wszystkim za próbę anyways!

A app_config jest przekazywany wewnątrz funkcji pjsua_init().

Ponadto, w sipStartup() rejestrujemy funkcje NSNotification dla 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; 
} 

i processMessageState: jest poniżej:

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