6

メッセージを受信するように pjsip クライアントをセットアップする方法の良い例を誰もが知っています。以下を使用して、クライアントからメッセージを送信できます。

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

任意の番号に。

しかし、すでに登録されている一口アカウントにメッセージを受信するために何をすべきかわかりません。

どんな情報でも大歓迎です。

注: pjsip のみを使用でき、他のライブラリは使用できません。

編集:私が見つけたいくつかの新しいもの:

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

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (ただし、このドキュメントでは着信メッセージについて次のように述べています。

16.1.2 MESSAGE の受信

ダイアログ外の着信 MESSAGE リクエストは、アプリケーション モジュールによって受信されます。ダイアログ内の着信 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ただし、呼び出されます。

4

1 に答える 1

6

結局のところ、私がしたことは正しかったし、それはサーバーの問題にすぎなかった。メッセージの受信が機能するようになりました。

要約すると、基本的に:

一口に登録するとき:

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

これにより、SMSの受信時に呼び出される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)

関数パラメータなどはすべて自明だと思います。とにかくやってくれてありがとう!

そして、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;
    }
}
于 2012-12-25T21:11:57.593 に答える