24 Mayıs 2012 Perşembe

Araya Kısaca AGI Girelim (Asterisk Gateway Interface))


Asteriskle ilgili gelen istekler üzerine;

Asteriskle kendi ivr senaryonuzu başka bir pcde koşturmak yönlendirmek isterseniz Agi kullanmalısınız.
Agi sizin beliryeceğiniz tcp ip servera bağlanıp size veri gönderip komut alma yöntemiyle çalışır. Asterisk.Net kütüphanesi içerisinde örneği bulabilirsiniz. Net olarak anlatılmayan yapmanız gereken extension ayarı aşağıdadır.

extensions_custom.conf dosyası(asteriski reload etmeyi unutmayın 192.168.5.107 ip asteriskin bağlanmasını istediğimiz ip)


; This file contains the contexts the agents login for the module call center.

; and contains the context conferences for module conferences of elastix 1.0.
[from-internal-custom]
exten => 1234,1,Playback(demo-congrats) ; extensions can dial 1234
exten => 1234,2,Hangup()
exten => h,1,Hangup()
include => agentlogin
include => conferences
include => calendar-event
include => weather-wakeup
include => weather-wakeup
include => ext-test
include => customivr

[agentlogin]
exten => _*8888.,1,Set(AGENTNUMBER=${EXTEN:5})
exten => _*8888.,n,NoOp(AgentNumber is ${AGENTNUMBER})
exten => _*8888.,n,AgentLogin(${AGENTNUMBER})
exten => _*8888.,n,Hangup()
[mm-announce]
exten => 9999,1,Set(CALLERID(name)="MMGETOUT")
exten => 9999,n,Answer
exten => 9999,n,Playback(conf-will-end-in)
exten => 9999,n,Playback(digits/5)
exten => 9999,n,Playback(minutes)
exten => 9999,n,Hangup

[conferences]
;Used by cbEnd script to play end of conference warning
exten => 5555,1,Answer
exten => 5555,n,Wait(3)
exten => 5555,n,CBMysql()
exten => 5555,n,Hangup

[calendar-event]
exten => _*7899,1,Answer
exten => _*7899,2,Playback(${FILE_CALL})
exten => _*7899,3,Wait(2)
exten => _*7899,4,Hangup()

[weather-wakeup]
exten => *61,1,Answer 
exten => *61,2,AGI(nv-weather.php) 
exten => *61,3,Hangup 
exten => *62,1,Answer 
exten => *62,2,AGI(wakeup.php) 
exten => *62,3,Hangup 

[ext-test]
exten => 122,1,AGI(test.php)
exten => 122,n,hangup()

