わかりました、私は解決策を見つけました。
コマンドが 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.hasInputをtrueに設定する必要があります。コマンドを送信したい場合:
- まず、この変数にコマンド テキストを入れます
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;
}
}
また、誰かがこの問題に対する他のアプローチを持っている場合は、ここに追加してください。