私は、C# を使用して、Aster.NET (以前は/Asterisk.NET からフォークされたもの) を使用してアスタリスクとやり取りする WinForms デスクトップ アプリケーションを構築しています。個々の内線番号/ユーザーに関連する通話を確実に識別して追跡するのに、本当に問題があります。
私たちが抱えている問題は、アスタリスクによって発生/トリガーされるイベントの予測不可能/あいまいな性質によるものであり、内線に到達する前に通話がどのようにルーティングされるかによって、イベントは大きく変化します。
たとえば、イベント シーケンス/形式は次の場合に異なります。コールがブラインド転送される前に IVR にヒットした場合。在席転送される前にコールが IVR にヒットした場合。通話がユーザーの内線に直接つながる場合。
これは、アスタリスクが異なる一意の ID を使用して通話の各側を追跡する方法によってさらに妨げられます (たとえば、通話の着信側は、通話の受信側とは異なる UID を持っています)。(その後醜い!) コードでそれを説明することができましたが、呼び出しが取ることができるさまざまなルーティング パスを説明することで、まだ問題が発生しています。
そのため、次のことをどのように行うことができるかについてのアドバイスを探しています。
- ユーザーの内線番号への着信を確実に識別
- コールされている内線番号と発信者 ID を識別できる必要があります (ブラインド転送または在席転送と外部からの直接コールの後)。
- 通話録音へのリンクに使用されるため、その着信通話の一意の ID を確実に追跡します。
- ユーザーの内線からの発信を確実に識別
- 上記と同じ注意事項を念頭に置いて
現時点では、アプリの「現在の状態」に応じて異なる動作をする非常に複雑なイベント ハンドラーのチェーンがあります。
一例を挙げると、ChannelState が 6 (「Up」) の NewStateEvent を検出した場合、進行中の通話があるかどうか、および UID が一致するかどうかを確認し、一致する場合は、現在の通話が応答されていることを確認します。UID が一致しないが、他の要因 (チャネル、connectedlinenum など) が一致する場合、これを呼び出しの「反対側」(受信側または着信側) として取り上げます。
問題が API にあるのか AMI にあるのかはわかりませんが、どちらにせよ、私たちには本当に頭痛の種です。
アドバイスをいただければ幸いです。