1. Dialogic CT ADE
任何CT應(yīng)用的核心都是語音卡。語音卡就是類似于以太網(wǎng)卡或聲卡的一個(gè)PC擴(kuò)展卡,具有語音處理的功能。支持多種PC總線:ISA(16bit,8
Mhz)和PCI(33 MHz)。具有模擬和數(shù)字兩種網(wǎng)絡(luò)接口。模擬接口為RJ-11口,數(shù)字接口為E-1口(EE.UU.
為T1口)或者為ISDN 端口(PRI或BRI)。
另一個(gè)重要的概念是語音總線,語音總線可以使資源共享。語音卡附帶基于C/C++環(huán)境的DLL的API。C/C++語言通常是用于復(fù)雜的底層應(yīng)用開發(fā)的語言(S.O.
, 設(shè)備驅(qū)動程序等等)。C/C++代碼的維護(hù)和編寫都比較容易。
Dialogic的 CT ADE 的基本目的是幫助開發(fā)者縮短開發(fā)流程,它是一種易用、功能齊全、工業(yè)級的軟件開發(fā)環(huán)境。
2. 介紹
CT ADE - 圖形化的 VOS 8.2 SP1,是Dialogic 最新版本的電話應(yīng)用開發(fā)工具。這些工具包括信息流圖產(chǎn)生器,VOS源碼編輯器,VOS源碼編譯器,VOS
源碼單步調(diào)試器和信號量(Simaphore):一個(gè)可以使用任何windows 聲音設(shè)備(比如聲霸卡)的電話線模擬器。所有的這些工具都集成在一個(gè)單一的開發(fā)環(huán)境中:CT
ADE。
2.1 Dialogic 商標(biāo)名稱
Since the acquisition of Dialogic over Parity Software,本產(chǎn)品不斷更新,請參照下表熟悉新的用語:
Graphical VOS-應(yīng)用開發(fā)語言(ADL)
CallSuite - 應(yīng)用開發(fā)Activex組件(ADX)
3. CTADE,第一步:安裝
首先必須安裝 CT ADE,首先把CD(自動運(yùn)行的CD)放入光驅(qū),屏幕上會彈出下列菜單:我們安裝了帶有 CTADE
體系結(jié)構(gòu)引擎的VOS。
4. CTADE,圖形化的VOS
安裝完圖形化的VOS后,可以看到下面的菜單:
接下來必須設(shè)置CTADE_A層,以便可以檢測到系統(tǒng)中安裝的Dialogic驅(qū)動和板卡(R4,S.100, 等等)。CTADE_A可以通過運(yùn)行TopazProfile.exe檢測到Dialogic的設(shè)置。
只要我們做了這樣的檢測(第一次和每次通話設(shè)置改變以后)。就可以使用帶有CTADE_A的圖形化的VOS了。
下面討論Graphical VOS的重要特征以及如何利用此工具得出最佳的結(jié)果。
5. VOS語言參考
5.1 什么是VOS?
VOS(Voice Operative System) 是包括:
·腳本語言
·VOS 語言編譯器
·VOS 代碼運(yùn)行
5.2 第一個(gè)VOS程序
我們先看一個(gè)VOS的例子程序:
為了證明VOS的多任務(wù)運(yùn)行的能力,下面看一個(gè)兩程序并行運(yùn)行的例子。
下面程序在屏幕上顯示一個(gè)簡單的時(shí)鐘,每秒鐘刷新:
下面在運(yùn)行這兩個(gè)程序的同時(shí)運(yùn)行第三個(gè)程序:
6. VOS語言
本章中我們簡要的回顧一下VOS語言的重要的概念。
VOS語言專門用于進(jìn)行呼叫處理,是一種易學(xué)、健壯、運(yùn)行快速的語言。例如,沒有動態(tài)內(nèi)存分配,因此系統(tǒng)不會內(nèi)存不足。VOS語言比VB簡單,更比C/C++簡單得多。
6.1 源代碼
VOS是一種字母大小寫敏感得語言,語言的所有組成部分都區(qū)分大小寫。
源代碼中的注釋可以用"#"字符標(biāo)識(這是一個(gè)所謂的"英鎊"符號,在英語PC中顯示為?
或者非英語PC中顯示為其他特殊符號,ASCII碼為35,十六進(jìn)制為23h)。注釋一直到此行結(jié)束。
除非作為注釋行,否則行結(jié)束符沒有特殊的語法規(guī)定,多條語句可以寫在同一行內(nèi)。但不提倡這樣寫,因?yàn)檫@樣會使源碼難以理解。
一個(gè)VOS程序的源代碼如下所示:
<declarations>部分定義了程序中所用的變量和常量。可以包括多個(gè)dec…enddec 塊,這些程序塊可以在endprogram塊的前面或后面,也可在任何endfunc塊的前面或后面。
一個(gè)完整的VOS程序如下所示:
6.2 數(shù)值
VOS中的所有的數(shù)值都以字符串的形式保存。字符串以雙引號表示,如下所示:
"This is a string "
6.2.1. 數(shù)字值
數(shù)字由十進(jìn)制的字符串表示,例如,123由字符串"123"表示。數(shù)字字符串在書寫時(shí)可以省略雙引號,所有"123"和123表示相同的數(shù)值。
6.2.2. 邏輯值
邏輯值"真"和"假"也是由字符串表示,"假"由空字符串表示,記為"","真"由"1"表示。
6.3 變量
變量名就是一個(gè)字符串,當(dāng)VOS開始運(yùn)行或者重啟時(shí),所有的變量均置為空字符串。
變量長度有限制,如果字符串的長度大于最大長度,則按最大長度取值。如果在調(diào)試模式下運(yùn)行VOS,當(dāng)一個(gè)字符串被截短后會彈出一個(gè)警告信息。(如果要避免這些告警,賦值時(shí)使用substr函數(shù))
為什么要對變量限定最大長度?為什么VOS不運(yùn)行動態(tài)分配內(nèi)存?主要是因?yàn)楹艚刑幚硐到y(tǒng)常常在無人維護(hù)的狀態(tài)下運(yùn)行數(shù)天、數(shù)星期或者數(shù)個(gè)月。設(shè)計(jì)VOS時(shí)避免使用內(nèi)存動態(tài)分配是為了防止內(nèi)存碎片和內(nèi)存不足等問題,這也是為VOS設(shè)計(jì)一種新的語言而不使用現(xiàn)存的語言的原因。
變量在使用前必須聲明(給定變量名和最大長度),變量可以在兩個(gè)地方聲明:主程序運(yùn)行前或者函數(shù)內(nèi)。一個(gè)帶有變量聲明塊的例子程序如下:
此例中定義了兩個(gè)變量:一個(gè)為x,長度為2個(gè)字符,一個(gè)為y,長度為3個(gè)字符。
變量名必須以字母開始,可以包括數(shù)字(0…9)、下劃線(_),變量名長度不限。VOS語言區(qū)分大小寫,所以X和x代表兩個(gè)不同的變量。
必須注意符號表的概念,VOS符號表不分級別,也就是說函數(shù)名是全局的,并且變量名在整個(gè)任務(wù)中均可見:
6.4. 數(shù)組
數(shù)組是以同一名字(標(biāo)識符)表示的一組字符串。
一個(gè)數(shù)組是指一個(gè)或多個(gè)變量,這些變量長度相同,名字相同。數(shù)組中不同的變量靠下腳的標(biāo)號來標(biāo)識。比如,有一個(gè)名字為a,包括三個(gè)變量的數(shù)組,如下所示:
這三個(gè)變量可以分別賦值,分別使用。例如:
數(shù)組和變量在相同的地方定義。
一個(gè)數(shù)組定義的例子如下:
數(shù)組的索引可以使用任何表達(dá)式。
一般來說,數(shù)組定義方式為:
<ArrayName> [ <MinIndex> .. <MaxIndex>
] : <MaxLen>
數(shù)組索引必須在0….255.范圍內(nèi),也就是說<MinIndex>和 <MaxIndex>范圍為0…255。
一個(gè)程序中定義的數(shù)組個(gè)數(shù)不能超過255。
對于更大的數(shù)組,強(qiáng)烈建議使用glb_dimx來實(shí)現(xiàn),使用動態(tài)內(nèi)存分配,以后再討論。
6.5 常量,介紹
常量是指VOS使用的固定值,由字符串表示,字符串通常由雙引號括起來:
"This is a string"
如果字符串中的所有字符都是十進(jìn)制的數(shù)字,則雙引號可以省略,"123"和123表示相同的字符串。注意,由于此規(guī)則,-123表示一個(gè)單一的負(fù)號和一個(gè)常量字符串"123",而"-123"表示一個(gè)長度為4個(gè)字符的常量字符串。
一個(gè)字符串中,后半個(gè)單引號,',具有特殊的意義。符號,',及其隨后的字符的含義如下所示:
序列 此單個(gè)字符在字符串中的意義
'' 單個(gè)后向單引號'
'q 雙引號"
'r 回車(十六進(jìn)制 0x0A)
'n 換行(十六進(jìn)制 0x0D)
't Tab (十六進(jìn)制 0x09)
'xx 十六進(jìn)制字節(jié)xx,比如'09與't相同,但'00非法。
在一個(gè)dec…..enddec塊中,可以為一個(gè)常量取一個(gè)名字。Dec … enddec塊可以放在主程序的前面,這種情況下,所聲明的常量可以在整個(gè)程序中使用。如果Dec
… enddec塊在一個(gè)函數(shù)前面,則所聲明的常量只能在此函數(shù)內(nèi)使用。當(dāng)VOS開始執(zhí)行程序時(shí)和重啟時(shí),所有的變量均設(shè)置為空字符串。
一個(gè)典型的聲明塊如下所示:
比如:
定義一個(gè)常量MAX_LINES表示兩個(gè)字符的字符串"24"。
此定義之后,當(dāng)程序中要使用"24"字符串時(shí),就可以用MAX_LINES代替。
可以用常量表達(dá)式為常量名賦值,常量表達(dá)式就是由常量字符串、運(yùn)算符和括號(但不能包括函數(shù)調(diào)用)組成的表達(dá)式。例如:
可以通過-D命令行傳遞給Vlc的常量也可以用于常量表達(dá)式。
看另一個(gè)常量,
在此定義下,程序中要使用常量415時(shí),就可以用LOCAL_AREA_CODE代替。這種用法有兩個(gè)好處,首先,當(dāng)程序需要改變時(shí),比如程序要在紐約運(yùn)行,即 LOCAL_AREA_CODE要改變,則程序中只需要改動一處:
習(xí)慣上常量名一般使用大寫字母,但VOS或vlc中可以不遵循此慣例。
6.6. 算術(shù)表達(dá)式
VOS中可以使用以下基本算術(shù)表達(dá)式:
運(yùn)算符有不同的優(yōu)先級,例如,乘法的優(yōu)先級比加法高,所以在表達(dá)式A+B*C中,先計(jì)算乘法B*C,乘法結(jié)果再與A相加。可以用園括號(…)改變優(yōu)先級,比如表達(dá)式(A+B)*C中,先計(jì)算加法。
算術(shù)運(yùn)算由VOS采用32位整數(shù)的精度進(jìn)行運(yùn)算。如果結(jié)果中包括10個(gè)或10個(gè)以上十進(jìn)制位,則結(jié)果可能是錯(cuò)誤的。如果數(shù)值的精度超過32位,VOS不會產(chǎn)生警告或錯(cuò)誤的信息。
因?yàn)閂OS內(nèi)部采用32位的精度,VOS中數(shù)值的范圍是-231~231-1,即:
因此可以表示所有9位的十進(jìn)制數(shù),但是大部分10位的十進(jìn)制數(shù)都不能表示。也就是任何兩個(gè)9位的十進(jìn)制數(shù)字都可以相加,并且結(jié)果正確,所以
可以得到正確的結(jié)果,但是:
不能得到正確的結(jié)果,因?yàn)檫\(yùn)算中乘法的結(jié)果超過32位的精度。
6.7.帶小數(shù)點(diǎn)的算術(shù)值
VOS還沒有處理定點(diǎn)或浮點(diǎn)小數(shù)的內(nèi)置函數(shù)?梢悦赓M(fèi)得到支持DOS和Windows的FP RLL,可以提供十進(jìn)制小數(shù)運(yùn)算函數(shù),如fp_add,
fp_sub 等等。
6.8. 邏輯條件
VOS提供了邏輯運(yùn)算符(與,或,非)和關(guān)系運(yùn)算符(大于,小于…),運(yùn)算結(jié)果為邏輯值(true和false),真由"1"表示,假由""表示,兩個(gè)邏輯值的邏輯運(yùn)算符如下:
關(guān)系比較運(yùn)算符:
例如:
6.9. 賦值運(yùn)算
運(yùn)算符=(賦值)是一個(gè)特殊的運(yùn)算符。左邊必須是變量(或數(shù)組元素)。右邊可以是任何表達(dá)式。下面是正確的賦值運(yùn)算的例子:
除此以外還有下列賦值運(yùn)算符:+=,-=,*=和/=。最常用的運(yùn)算符是+=,可以解釋為相加后賦值,例如:
表示n加1。先把右邊的表達(dá)式計(jì)算出結(jié)果,此值加左邊的變量。同樣,-=是相減后賦值。因?yàn)榧?和減1的運(yùn)算比較頻繁,所以提供了++和-這兩個(gè)運(yùn)算符,如下所示:
如果只是對一個(gè)變量進(jìn)行加1或減1的運(yùn)算,就不需要考慮運(yùn)算前后的值。比如,下面兩個(gè)運(yùn)算式等價(jià):
這兩個(gè)運(yùn)算結(jié)果相同,如果運(yùn)算的結(jié)果在后續(xù)的運(yùn)算中使用,例如:
可以看出,計(jì)算結(jié)果中y的值不同,如果用戶感到類似+=、++等運(yùn)算比較容易混淆,可以不使用它們,使用=運(yùn)算符也可以達(dá)到相同的結(jié)果。如果你是C語言程序員,就會發(fā)現(xiàn)這些運(yùn)算符比較方便。
6.10. 字符串連接
&運(yùn)算符將其左右的兩個(gè)字符串合在一起,連成一個(gè)字符串,稱為字符串連接。例如,"A"
& "B"的結(jié)果是"AB"?戳硪粋(gè)例子:
要點(diǎn):
注意字符串連接是優(yōu)先級比較高的運(yùn)算,當(dāng)與算術(shù)運(yùn)算符一起使用時(shí),可能會出現(xiàn)一些微小的錯(cuò)誤,看下面的例子:
表達(dá)式:
的結(jié)果為x="0",這是因?yàn)?amp;的優(yōu)先級比*高,所以先進(jìn)行連接字符串的運(yùn)算:
但字符串"Result is 2"轉(zhuǎn)換為數(shù)字時(shí)為0(因?yàn)榈谝粋(gè)字符不是數(shù)字)。所以最終結(jié)果為0*2=0。如果要先進(jìn)行乘法運(yùn)算,可以使用圓括號。
6.11. 循環(huán)
循環(huán)就是重復(fù)運(yùn)行一條或多條語句,VOS語言包括三種循環(huán):for,do…until和while。可根據(jù)自己的風(fēng)格選用,任何循環(huán)操作都可以由這三種循環(huán)完成。
用法如下:
程序中斜體字使用相應(yīng)的代碼:
循環(huán)重復(fù)運(yùn)行一條或多條語句,可能運(yùn)行0次或多次。
循環(huán)開始前運(yùn)算的表達(dá)式。在for循環(huán)中,如果不需要可以為空。
一個(gè)邏輯條件,每次循環(huán)都檢查邏輯結(jié)果,決定是否進(jìn)行后面的循環(huán)操作。For和while-loop循環(huán)中,每次循環(huán)前檢查條件,如果結(jié)果為真,則繼續(xù)循環(huán),如果第一次檢查結(jié)果就為假,則循環(huán)的語句永遠(yuǎn)不會運(yùn)行。Do…until循環(huán)中,循環(huán)操作一直運(yùn)行,直到條件成立。For循環(huán)中,此條件可以為空,這種情況下條件永遠(yuǎn)為真,循環(huán)操作永遠(yuǎn)進(jìn)行,或者通過goto,jump或return語句退出循環(huán)。
for循環(huán)中,每次循環(huán)后計(jì)算此表達(dá)式,如果第一次test條件為假,則此表達(dá)式永遠(yuǎn)不會執(zhí)行。For循環(huán)中,此處可以為空。
最常見的循環(huán)是變量從1開始,直到上限,即最大值。下面循環(huán)使用變量n計(jì)算1+2+….+Max的和,
無窮循環(huán)(或通過break退出)可以用for循環(huán)實(shí)現(xiàn):
或while循環(huán)實(shí)現(xiàn):
條件真用"1"表示,所以條件永遠(yuǎn)為真。
6.12. 函數(shù)調(diào)用
一個(gè)函數(shù)是指一組語句序列,具有函數(shù)名和返回值。一個(gè)函數(shù)可以有一個(gè)或多個(gè)參數(shù)。參數(shù)在函數(shù)內(nèi)可以當(dāng)作變量一樣使用,但不能為其賦值。
VOS中有三種函數(shù):
- 內(nèi)置函數(shù)。這些函數(shù)是固化到VOS和vlc中的函數(shù),因此程序中總可以使用這種函數(shù)。
- 用戶定義函數(shù)。用VOS源碼編寫的程序。
- RLL程序。這些函數(shù)是用C或C++編寫的。以二進(jìn)制文件的格式載入,稱為運(yùn)行連接庫(RLL)。DOS中,RLL是駐留內(nèi)存程序,Windows中,RLL是動態(tài)連接庫(DLL)。
這三種函數(shù)的調(diào)用方式完全一樣,調(diào)用方式是函數(shù)名,后面為括號中的參數(shù),參數(shù)由逗號分開。即使函數(shù)沒有參數(shù),括號也不能省略。下面是一些函數(shù)調(diào)用的例子:
因?yàn)橛梅◣缀跸嗤,所以不能從調(diào)用方式中區(qū)分內(nèi)置函數(shù)、用戶自定義函數(shù)和RLL函數(shù)。
一個(gè)表達(dá)式中含有函數(shù)名時(shí),先執(zhí)行函數(shù)(調(diào)用函數(shù)),得到返回值,表達(dá)式中使用函數(shù)返回值。
所有的函數(shù)都有返回值,如果函數(shù)中沒有指定返回值,則返回空字符串(不包含字符的字符串"");許多函數(shù)都不返回有用的返回值,比如vid_write總是返回空字符串。如果返回值在語句中沒有使用。比如:
VOS忽略返回值。如果返回值有用,返回值可以用在表達(dá)式中。例如,假設(shè)函數(shù)MyFunc需要兩參數(shù),返回一個(gè)數(shù)值,則下列語句為正確的:
函數(shù)的參數(shù)可以是常量、變量和表達(dá)式,下面語句是正確的:
函數(shù)參數(shù)中的表達(dá)式本身可以包含函數(shù)調(diào)用。類似于VOS語言中的其他特性,VOS允許多重遞歸調(diào)用。
6.13. 函數(shù)和庫文件
VOS中有多種管理用戶函數(shù)的方法:函數(shù)文件和庫函數(shù)文件。
函數(shù)文件一般都是文本文件,文件名為函數(shù)名,擴(kuò)展名為.FUN。例如:
文件->add.fun
庫函數(shù)文件的擴(kuò)展名為.vl。這種文件是一組函數(shù)(.FUN)的集合?梢允褂胢kvl命令生成這種庫函數(shù)文件,并可以加密。
mkvl <fich. Definition> <file lib>
定義的庫文件為文本文件,含有.FUN文件索引。
6.14. 包含文件
一個(gè)源碼文件可以使用include語句來包含另一個(gè)文件的所有內(nèi)容。這種方式一般用來包含標(biāo)準(zhǔn)的常量定義。例如:
6.15. 內(nèi)部函數(shù)
VOS包含了眾多的內(nèi)置函數(shù),這一部分我們對重要的一些函數(shù)組進(jìn)行簡要地介紹:
6.15.1. 數(shù)據(jù)庫函數(shù)
db_函數(shù)支持dBase兼容的DBF數(shù)據(jù)庫以及Clipper兼容的NTX索引。程序運(yùn)行中可以打開和關(guān)閉數(shù)據(jù)庫,一個(gè)任務(wù)可以同時(shí)打開多個(gè)數(shù)據(jù)庫。支持多用戶文件和記錄表鎖定?梢酝ㄟ^RLL操作其他類型數(shù)據(jù)庫,操作細(xì)節(jié)隨操作系統(tǒng)不同而變化。
建議使用我們的數(shù)據(jù)庫操作RLL,象可用于任何系統(tǒng)的AdoRll。AdoRll可以通過SQL語句操作數(shù)據(jù)庫服務(wù)器(Informix,Oracle,SQLServer等等)。
6.15.2. 串口通信
ser_ functions支持通過COM1~COM4的RS-232串行通信。
6.15.3. 任務(wù)管理
有許多任務(wù)管理的內(nèi)置函數(shù),包括spawn,chain,exec,arg,getpid和kill。
6.15.4. 任務(wù)間通信
VOS提供了任務(wù)間通信的四種方法:全局變量 (glb_functions),信號量 (sem_ functions),
消息 (msg_ functions)和 分組 (grp_functions)。
在手冊中后面介紹這些方法。
6.15.5. 字符串處理
有許多種處理字符串的函數(shù),包括length,substr和許多其他的函數(shù),參照字符串函數(shù)。
6.15.6. 屏幕和鍵盤
vid_和kb_函數(shù)提供了簡單的屏幕輸出和用戶輸入的方式。在Windows下,你也許想要制作圖形用戶界面,可以通過使用NetHub
ActiveX組件在Visual Basic,Delphi,Visual C++或其他Windows可視化工具下制作用戶界面。
6.16. 外部函數(shù)
VOS的所以外部函數(shù)都是在C/C++下開發(fā)的。這些函數(shù)是帶有特殊入口的DLL。VOS通過入口調(diào)用DLL的內(nèi)部函數(shù)。我們常稱這些DLL為RLL(運(yùn)行連接庫)。我們提供了C/C++開發(fā)包,用戶可以使用任何Windows的C/C++編譯器(Visual
C++,Borland C++,C++ Builder等等)開發(fā)自己的RLL。
下面介紹一些最常用的RLL。
6.16.1. NetHub Plus RLL
NetHub Plus是一個(gè)企業(yè)化的組件,它支持進(jìn)程中線程間的通信,這些進(jìn)程包括PC中單個(gè)進(jìn)程或局域網(wǎng)以及廣域網(wǎng)上節(jié)點(diǎn)中的單個(gè)進(jìn)程。
NetHub Plus既可以作為ActiveX控件使用,又可以作為VOS RLL使用。
NetHub Plus的一個(gè)例程可以與NetHub Plus的一個(gè)或多個(gè)其他例程通信,這些例程可以是在同一臺PC上或同一網(wǎng)絡(luò)上。
VOS RLL為每一個(gè)VOS任務(wù)載入一個(gè)單獨(dú)的NetHub Plus ActiveX組件例程。
消息
NetHub Plus的任何例程之間都可以收發(fā)消息。消息是一個(gè)字符串,最大長度為127的字符,可以通過MsgGet方法接收,或者通過MessageReceived事件接收。
信號量(Semaphore)
可以使用信號量來保護(hù)共享資源和代碼的關(guān)鍵部分。一個(gè)信號量是一種特殊的變量,有兩種可能值:設(shè)置或清楚。如果一個(gè)NetHub
Plus例程設(shè)置了一個(gè)信號量,直到這個(gè)例程清除,其他的例程都不能設(shè)置。信號量只能由設(shè)置它的例程清除。
共享的網(wǎng)絡(luò)變量
共享網(wǎng)絡(luò)變量包含網(wǎng)絡(luò)上任何NetHub Plus的例程都可以訪問的數(shù)據(jù)。網(wǎng)絡(luò)變量由變量名和索引號組成。索引與數(shù)組下標(biāo)相似。共享的網(wǎng)絡(luò)變量的最大長度為127個(gè)字符。
信號量(Semaphores)和網(wǎng)絡(luò)變量都由名字區(qū)分,名字是一個(gè)長度為1到127的字符串。第一個(gè)字符必須是字母或下劃線,其他的字符可以是字母、下劃線或數(shù)字。
6.16.2. Ado RLL
ADORLL是一種可以通過ADO或者ODBC可以直接訪問數(shù)據(jù)庫服務(wù)器的RLL。
強(qiáng)烈建議使用ADO Ole DB提供連接 ,盡量不要使用ODBC提供連接,因?yàn)榉(wěn)定性和性能都不太好。
6.16.3. Socket RLL
IP網(wǎng)絡(luò)上運(yùn)行的VOS任務(wù)可以通過Sockets RLL交換消息,IP網(wǎng)可以是企業(yè)內(nèi)部網(wǎng)、因特網(wǎng)、運(yùn)行TCP/IP的Novell網(wǎng)或任何支持IP的其他網(wǎng)絡(luò)。
RLL只是支持Windows NT,不支持Windows 9x。
缺省Socket RLL使用端口2222(十六進(jìn)制 0x08AE),可以通過 ws_SetRemotePort函數(shù)來改變連接端口號。
6.16.4. Web RLL
WebRLL是VOS的一個(gè)運(yùn)行連接庫(RLL)。
WebRLL提供函數(shù),可以使VOS程序:
·從一個(gè)Web服務(wù)器獲得文檔
·從獲得的網(wǎng)頁中獲得數(shù)據(jù)(例如一個(gè)電子商務(wù)服務(wù)器)
·通過FTP協(xié)議發(fā)送和接收文件
6.17. 多任務(wù)
VOS可以同時(shí)運(yùn)行多行語句,VOS有自己的多線程引擎來管理每一個(gè)任務(wù)。一個(gè)單通道的VOS應(yīng)用程序如下:
上圖中是一個(gè)簡單的單通道VOS任務(wù),如果想用這個(gè)程序來管理4個(gè)通道,我們只有采用下面方式:
VOS內(nèi)部同時(shí)運(yùn)行4個(gè)任務(wù)。開始只有一個(gè)任務(wù),此任務(wù)產(chǎn)生了4個(gè)任務(wù),各任務(wù)間互相傳遞參數(shù)(通道號)。函數(shù)arg(1)檢索參數(shù)個(gè)數(shù)1,這種情況下,arg()是通道號碼。
可以使用兩種方法來產(chǎn)生VOS任務(wù):同步和異步。異步產(chǎn)生任務(wù)采用:
task_nr = spawn(filename[, arg, arg...])
同步產(chǎn)生任務(wù)采用:
string = exec(program_name[, arg, arg...])
6.18. 任務(wù)管理
從前面幾章可以看出,VOS能夠?yàn)槎嗤ǖ缿?yīng)用同時(shí)管理多個(gè)任務(wù)或者運(yùn)行后臺任務(wù),任何任務(wù)都有自己的一組變量和數(shù)組以及自己的執(zhí)行路徑。
下面介紹管理VOS任務(wù)的一些基本概念
6.18.1. 任務(wù)號
每一個(gè)運(yùn)行的任務(wù)都有一個(gè)唯一的任務(wù)號,任務(wù)號也稱為進(jìn)程號(pid),這是從UNIX的術(shù)語中得來的,UNIX中任務(wù)也稱為進(jìn)程。Getpid函數(shù)返回當(dāng)前任務(wù)的任務(wù)號,例如:
my_task_nr=getpid();
6.18.2任務(wù)掛起
使用函數(shù)sleep可以隨時(shí)掛起當(dāng)前任務(wù)。參數(shù)是任務(wù)重新運(yùn)行所需要等待的時(shí)間,單位為0.1秒。例如:
sleep(50); # 等待5秒鐘
掛起時(shí)間必須小于12個(gè)小時(shí),即小于432000。
掛起的任務(wù)不占用任何處理器資源(VOS v5或更高版本)。這就意味著輪循所產(chǎn)生的性能問題可以通過短時(shí)間掛起循環(huán)操作來消除。例如,如果一個(gè)任務(wù)在等待一個(gè)全局變量值改變或等待呼入:
6.18.3. 終止任務(wù)
可以使用kill函數(shù)來終止一個(gè)任務(wù),kill函數(shù)用任務(wù)號作為參數(shù):
kill(condemned_task_nr);
執(zhí)行此函數(shù)后任務(wù)馬上就會終止,除非任務(wù)已被掛起,在等待內(nèi)置函數(shù)的結(jié)束,例如sleep、sem_set、sc_play等函數(shù)。在任務(wù)被掛起的情況下,任務(wù)會在當(dāng)前的內(nèi)置函數(shù)結(jié)束后終止。
Kill函數(shù)的返回值表示此操作是否成功:
6.18.4. 信號量、消息和全局變量
VOS提供的多任務(wù)環(huán)境中,通常情況下各任務(wù)獨(dú)立地運(yùn)行。有時(shí),任務(wù)之間需要調(diào)整它們之間地活動或交換信息。
VOS提供了三種任務(wù)間通信的函數(shù):
·信號量(Semaphores)
·消息
·全局變量
信號量(Semaphores)通常管理代碼的關(guān)鍵部分,所謂關(guān)鍵部分就是指一組語句序列,如果兩個(gè)任務(wù)同時(shí)運(yùn)行這部分代碼時(shí),會產(chǎn)生錯(cuò)誤。
例:
共有兩種信號:編號的信號量和命名的信號量。命名的信號量可以通過信號量的名稱來進(jìn)行操作,下面列出了管理命名信號量的函數(shù):
VOS任務(wù)間使用msg_函數(shù)來傳送字符串消息。
全局變量是VOS任務(wù)間共享信息的一種非常有用的方式,采用全局變量的函數(shù)如下所示:
全局變量
glb_get value = glb_get(num)
取得給定全局變量號碼的當(dāng)前值。
glb_set glb_set(num, string)
設(shè)定全局變量為給定得字符串。
命名的全局變量
glb_clrallx glb_clrallx(Name)
設(shè)置全局變量所有值為空字符串。
glb_decx glb_decx(Name[,Index1, ...])
一個(gè)命名的全局變量值減去1。
glb_dimx glb_dimx(Name[,Lower1,Upper1, ...] [,MaxLength])
產(chǎn)生一個(gè)新的命名全局變量。
glb_getsizex glb_getsizex(Name)
返回指定的全局變量的最大長度。
glb_getx glb_getx(Name[,Index1, ...])
取得一個(gè)命名全局變量的值。
glb_incx glb_incx(Name[,Index1, ...])
命名全局變量的值加1。
glb_lowerx glb_lowerx(Name[,DimNr])
返回變量某一維索引的下限。
glb_nrdimsx glb_nrdimsx(Name)
返回全局變量的維數(shù)。標(biāo)量返回0,矢量返回1,矩陣返回2等等。
glb_rangex glb_rangex(Name[,DimNr])
返回變量某一維索引的范圍(若沒有給定,則取0)。
glb_setallx glb_setallx(Name, Value)
將某個(gè)全局變量的所有字符串設(shè)置為給定值。
glb_setx glb_setx(Name[,Index1, ...], Value)
將某全局變量的某字符串設(shè)置為給定值。
glb_upperx glb_upperx(Name[,DimNr])
返回變量某維索引的上限。
6.19. 日期與時(shí)間函數(shù)
IVR系統(tǒng)中的任務(wù)常常使用日期和時(shí)間(比如,呼叫的時(shí)間)。VOS的日期和時(shí)間函數(shù)如下所示:
6.20. 字符串函數(shù)
6.21. 文件和目錄函數(shù)(fil_,dir_)
VOS提供了許多讀寫、查找文件和目錄的內(nèi)置函數(shù),任何可以通過命令行查看的文件,包括網(wǎng)絡(luò)服務(wù)器文件,都可以通過這些函數(shù)來訪問。
6.22 圖形化VOS,介紹
第一次運(yùn)行圖形化的VOS時(shí),會看到如下界面:
首先介紹一個(gè)新的概念――項(xiàng)目(PROJECT),對于使用VOS早期版本的開發(fā)者來說,這是一個(gè)新的東西,像市場上許多其他的編程工具(Visual
Basic,Visual C,Borland C++Builder,等等)一樣,一個(gè)Project包含應(yīng)用程序必須的所有文件。一個(gè)VOS的Project包括:
·VOS源代碼(.VS)
·信息流表(Flow Charts)(.flw)
·與項(xiàng)目相關(guān)的RLL
·INC,F(xiàn)UN,DEC,VL文件
VOS源代碼文件是使用VOS語言編寫的文本文件。VOS源代碼文件通過如下格式加入文件夾Application中的項(xiàng)目中:Application+Vos源代碼文件名:
在每一個(gè)文件夾中都有包含文件(.inc),函數(shù)文件(.fun),declaration文件和函數(shù)庫文件(.vl)的索引。
信息流表文件指信息流表格的CTI應(yīng)用。例如:
6.23. 圖形化VOS,第一步
下面,創(chuàng)建一個(gè)新的VOS項(xiàng)目(Project)來了解一下設(shè)置過程,創(chuàng)建一個(gè)新的VOS項(xiàng)目后,可以得到一個(gè)文件夾名為master。
非常重要提示。!永遠(yuǎn)不要刪除程序master的索引,因?yàn)檫@是VOS要求的!
這一步完成后,我們可以使用File菜單中的New函數(shù)來添加、刪除、編輯信息流表和VOS應(yīng)用。
6.24. 圖形化VOS,基本配置
首先配置系統(tǒng)的中繼線(菜單 Project->設(shè)置中繼)。在中繼設(shè)置主窗口中,有一個(gè)TrunkConfiguration
選項(xiàng)卡。本選項(xiàng)卡用來設(shè)置每一通道應(yīng)用及其相關(guān)程序類型。共有3種程序:
1. 固定的:確實(shí)的類型的程序。當(dāng)有站內(nèi)呼叫通過此通道。VOS執(zhí)行此程序。
2. ANI:對于選定的通道,VOS執(zhí)行"ANI Phone Number"選項(xiàng)中設(shè)置的應(yīng)用
程序。
3. DNIS:對于選定的通道,VOS執(zhí)行"DNIS Phone Number"選項(xiàng)中設(shè)置的應(yīng)
用程序。
ANI和DNIS 選項(xiàng)卡用來設(shè)置ANI和DNIS控制執(zhí)行的應(yīng)用程序,一個(gè)典型的例子就是不同DNIS下不同業(yè)務(wù)的900語言文本系統(tǒng)。
對于其他的DNIS或ANIS(沒有列出),可以關(guān)聯(lián)一個(gè)程序或者拒絕呼入。
[ 全文英文版 ]
|