2017-05-10 124 views
1

我正在使用Asterisk AGI構建一個非常複雜的IVR。我使用AsterNET .NET框架集成到FastAGI中。使用Asterisk AGI使用Originate進行出站呼叫並控制呼叫的雙方

大部分的腳本工作正常,我遇到的問題是打出電話。 IVR應用程序將與進入撥號方案的入站呼叫一起工作,後者將其發送給AGI以完成工作。 AGI腳本可以完成大量的事情,數據庫查詢,多層菜單等,並且還可以通過編號來連接入站呼叫者。很顯然,我可以在AGI中使用撥號應用程序,如下所示:

Exec("Dial", "PJSIP/Number,30,r") 

事實上,我可以並且工作正常。但是,我需要更多地控制呼叫的出站端。例如,我需要保持入站鈴聲或播放音樂,而出站應答和我向出站播放音頻。同樣,我知道我可以使用撥號,但是,我需要將音頻播放到呼叫的出站端,並允許他們使用DTMF接受呼叫或拒絕呼叫,而Dial沒有這樣做。如果他們拒絕了呼叫,出站將停止並返回到入站腳本中,以執行其他操作,這可能會撥打其他號碼,或執行其他操作,如語音郵件。

於是,我想到了使用發源於代替,並通過回另一AGI腳本,所以是這樣的:

Exec("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call") 

再次排序的工作。當出站端應答時,入站會稍微等待一段時間,然後出站端會執行腳本中的任何操作,然後入站會跟着它的腳本 - 單獨執行。那麼我需要將它們連接在一起,所以我使用Bridge當然!但我似乎不知道其他渠道是如何將他們加入到一起的,而且我有一個問題,我該如何通知我的入境支腿出境腿的狀態,就好像我不盡快這樣做出站段回答我的入站段繼續執行,而如果出站段已回答並正在從目的地請求dtmf,我需要等待。我想我可能會輪詢一個數據庫,但每個腳本都必須以某種方式再次被引用。

我也嘗試過發送入站的通道,出站腳本,如:

("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call," + + request.Channel) 

,但我不能讓通道可變展現出來,因爲我不能得到多個參數工作對於Originate Exec中的arg2,它只是將其視爲arg3,如果type爲app,則將其忽略。也許我是從錯誤的角度來看待這個問題,所以我會很感激關於如何做到這一點的任何想法。我不能僅僅使用擴展來構建它,因爲它太複雜了,它將接收許多同時調用,全部使用相同的腳本,但同時調用不同的目標等,而且都是動態的。

感謝

大衛

+0

那個和前幾天的問題一樣http:// stackoverflow。com/questions/43739319/asterisk-playing-music-while-originating-a-called- – arheops

+0

不需要它,它需要在AGI中分別控制入站和出站呼叫並將它們連接在一起,這個問題是關於將MOH播放到擴展,正如我所說我不能使用撥號方案。 – Dave

+0

但是解決方案是相同的,沒有其他解決方案可用。如果你不明白如何做到這一點,請聘請專家。 – arheops

回答

1

如果有人有興趣,我這樣做是我自己用AMI做一個動作發源於叫出我的外撥呼叫和發送到AGI腳本入站的通道,然後我的AGI腳本控制出站呼叫,然後使用Bridge將來自AGI腳本的出站呼叫橋接到入站,使用傳遞的通道參數,所以我的2個通道是完全獨立的,所以我可以在我之前做任何我喜歡的任何一個將它們連接起來。花了我幾天的測試,但它沒有使用本地頻道或重寫app_originate。