2012-09-19 3 views
6

pjsipクライアントをセットアップしてメッセージを受け取る方法については、誰でも良い例が分かります。 私が使用してクライアントからメッセージを送信することができます任意の番号にpjsip receive sms

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

を。

しかし、私はすでに登録されているSIPアカウントにメッセージを受け取るために何をすべきか分かりません。

すべての情報をいただければ幸いです。

注:私はpjsipしか使用できず、他のライブラリは使用できません。

編集:いくつかの新しいものは、私が見つかりました:

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

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf(ただし、すべてこの文書はこれが入ってくるのMSGについてこう述べています。MESSAGE

を受け

16.1.2

ダイアログボックスの外側にある着信メッセージリクエストは、アプリケーションによって受信されます モジュール。 ダイアログ内の着信MESSAGEリクエストは、ダイアログのコールバック on_tsx_state()経由でダイアログ使用に通知されます。

まだ着信メッセージを処理する方法についてはあまり光を当てません。

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

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

EDIT2:私はon_pager機能は、この機能を使用する必要があることを言われてきました。だから私は試みましたが、残念ながらまだ成功していません。ここで

は私がやったことです:

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

そして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); 

} 

私は、メッセージを受信したときに、アプリケーションがon_pager呼び出すように期待していたが、それはしませんでした。しかし、 on_incoming_callが呼び出されます。

答えて

6

私がしたことは正しかったことが分かりました。それは単なるサーバーの問題でした。 メッセージを受信しました。

基本的には、それをまとめると:

一口に登録:on_pager()関数を登録します

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

がSMSを受信したときに呼び出されます。 残りは、その機能の中で何をすべきかまでです。

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) 

私はなど、すべてが機能パラメータの自明だと思いますおかげでみんなとにかく試みる:

これは、関数ヘッダであります!

そして、app_configはpjsua_init()関数の中で渡されます。

また、sipStartup()では、iOSのNSNotification関数を登録します。

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

とprocessMessageState:以下の通りです:

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