[customivr]
exten => 200,1,AGI(agi://192.168.5.107/customivr)
exten => 200,2,Hangup()


Asterisk.Net Proje Ayarları 

namespace Asterisk.NET.Test
{
class Program
{
const string DEV_HOST = "192.168.5.107";
const int ASTERISK_PORT = 5038;//ami portu karıştırmayın agi portu 4873 tür.
const string ASTERISK_HOST = "192.168.5.100";
        const string ASTERISK_LOGINNAME = "amiuser";
const string ASTERISK_LOGINPWD = "123456";


Ayarları yapıp programı çalıştırdığınızda 200 nolu dahiliyi arayıp ivr akışının örnek projede olduğunu göreceksiniz. Yönetimi bu programla yapabieceğiniz gibi kendi geliştireceğiniz server socket bir programla da yapabilirsiniz.
Agi komutlarına http://www.voip-info.org/wiki/view/Asterisk+AGI den erişebilirsiniz.

Örneği Visual Studio 2005 express ile derledim.



Delphi örneği



25 yorum:

  1. Doğan bey merhaba. Makalenizdeki tüm ayarları yapmama rağmen, Asterisk.NET.Test projesini çalıştırdığımda console ekranında 200,1,agi(agi://" + DEV_HOST + @"/customivr)
    exten => 200,2,Hangup()
    reload Asterisk and dial 200 from phone.
    Also enter 'agi debug' from Asterisk console to more information.
    See CustomIVR.cs and fastagi-mapping.resx to detail.>

    kısma geldiğinde agent devreye girmiyor ve customivr class ın da bulunan annonslar okunmuyor.
    dahdi-channels.conf ın görünümü şu şekilde :

    ;;; line="1 WCTDM/4/0 FXSKS"
    signalling=fxo_ks
    callerid=asreceived
    group=0
    context=from-internal
    channel => 1
    callerid=
    group=
    context=default

    ;;; line="2 WCTDM/4/1 FXSKS"
    signalling=fxo_ks
    callerid=asreceived
    group=0
    context=from-internal
    channel => 2
    callerid=
    group=
    context=default

    ;;; line="3 WCTDM/4/2 FXSKS"
    signalling=fxo_ks
    callerid=asreceived
    group=0
    context=from-internal
    channel => 3
    callerid=
    group=
    context=default

    ;;; line="4 WCTDM/4/3 FXSKS"
    signalling=fxo_ks
    callerid=asreceived
    group=0
    context=from-internal
    channel => 4
    callerid=
    group=
    context=default

    chan-dahdi.conf ın görünümü şu şekilde :

    ; Auto-generated by /usr/sbin/hardware_detector
    [trunkgroups]

    [channels]
    context=from-internal
    signalling=fxo_ks
    rxwink=300 ; Atlas seems to use long (250ms) winks
    usecallerid=yes
    hidecallerid=no
    callwaiting=yes
    usecallingpres=yes
    callwaitingcallerid=yes
    threewaycalling=yes
    transfer=yes
    canpark=yes
    cancallforward=yes
    callreturn=yes
    echocancel=yes
    echocancelwhenbridged=no
    faxdetect=incoming
    echotraining=800
    rxgain=0.0
    txgain=0.0
    callgroup=1
    pickupgroup=1
    relaxdtmf=yes

    ;Uncomment these lines if you have problems with the disconection of your analog lines
    ;busydetect=yes
    ;busycount=3

    immediate=no

    #include dahdi-channels.conf
    #include chan_dahdi_additional.conf

    200 no lu extension ın kullandığı DAHDI Channel =3, context=from-internal, signalling = fxo-ks

    kullandığım kullanıcının profili bu :

    [test]
    secret = bilge
    deny = 0.0.0.0/0.0.0.0
    permit = 127.0.0.1/255.0.0.0
    permit = 10.0.0.22/255.0.0.0
    read = all
    write = all

    Dev_Host olarak, 10.0.0.22 ip adresini kullanıyorum.

    sorun sizce ne olabilir. Teşekkürler..

    YanıtlaSil
  2. doğan bey tüm dediklerinizi yapmama rağmen başarı sağlayamadım nedeni sizce ne olabilir. teşekkürler.

    YanıtlaSil
    Yanıtlar
    1. Bu kütüphane en son asterisk 1.6 destekliyor. asterisk sürümünüz 1.8 olmasın. Ben 1.8 için kütüphanede küçük bir değişiklik yaptım.
      İhtiyacınız olan tek şey ip ayarlarının doğru yapılması. Her iki taraftan ping ile erişim sağladığınıza emin olun.

      Sil
    2. doğan bey asterisk'in 1.8 versiyonunu kullanıyorum ama

      ManagerConnection.cs ve AsteriskVersion.cs class'ın da
      aşağıdaki gibi değişiklikleri yaptım. Değişikliklerden kastettiğiniz bunlar mıdır ?

      ManagerConnection.cs
      if (version.StartsWith("1.4.")) return AsteriskVersion.ASTERISK_1_4; else if (version.StartsWith("1.6.")) return AsteriskVersion.ASTERISK_1_6; else if (version.StartsWith("1.8.")) return AsteriskVersion.ASTERISK_1_8; else throw new ManagerException("Unknown Asterisk version " + version);

      AsteriskVersion.cs
      ASTERISK_1_0 = 10,
      ASTERISK_1_2 = 12,
      ASTERISK_1_4 = 14,
      ASTERISK_1_6 = 16,
      ASTERISK_1_8 = 18

      Sil
    3. Evet. Benzeri bir değişikliği yapıp. Bende durumu geçiştirdim. Size tavsiyem. Sorun yaşamamak için (en azında kafanızda soru işareti olmaz.) Elastixin asteriskin 1.6 versiyonunu içeren bir sürümü ile test etmeniz yönünde olur.

      Sil
  3. Doğan bey, elastix 2.0.0 kurdum, asterisk'in 1.6 versiyonunu kullanıyor ama agi scripti(ivr) hala çalıştırmıyor. extension_custom.conf dosyasında gerekli işlemleri yaptım. asterisk sunucusu ile bağlantı kurabiliyorum. küçük bir santralim var üzerinde 4 extension var (11,12,17,18 nolu numaralara sahip). 11 nolu hattı kullandığım telefona taktım. diğer hatları asteriskin portlarına taktım. extension eklerken generic zap device olarak eklediğimde hattı açmıyor. sip device olarak eklediğimde "The number you have dialed is not in service......" şeklinde anons çıkıyor. extension eklerken dahdi uyumlu zap device olarak eklemem gerekiyor sanırım. ayrıca bu ivr için agi scripti çalıştırmam için inbound yada outbound route tanımlamam veya asteriskin üzerinde ivr da bir değişiklik yapmam gerekiyor mu? aginin çalışıp çalışmadığını nasıl test edebilirim. çıldırmak üzereyim. teşekkürler.

    YanıtlaSil
  4. basitçe arama yapmak için bir sip exten ekleyin ör n 300. x lite gibi bir programla bağlanın.
    include => customivr
    [customivr]
    exten => 200,1,AGI(agi://192.168.5.107/customivr)
    exten => 200,2,Hangup() tanımını yapın. 200 nolu dahili tanımı olmadığına emin olun. .net Projeden customivr tanımını kontrol edin. asterisk reload edin. 300 nolu dahiliden 200 nolu dahiliyi aradığınızda akışın projenize gelmesi gerekli. olmazsa bana yine mesaj atın. size bedeki vmware image elastix ve asterisk.net projesini gönderiyim.

    YanıtlaSil
  5. doğan bey, denedim yine olmadı. "The number you have dialed is not in service......" şeklinde anons çıkıyor. olmadı birde sizin projeden deneyelim. teşekkürler.

    YanıtlaSil
    Yanıtlar
    1. https://docs.google.com/open?id=0B9hOQDVlCkb1RC1sdWUzR1VBVXc

      birde 200 nolu dahiliyi sip olarak ekleyin birde öyle deneyin.

      Sil
    2. doğan bey yine olmadı. ben size ayarlarımın nasıl olduğunu gösteren bir dosya gönderiyorum. kontrol edebilirseniz sevinirim.

      https://docs.google.com/document/d/1wcJZrfsiRcY9_sOLfI2y8-fKhYYSIz2KYb_Nz0-Ickw/edit

      Sil
    3. dökümanda izin yok herhalde ulaşamadım..

      Sil
    4. şuan ulaşabilirsiniz doğan bey..

      Sil
    5. Hızlıca
      customivr tanımını silin..reload yapın.
      [agentlogin] veya diğer feature kodlardan birini test edebilirmisiniz? Bakalım ivr acacakmı ?
      Eğer açarsa 17 nolu dahiliye xlite ile bağlanın çağrı alıyormu diye bakın. alıyorsa customivr tanımları yapın 17 nolu dahilinin context taımını from-pstnden custom ivr yapın. reload edin.
      olmadı ise beni süphelendiren (255.0.0.0) subnet tanımınız oldu. Nasıl bir networkte kurulum yapıyorsunuz bilmiyorum.
      [test]
      secret = bilge
      deny = 0.0.0.0/0.0.0.0
      permit = 127.0.0.1/255.0.0.0
      permit = 10.0.0.7/255.0.0.0

      Sil
    6. doğan bey maalesef yine olmadı. çıkamadım ben bu işin içinden. ivr script çalışmıyor. inbound route tanımlıyorum destination olarak ivr verdiğimde çalışıyor ama o zaman da ivr a hükmedemiyorum. ben size uzak masaüstü bağlantı kullanıcı adı ve şifresini mail olarak atsam bakma ihtimaliniz olur mu doğan bey.

      Sil
    7. Tam kurmak istediğiniz yapıyı bilmediğim için uzaktan bağlanmanın pek faydası olmaz diye düşünüyorum .Ben size musait olduğumda sanal pc ye bir elastix kurup test ettikten sonra göndereyim. Daha faydalı olacaktır.

      Sil
    8. tamam teşekkürler doğan bey

      Sil
    9. doğan bey, tanımlanan extension ların context ini from-pstn yarine customivr yaptığımda macro ya uğruyor ama exten => 17,1,agi(agi://10.0.0.12/customivr) satırını es geçip exten => 17,2,Hangup() satırını çalıştırıyor sadece. scripti çalıştırmada sorun var. izinler le ilgili birşey olabilir mi yada fastagi-mapping.resx de değiştirmem gereken birşey var mı

      Sil
    10. Bu durumu asterisk tarafında debug yaparak gördünüz herhalde. Satır çağrıda agi bağlantısını networkten başlatan kod. Hata burada ise başlarda bahsettiğim network ayarlarınız ve firewall ayarlarlarınız beni şüphelendiriyor.

      Sil
    11. --Starting simple switch on 'DAHDI/1-1'
      --Executing [s@customivr:1] AGI ("DAHDI/1-1", "agi://10.0.0.12/customivr") in new stack
      AGI Tx >> agi_network : yes
      --Executing [s@customivr:2] Wait ("DAHDI/1-1", "3") in new stack
      --Executing [s@customivr:3] :Hangup("DAHDI/1-1","") in new stack
      == Spawn extension (customivr, s, 3) exited non-zero on 'DAHDI/1-1'
      --Hangup 'DAHDI/1-1'

      Doğan bey, arama yaptığımda console da şu şekilde görünüyor ama çağrıya cevap vermiyor. welcome anonsu karşılamıyor beni

      Sil
    12. aynı anda windows tarafında uygulamanız aktif mi ?
      Asterisk sizin uygulamanıza bağlantı kuruyor mu ? Visual studio tarafında debug edebilirmisiz?

      Sil
    13. https://docs.google.com/open?id=0B9hOQDVlCkb1WjdaUVNRbGJadGM resimleri bir inceleyin. Yapmak istediğiniz böyle bir şey ise vmvare image olarak yükleyebilirim.

      Sil
    14. doğan bey yardımınız için teşekkürler hallettim. birşey soracağım ama form application da agi başlatmak için checkfastagi fonksiyonunu kullandığımda formu açmıyor debug modunda bekliyor (arka planda agi çalışıyor istediklerimi yapabiliyorum ama form gözükmüyor) neden olabilir?

      Sil
  6. birde doğan bey fastagi çalışırken customivr scriptine uğrayan bir çağrının console a düşen agi_callerid, agi_calleridname, agi_callingpres, agi_context, agi_extension gibi değişkenlerini kod tarafında nasıl çekebilirim.

    YanıtlaSil
  7. doğan bey herşey için teşekkürler. projemi bitirdim..

    YanıtlaSil