アスタリスクを使用して音声サーバーを実装しています。次の2つの質問があります。
ファイルを読み書きして、いくつかの追加機能を付与できるようにしたい。アスタリスクでこれを行う方法はありますか?出力を書き込むためのcoutなどの通常の機能が抑制されていることに気づきました。
アスタリスクで書かれたアプリケーションをデバッグする方法はありますか?アスタリスクのgdbのようなものを意味しますか?
上記の質問に関するヘルプは大歓迎です。
ありがとう、
スリラム。
Michaelの回答に対するコメントで、C /C++を使用しているとおっしゃっていました。
CまたはC++(または実際には任意の言語)を使用して、AsteriskでファイルI/Oを確実に実行できます。アスタリスクは、4つの主要なタイプのアプリケーションをサポートしています。
ダイヤルプラン:デフォルトのAsteriskスクリプト言語。含まれているコードはすべてextensions.conf
ダイヤルプランです。この言語を使用して、着信呼び出しを制御したり、処理を実行したりできます。ファイルI/Oの場合、ダイヤルプランはSystem
コマンドと、AGI
他のソフトウェア(bashスクリプト、Cバイナリなど)を実行できるコマンドを提供します。次に、bashスクリプトやCプログラムなどで、コマンドラインでプログラムを実行しているかのように、通常のファイルI/Oを実行できます。元:
[some_context]
exten => s,1,System(/bin/echo "hello, world" >> /tmp/test.txt)
exten => s,n,Return()
[launch_an_agi]
exten => s,1,AGI(/var/lib/asterisk/agi-bin/my_c_program,optional_cmd_line_arguments,to,pass)
exten => s,n,Hangup()
AGI:Asterisk AGI(ダイヤルプランコードから起動)を使用すると、外部プログラム(Cプログラムなど)を実行し、プログラムが使用できる、現在処理中の呼び出しに関するいくつかのAsterisk変数をCプログラムに渡します。ここで通常のコーディングツールを使用して、必要なファイルI / Oを実行できます。例:
/* some_c_agi_program */
include <stdio.h>
int main(void) {
FILE *f = fopen("/tmp/test.txt", "w");
(void)fprintf(f, "MY FILE IO WORKS! THANKS STACKOVERFLOW!\n");
fclose(f);
return 0;
}
AMI:AMIは、Asteriskが提供するネットワークAPIです。これを使用して、別のサーバーで実行されるプログラムを作成できます。このプログラムは、Asteriskサーバーでの呼び出しのステータスを作成、制御、および表示できます。アイデアは、TCPソケットを介してプログラムのアスタリスクサーバーに接続し、コマンドを送信して応答を読み戻すことです。Cでの巨大なプログラムになるので、例を示すつもりはありません。しかし、あなたはその考えを理解します。
さあ、デバッグに移りましょう!
作成しているアプリケーションのタイプに応じて、デバッグするさまざまな方法があります。単体テストの概念に精通している場合は、単体テストを作成し、これから説明するメソッドのいずれかに対して単体テストが実行されることを確認できます。汎用デバッグ(AGIまたはAMIプログラムを作成している場合)には、通常のCデバッガー(GDB)を使用できます。
何かが足りないかもしれませんが、Asterisk独自の組み込みFILE関数よりも複雑にする必要がありますか?
ファイルの内容全体を読み取ります。
Set(foo=${FILE(/tmp/test.txt)})
ファイルの3行目を読み取ります。
Set(foo=${FILE(/tmp/test.txt,3,1,l)})
ファイルの最後の行を「cat」に置き換えます
Set(FILE(/tmp/foo.txt,-1,,l)=cat)
改行でファイルに「犬」を追加します
Set(FILE(/tmp/foo.txt,,,al)=dog)
ダイヤルプランの例:
exten => 800,n,Set(FILE(/tmp/cid.txt,,,al)=${CALLERID(num)})
AGIを使用していますか?もちろん、AGIを使用すると、ファイルの読み取り/書き込みを行うことができます。
-vvvvvvv
コマンドラインオプションを使用して、アスタリスクを冗長にすることができます。v
アスタリスクをより冗長にします。私にとっては、ダイヤルプランをデバッグするだけで十分でした。AGIをデバッグしたい場合は、ログファイルへのロギングを使用するか、より単純なタスクには偽のagi_libを使用しました(真のAGIが利用できない単体テストに適しています)。