CCS Script Dili ile Uygulama Geliştirme

GENEL BAKIŞ


Creacode SIP Application Server script dili CCS ile kısa sürede gelişmiş çağrı servisleri geliştirilebilir. CCS script dilinin olay güdümlü(event driven) yapısı, SIP çağrılarının, medya bağlantılarının ve veri manipulasyonlarının eş zamanlı işlenebilmesi için kullanımı kolay bir geliştirme ortamı sağlar.

CCS script dilinin syntax ve semantic yapısı C, C#, Javascript gibi bilinen programlama/script dilleriyle büyük oranda benzerlik gösterir. Böylece uygulama geliştirici kısa sürede ve kolayca çağrı servislerini hazır duruma getirebilir.

Çağrı servisi geliştirilirken çağrı durumlarını (örn. yeni çağrı, çalıyor, bağlantı kuruldu) işlemek amacıyla birbirine bağlı bir veya birden çok script dosyası kullanabilir. Script derleyicisi tüm scriptleri derleyerek bir binary dosya yaratır ve bu dosya çok kısa bir süre içinde aktif duruma geçerek, yeni servislerin sistem tekrar baştan başlatılmaksızın çalışması sağlanır.


Script ÖZELLİKLERİ ve ÖRNEK KODLAR


Çağrı akışı bir veya birden çok script dosyası içirisinde işlenebilir.
Çağrı akışı "main" fonksiyonunun bulunduğu script dosyasından başlar. Bu dosya tüm diğer script dosyalarından erişilebilen global değişkenler ve fonksiyonları içerebilir.
Tüm olay blokları "EVENT" önadıyla, tüm fonksiyonlar ise "FUNCTION" önadıyla başlar.
Fonksiyonlar parametre alabilir ve geri dönüş değeri verebilir.
Sistem olayları(system events), ilgili SIP sinyali ulaştığında otomatik olarak tetiklenir.
Kullanıcı olayları(user events), fonksiyon gibi herhangi bir script dosyası içinde tanımlanabilir ve herhangi bir scriptten çağırılabilir. Örneğin, RunScript("QueryDestination.ccs", "MyCustomEvent");
Döngü oluşturmak için "for" ve "while" kullanılabilir. "if" ifade blokları kurulabilir.
Script içinde integer, string, bool ve double veri tipleri kullanılabilir. Yerel değişkenler fonksiyon blokları içinde herhangi bir noktada tanımlanabilir.
 

RADIUS SUNUCU ile Haberleşme

Bir RADIUS sunucu ile bağlantı kurarak AAA(Authentication, Authorization, Accounting) işlemlerini gerçekleştirmek oldukça kolaydır. Standart attribute tipleri ile ilişkili veriler doğrudan aktarılabilir. Örn:

AddRadiusAttr(31, "05327654321");	// RADIUS paketine "Arayan Numara" bilgisinin eklenmesi
AddRadiusAttr(30, "02127654321");	// RADIUS paketine "Aranan Numara" bilgisinin eklenmesi
SendRadiusRequest(1, "192.168.1.10", 1812);	// Authorization paketi olarak gönderilmesi

Örnek authorization paketi gönerimi:

FUNCTION bool AuthorizeUser()
{
	// Standart attributelerin authorization packetine eklenmesi
	AddRadiusAttr(1, "MyUserName");         // User
	AddRadiusAttr(2, "MyPassword");         // Password
	AddRadiusAttr(4, "192.168.1.5");        // Nas Ip Address
	AddRadiusAttr(5, i2str(_SESSION_ID_));  // Nas Port
	AddRadiusAttr(61, "0");                 // Nas Port Type
	AddRadiusAttr(31, "05327654321");       // Calling Id 
	AddRadiusAttr(30, "02127654321");       // Called Id 
	AddRadiusAttr(44, i2str(_SESSION_ID_)); // Acct Session Id
	
	// VSA'ların authorization packetine eklenmesi
	AddRadiusVSAAttr(24, "h323-conf-id=" + g_strh323confid, 9); 

	// RADIUS paketinin Server'a gönderilmesi
	bool bRet = FALSE;
	int iRet = SendRadiusRequest(1, "192.168.1.10", 1812); 
	if (iRet == 0) { // ACCESS_ACCEPT
		// VSA(103) atribute sonuc bilgisini veriyor
		string strReturnCode = GetRadiusVSAAttrValue(103);
		
		if (str2i(strReturnCode) > 0) {
			bRet = FALSE;
		}
		else { 
			// Sonuc basarılı, geri dönen diğer parametrelerin elde edilmesi
			string strCreditTime = GetRadiusVSAAttrValue(102);
			string strBillingModel = GetRadiusVSAAttrValue(109);
			bRet = TRUE;
		}
	}
	if (iRet == 1) { // ACCESS_REJECT
		string strReturnCode = GetRadiusVSAAttrValue(103);
		LOG("Radius reject");
	}
	if (iRet == 2) { // PACKET_SEND_PROBLEM
		LOG("Technical problem occured when sending radius packet!");
	}
	ResetRadius();
	return bRet;
}

