2

このリンクに従って pjsip をコンパイルしました。iPhone用の pjsip サンプル アプリケーション ipjsua を実行すると、すべてがうまく機能します。問題は、コマンドの送信方法を理解できないことです。つまり、そのコマンドテキストフィールドにテキストを入力すると、誰かが私がそこに書いていることを聞いていて、それが実行されます。この人物は誰で、それは ipjsua アプリ コードのどこにあるのでしょうか?

私のアプリケーションでは、コマンドを書き込むためのテキスト フィールドがありません。連絡先のリストが表示され、連絡先を選択すると、一口電話をかけます。

コマンドの実行に使用する pjsip 関数と、sip サーバーの応答をリッスンする関数 (イベント、デリゲート) はどれですか?

4

1 に答える 1

1

わかりました、私は解決策を見つけました。

コマンドが ipjsua アプリの sip サーバーに送信される場所はchar * getInput(char *s, int n, FILE *stream)、ipjsuaAppDelegate.m ファイル内の関数にあります。

このコードの一部char * getInput(char *s, int n, FILE *stream)

if (stream != stdin)
{
    return fgets(s, n, stream);
}

config.cfg ファイルとそのコンテンツを読み取り、実行のために sip サーバーに送信されます。このファイルには、アカウント構成、メディア構成などの設定を入れることができます (このリンクpjsua マニュアルの詳細)。

config.cfg ファイルが読み取られた後、このコードは

while (!thread_quit && !app.mainView.hasInput)
{
    int ctr = 0;
    [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
    if (ctr == 4)
    {
      [app performSelectorOnMainThread:@selector(displayMsg:) withObject:mstr waitUntilDone:YES];
        [mstr setString:@""];
        ctr = 0;
    }
    ctr++;
}

実行中で、アプリケーションからのコマンド入力を待っています。この while ループをトリガーして実行を継続するには、app.mainView.hasInputtrueに設定する必要があります。コマンドを送信したい場合:

  • まず、この変数にコマンド テキストを入れますapp.mainView.text
  • 秒、セットapp.mainview.hasInput = true

もちろん、ipjsuaAppDelegate クラスでこれらの変数を非公開にすることができます。重要な事実は、while (!thread_quit && !app.mainView.hasInput)代わりapp.mainView.hasInputにローカル変数が含まれていることですhasInput

command を送信した後、このコードが実行されます (char * getInput(char *s, int n, FILE *stream)関数内) 。

[app.mainView.text getCString:s maxLength:n encoding:NSASCIIStringEncoding];
[app.mainView.textField setEnabled: false];    
[app performSelectorOnMainThread:@selector(displayMsg:) withObject:app.mainView.text waitUntilDone:NO];

return s;

次に、pjsua_app.c ファイル内の対応するコードが実行され、その関数char * getInput(char *s, int n, FILE *stream)が再度呼び出された後、while ループ ( while (!thread_quit && !app.mainView.hasInput)) が実行され、別の入力を待ちます。したがって、ここでは、2 つ以上の連続したコマンドを実行する必要がある場合に、while ループ実行の前の瞬間を使用して別のコマンドを送信できます (例: 電話をかけるには「m」を送信し、sip uri を送信して「sip:account を呼び出す」必要があります)。 @example.com' とこれらは 2 つの連続したコマンドです)。

私のアプリケーションでは、次のようになります

char * getInput(char *s, int n, FILE *stream)
{
    if (stream != stdin)
    {
        return fgets(s, n, stream);
    }

    [appDelegate performSelectorOnMainThread:@selector(actionAfterCommand) withObject:nil waitUntilDone:NO];   

    app.mainView.hasInput = false;
    [app.mainView.textField setEnabled: true];
    [app performSelectorOnMainThread:@selector(displayMsg:) withObject:mstr waitUntilDone:YES];
    [mstr setString:@""];

    while (!thread_quit && !app.mainView.hasInput)
    {
        int ctr = 0;
        [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
        if (ctr == 4)
        {
            [app performSelectorOnMainThread:@selector(displayMsg:) withObject:mstr waitUntilDone:YES];
            [mstr setString:@""];
            ctr = 0;
        }

        ctr++;
    }

    [app.mainView.text getCString:s maxLength:n encoding:NSASCIIStringEncoding];
    [app.mainView.textField setEnabled: false];    
    [app performSelectorOnMainThread:@selector(displayMsg:) withObject:app.mainView.text waitUntilDone:NO];

    return s;
}

とセレクターactionAfterCommand

- (void)actionAfterCommand
{
    [NSThread sleepForTimeInterval:1.0];//this is just to be sure that sip server is ready to listen agin

    if ([app.mainView.text isEqualToString:command])// command can be m, a, ...
    {
        app.mainView.text = secondCommand;
        appDelegate.hasInput = true;
    }
}

また、誰かがこの問題に対する他のアプローチを持っている場合は、ここに追加してください。

于 2012-12-13T11:09:18.767 に答える