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



17 Mayıs 2012 Perşembe

İlk Asterisk.Net C# Örneğimiz...

Evet kütüphane ile ilk denemelerimize başlamak için manager.conf dosyasına kullanıcımızı ekledik.



[amiuser]
secret = 123456
deny=0.0.0.0/0.0.0.0
permit=192.168.1.0/255.255.255.0
read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate

Ekleyeceğim örnek ile santralimiz üzerindeki olayları yakalama ve değerledirmeye başladık. Kontrollere senkron eriştiğime dikkat edin.. 

https://docs.google.com/open?id=0B9hOQDVlCkb1ODlKUkJuVnQ0WGM

14 Mayıs 2012 Pazartesi

Asterisk.Net Projesi


Asteriskde farklı diller iletişim kurmak için geliştirilmiş kütüphaneler mevcuttur.(Java, PHP, Ruby, C#...)

C# için http://sourceforge.net/projects/asterisk-dotnet/ projesi içerisindeki  birçok fonksiyon ve olay size yardımcı olacaktır.

Amacımız bir callcenter arama sistemi geliştirmek olduğu için ilk önce outbound çağrı yapan bir çağrı merkezinde çağrıların ne şekilde oluşturulduğunun bilinmesi gerekir. 

Bunlar;

Preview Dialer : Müşteri bilgisi agent önüne gelir. Agent hazır olduğunda arama işlemi başlatılır. Durum agent yazılımından agenta aktarılır.

Progressive Dialer : Preview dialere çok benzerdir tek farkı arama işlemindeki insiyatifin agentta değil sistemde olmasıdır.

Predictive Dialer : Akıllı arama sistemidir. Çok fazla parametre ile optimize edilmiştir. Çalışma şekli ; Sistem kendisine yüklenen listeyi kendisinde bulunan diğer parametreler ile değerlendirerek, aramayı başlatan arayıcı açılan çağrıyı agenta tüm arama bilgisi ile ekranına göndermesi şeklindedir.

Yukarıdaki arama sistemlerinin hepsini geliştirmek istediğimizi düşünüp Asteriskin yapacağı ortak fonksiyonları düşündüğümüzde bunlar;


  • Agentın bir  tuşa basarak çağrıyı direk başlatması.
  • Agentın bir  tuşa basarak çağrının başlatılması açılırsa aktarmanın yapılması.
  • Sistemin otomatik olarak çağrıyı başlatması bir agenta aktarması.
  • Sistemin otomatik olarak çağrıyı başlatması bir agent grubuna aktarması.
  • Agentların sisteme-gruba-kuyruğa online olması.



İşe Asterisk.Net kütüphanesi ve örneklerini inceleyerek başlayabilirsiniz.


8 Mayıs 2012 Salı

Asterisk AMI & AGI



Nihayetinde Asterisk ile entegre çalışan bir çözüm üzerine gittiğinizde Asteriskin size sunduğu AMI (Asterisk Manager Interface) ve AGI (Asterisk Gateway Interface) arayüzleri size oldukça fayda sağlayacaktır. Bu servisler TCP/IP üzerinden 5038 portu üzerinden çalışan protokol ile sağlanmakta. manager.conf dosyasından kullanıcı adı - şifre ve yetki ayarı yapıldıktan sonra ami ile bağlantı sağlayıp basit komutları deneyebilirsiniz.


http://www.voip-info.org/wiki/view/Asterisk+manager+API sitesinden alıntı

Komutlar

Output from the CLI command show manager commands:
(For Asterisk 1.4 and greater, use manager show commands)

  • AbsoluteTimeout: Set Absolute Timeout (privilege: call,all)
  • ChangeMonitor: Change monitoring filename of a channel (privilege: call,all)
  • Command: Execute Command (privilege: command,all)
  • Events: Control Event Flow
  • ExtensionState: Check Extension Status (privilege: call,all)
  • GetVar: Gets a Channel Variable (privilege: call,all)
  • Hangup: Hangup Channel __(privilege: call,all)
  • IAXpeers: List IAX Peers (privilege: system,all)
  • ListCommands: List available manager commands
  • Logoff: Logoff Manager
  • MailboxCount: Check Mailbox Message Count (privilege: call,all)
  • MailboxStatus: Check Mailbox (privilege: call,all)
  • Monitor: Monitor a channel (privilege: call,all)
  • Originate: Originate Call (privilege: call,all) NOTE: starting from 1.6: originate,all
  • ParkedCalls: List parked calls
  • Ping: Ping
  • QueueAdd: Queues (privilege: agent,all)
  • QueueRemove: Queues (privilege: agent,all)
  • Queues: Queues
  • QueueStatus: Queue Status
  • Redirect: Redirect (privilege: call,all)
  • SetCDRUserField: Set the CDR UserField (privilege: call,all)
  • SetVar: Set Channel Variable (privilege: call,all)
  • SIPpeers: List SIP Peers (chan_sip2 only. Not available in chan_sip as of 9/20/2004) (privilege: system,all)
  • Status: Status (privilege: call,all)
  • StopMonitor: Stop monitoring a channel (privilege: call,all)
  • ZapDialOffhook: Dial over Zap channel while offhook
  • ZapDNDoff: Toggle Zap channel Do Not Disturb status OFF
  • ZapDNDon: Toggle Zap channel Do Not Disturb status ON
  • ZapHangup: Hangup Zap Channel
  • ZapTransfer: Transfer Zap Channel
  • ZapShowChannels: Show Zap Channels

(New?) in Asterisk 1.2.1 (was "CVS HEAD") (Taken from the output of CLI command show manager commands):
  • AgentCallbackLogin: Sets an agent as logged in by callback (Privilege: agent,all)
  • AgentLogoff: Sets an agent as no longer logged in (Privilege: agent,all)
  • Agents: Lists agents and their status (Privilege: agent,all)
  • DBGet: Get DB Entry (Privilege: system,all)
  • DBPut: Put DB Entry (Privilege: system,all)
  • QueuePause: Makes a queue member temporarily unavailable (Privilege: agent,all)
  • SIPshowPeer: Show SIP peer (text format) (Privilege: system,all)

New in Asterisk 1.4.0
  • GetConfig: Display a configuration file, used mainly by AJAM/Asterisk-gui. (Privilege: config,all)
  • PlayDTMF: Play DTMF signal on a specific channel. (Privilege: call,all)
  • UpdateConfig: Updates a configuration file, used mainly by AJAM/Asterisk-gui. (Privilege: config,all)


Available in Asterisk 1.6.0
  • AbsoluteTimeout: Set Absolute Timeout (Priv: system,call,all)
  • AgentLogoff: Sets an agent as no longer logged in (Priv: agent,all)
  • Agents: Lists agents and their status (Priv: agent,all)
  • AGI: Add an AGI command to execute by Async AGI (Priv: call,all)
  • Bridge: Bridge two channels already in the PBX (Priv: call,all)
  • Challenge: Generate Challenge for MD5 Auth (Priv: <none>)
  • ChangeMonitor: Change monitoring filename of a channel (Priv: call,all)
  • Command: Execute Asterisk CLI Command (Priv: command,all)
  • CoreSettings: Show PBX core settings (version etc) (Priv: system,reporting,all)
  • CoreShowChannels: List currently active channels (Priv: system,reporting,all)
  • CoreStatus: Show PBX core status variables (Priv: system,reporting,all)
  • CreateConfig: Creates an empty file in the configuration directory (Priv: config,all)
  • DAHDIDialOffhook: Dial over DAHDI channel while offhook (Priv: <none>)
  • DAHDIDNDoff: Toggle DAHDI channel Do Not Disturb status OFF (Priv: <none>)
  • DAHDIDNDon: Toggle DAHDI channel Do Not Disturb status ON (Priv: <none>)
  • DAHDIHangup: Hangup DAHDI Channel (Priv: <none>)
  • DAHDIRestart: Fully Restart DAHDI channels (terminates calls) (Priv: <none>)
  • DAHDIShowChannels: Show status dahdi channels (Priv: <none>)
  • DAHDITransfer: Transfer DAHDI Channel (Priv: <none>)
  • DBDel: Delete DB Entry (Priv: system,all)
  • DBDelTree: Delete DB Tree (Priv: system,all)
  • DBGet: Get DB Entry (Priv: system,reporting,all)
  • DBPut: Put DB Entry (Priv: system,all)
  • Events: Control Event Flow (Priv: <none>)
  • ExtensionState: Check Extension Status (Priv: call,reporting,all)
  • GetConfigJSON: Retrieve configuration (JSON format) (Priv: system,config,all)
  • GetConfig: Retrieve configuration (Priv: system,config,all)
  • Getvar: Gets a Channel Variable (Priv: call,reporting,all)
  • Hangup: Hangup Channel (Priv: system,call,all)
  • IAXnetstats: Show IAX Netstats (Priv: system,reporting,all)
  • IAXpeerlist: List IAX Peers (Priv: system,reporting,all)
  • IAXpeers: List IAX Peers (Priv: system,reporting,all)
  • ListCategories: List categories in configuration file (Priv: config,all)
  • ListCommands: List available manager commands (Priv: <none>)
  • Login: Login Manager (Priv: <none>)
  • Logoff: Logoff Manager (Priv: <none>)
  • MailboxCount: Check Mailbox Message Count (Priv: call,reporting,all)
  • MailboxStatus: Check Mailbox (Priv: call,reporting,all)
  • MeetmeMute: Mute a Meetme user (Priv: call,all)
  • MeetmeUnmute: Unmute a Meetme user (Priv: call,all)
  • ModuleCheck: Check if module is loaded (Priv: system,all)
  • ModuleLoad: Module management (Priv: system,all)
  • Monitor: Monitor a channel (Priv: call,all)
  • Originate: Originate Call (Priv: originate,all)
  • ParkedCalls: List parked calls (Priv: <none>)
  • Park: Park a channel (Priv: call,all)
  • PauseMonitor: Pause monitoring of a channel (Priv: call,all)
  • Ping: Keepalive command (Priv: <none>)
  • PlayDTMF: Play DTMF signal on a specific channel. (Priv: call,all)
  • QueueAdd: Add interface to queue. (Priv: agent,all)
  • QueueLog: Adds custom entry in queue_log (Priv: agent,all)
  • QueuePause: Makes a queue member temporarily unavailable (Priv: agent,all)
  • QueuePenalty: Set the penalty for a queue member (Priv: agent,all)
  • QueueRemove: Remove interface from queue. (Priv: agent,all)
  • QueueRule: Queue Rules (Priv: <none>)
  • Queues: Queues (Priv: <none>)
  • QueueStatus: Queue Status (Priv: <none>)
  • QueueSummary: Queue Summary (Priv: <none>)
  • Redirect: Redirect (transfer) a call (Priv: call,all)
  • Reload: Send a reload event (Priv: system,config,all)
  • SendText: Send text message to channel (Priv: call,all)
  • Setvar: Set Channel Variable (Priv: call,all)
  • ShowDialPlan: List dialplan (Priv: config,reporting,all)
  • SIPpeers: List SIP peers (text format) (Priv: system,reporting,all)
  • SIPshowpeer: Show SIP peer (text format) (Priv: system,reporting,all)
  • SIPshowregistry: Show SIP registrations (text format) (Priv: system,reporting,all)
  • Status: Lists channel status (Priv: system,call,reporting,all)
  • StopMonitor: Stop monitoring a channel (Priv: call,all)
  • UnpauseMonitor: Unpause monitoring of a channel (Priv: call,all)
  • UpdateConfig: Update basic configuration (Priv: config,all)
  • UserEvent: Send an arbitrary event (Priv: user,all)
  • VoicemailUsersList: List All Voicemail User Information (Priv: call,reporting,all)
  • WaitEvent: Wait for an event to occur (Priv: <none>)

4 Mayıs 2012 Cuma

Elastix Callcenter Modülü 2


Elastix callcenter modülü ile ilgili genel tecrübelerim ve edindiğim fikirler (10 kullanıcılı sistem);

   Bir kampanyayı oluşturup csv ile kayıtları yükledikten sonra bir daha aynı kampanyaya kayıt ekleyememek. (Bunu aşmak için benim gibi dışarıdan bir transfer programı yazabilirsiniz.)

   Belirli bir süre sonra agenta çağrının aktarılması fakat ekrana kayıt bilgilerinin gelmemesi.(Arama servisini restart edip  agentı sistemden çıkartıp tekrar sokmak sorunu kısa süreliğine çözüyor)

   Crm veya Müşteri Veritabanı vb bilgilerinde oluşan hareketleri (satış, anket vb) tekrar update etmek için ters yönlü transfer programı yazabilirsiniz.

   2 haftaya yakın bu şekilde çalışma sonucunda sistemin verimli çalışmadığını düşünüp. Direk master veri tabanından arama yapan arayıcı ve agentların önlerinde client programı geliştirp bunun üzerinden gitmeye karar vermiştim.