WEB Tabanli Bir Uygulama İle Haberleşme

Oturum parametrelerini dış sunucular ile paylaşmanın en kolay yolu, asp/aspx, php, jsp gibi web sayfalarına doğrudan HTTP POST yapılmasıdır. Bu amaçla HTTP arayüzü XML tabanlı veriyi yaratır ve web server üzerindeki sayfaya gönderir. Bu sayede sınırsız sayıda parametrenin dış sunuculara aktarılması ve sonuçlarının alınarak buna göre çağrı akışının yönlendirilmesi sağlanabilir.

Örnek HTTP paketi Gönderme/Alma işlemi:
 
FUNCTION FindDuration()
{
	AddXMLParam("Origination",  "MyUserName");
	AddXMLParam("Destination",  "MyPassword");  
	AddXMLParam("SessionID",  i2str(_SESSION_ID_)); 

	// Send the parameters to web page running on 192.168.1.15
	bool bRet = PostHttpXML("192.168.1.15", "/MyServlet.aspx");
	if (bRet != TRUE) {
		LOG("PostHttpXML Failed. Error Description:" + 
			GetLastRuntimeErrorMessage());
	}
	
	// MyServlet.aspx sayfasından çağrı süresini veren bir parametre dönüyor
	string strDuration = GetXMLParamValue("MaxCallDuration");
	// Bu değer global bir değişkene atanarak çağrı akışına devam edilebilir
	g_nDuration = str2i(strDuration);
	ResetXML(); 
}  
 

Script Derleyici

Script derleyicisi tüm scriptleri derleyerek yeni çağrı akışının aktif duruma geçmesine sağlar. Derleyici, derleme sırasında oluşabilecek tanımlama(definition), tip uyumsuzluğu (type mismatch), fonksiyon veya anahtar kelime(keyword) yazım hatalarını bularak, hatanın oluştuğu script satır numarası ve hata nedeni ile ekrana raporlama yapar. Böylece scripti yazan programcı hemen hatayı düzeltebilir.

  
FUNCTION QueryDestination()
{
	string strMaxCallDuration; 
    
	g_strest = g_strDigits; 
	// g_strest hatalı yazıldı. g_strDest olarak yazılmalıydı
    
	LOG("Everything is ok. Starting the call to " + strDestination);
	StartCall(_LEG_A_, g_strDest); 
	// Eksik parametre girildi
	// Doğru kullanım: StartCall(_LEG_A_, _LEG_B_, g_strDest);

	LOG("Calling " + g_strDigits);
	RunScript("Ringing.ccs");
}

Bu fonksiyon bloğunda 2 hata bulunmaktadır,
  • 1. g_strest değişkeni tanımlı değildir
  • 2. StartCall fonksiyonunda 3. parametre çağırılmamıştır.

    Derleyici çıktısını görmek için tıklayın.


    Script Fonksiyonları ve Olayların Listesi

    Signalling Functions HTTP Messaging String Manupulation Functions
    AcceptCall AddXMLParam strlen
    AcceptCallWithMedia PostHTTPXML str2i
    AnswerCall GetXMLParamValue i2str
    StartCall ResetXML strfind
    RejectCall strleft
    JoinLegs Radius Messaging strright
    SendDigit AddRadiusAttr strmid
    RedirectCall AddRadiusVSAAttr
    EndCall SendRadiusRequest Signalling Events
    ReleaseSession GetRadiusAttrValue EVENT NewCall( )
    GetRadiusVSAAttrValue EVENT CallRinging( )
    Voice Functions ResetRadius EVENT CallRingingWithMedia( )
    OpenAudioChannel EVENT CallReject( )
    CloseAudioChannel VoiceMail Functions EVENT CallAnswered( )
    PlayAudio RecordVoice EVENT CallEstablished( )
    PlayBackgroundAudio RecordnMailVoice EVENT CallActive( )
    StopBackgroundAudio EVENT CallEnd( )
    GetDigits Database Connectivity Functions EVENT OnDigit( )
    PlayCredit ODBCConnect EVENT OnCallChangedByLegA( )
    PlayTime ODBCDisconnect EVENT OnCallChangedByLegB( )
    ODBCExecute
    Utility Functions ODBCExecuteSelect Scripting Events
    ReturnScript ODBCIsEOF EVENT < [TimerFunctionName] >( )
    StartTimer ODBCMoveNext EVENT < [UserEventName] >( )
    GetTime ODBCGetIntField  
    FormatTime ODBCGetDobuleField
    TimeDiff ODBCGetStringField  
    GetDuration  
    Sleep Mathematical Functions  
    GetStatusMsg neg
    LOG rand
    SendMail randHex
    GetRequestHeaderByName
  •