中文字幕无码久久精品,13—14同岁无码A片,99热门精品一区二区三区无码,菠萝菠萝蜜在线观看视频高清1

 
GVOS 8.2 SP1 (ADL)& CT ADE 結(jié)構(gòu)
(一)
 

 

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的例子程序:
  program
  vid_write("I am a VOS program!");
  vid_write("Type any key to exit...");
  kb_get();
  vid_write("Exiting now.");
  endprogram


  為了證明VOS的多任務(wù)運(yùn)行的能力,下面看一個(gè)兩程序并行運(yùn)行的例子。
下面程序在屏幕上顯示一個(gè)簡單的時(shí)鐘,每秒鐘刷新:
  program
   for (;;)
    vid_cur_pos(0, 50);
   vid_print(time() & " " & date());
   sleep(10); # Wait one second
   endfor
  endprogram

  下面在運(yùn)行這兩個(gè)程序的同時(shí)運(yùn)行第三個(gè)程序:
  program
   spawn("clock");
   spawn("hello");
  endprogram

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程序的源代碼如下所示:

  <variable declarations>
  program
    ...any number of statements...
  endprogram
  <onsignal declaration>
  <function declarations>

  <declarations>部分定義了程序中所用的變量和常量。可以包括多個(gè)dec…enddec 塊,這些程序塊可以在endprogram塊的前面或后面,也可在任何endfunc塊的前面或后面。
  一個(gè)完整的VOS程序如下所示:
  dec
    var line : 2;
    const MSG = "C:\MSG\message.vox";
  enddec

  func Message()
    MediaPlayFile(MSG);
  endfunc

 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ù)中均可見:
  dec
   var x : 2;
   var y : 3;
  enddec
  program
   x = 12;
   y = 123;
   y = "Too long"; # y 變成 "Too"
  endprogram

  func suma(a,b)
  dec
   var x:2; <<<< - ----- 編譯錯(cuò)誤
  enddec
   x = a+b;
   return x;
  endfunc

 6.4. 數(shù)組

  數(shù)組是以同一名字(標(biāo)識符)表示的一組字符串。
  一個(gè)數(shù)組是指一個(gè)或多個(gè)變量,這些變量長度相同,名字相同。數(shù)組中不同的變量靠下腳的標(biāo)號來標(biāo)識。比如,有一個(gè)名字為a,包括三個(gè)變量的數(shù)組,如下所示:
  a[1],a[2],a[3]
  這三個(gè)變量可以分別賦值,分別使用。例如:
   a[1] = "Hello";
   x = a[3];
   spk_num(a[2]);

  數(shù)組和變量在相同的地方定義。
  一個(gè)數(shù)組定義的例子如下:
   dec
    var Arr[1..10] : 8;
   enddec

  數(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è)典型的聲明塊如下所示:
  dec
    var <name> : <length>, <name> : <length> ... ;
  …..更多的變量聲明….
    const <name> = <value>, <name> = <value> ... ;
  …..更多的常量聲明….
  enddec


  比如:
  dec
    const MAX_LINES = 24;
  enddec

  定義一個(gè)常量MAX_LINES表示兩個(gè)字符的字符串"24"。
  此定義之后,當(dāng)程序中要使用"24"字符串時(shí),就可以用MAX_LINES代替。
  可以用常量表達(dá)式為常量名賦值,常量表達(dá)式就是由常量字符串、運(yùn)算符和括號(但不能包括函數(shù)調(diào)用)組成的表達(dá)式。例如:

  可以通過-D命令行傳遞給Vlc的常量也可以用于常量表達(dá)式。
  看另一個(gè)常量,
  const LOCAL_AREA_CODE = 415;
  在此定義下,程序中要使用常量415時(shí),就可以用LOCAL_AREA_CODE代替。這種用法有兩個(gè)好處,首先,當(dāng)程序需要改變時(shí),比如程序要在紐約運(yùn)行,即     LOCAL_AREA_CODE要改變,則程序中只需要改動一處:
  const LOCAL_AREA_CODE = 201;

  習(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,即:
   -2147483648 to 2147483647
  因此可以表示所有9位的十進(jìn)制數(shù),但是大部分10位的十進(jìn)制數(shù)都不能表示。也就是任何兩個(gè)9位的十進(jìn)制數(shù)字都可以相加,并且結(jié)果正確,所以
   999999999 + 888888888
  可以得到正確的結(jié)果,但是:
   (999999999*5)/4
  不能得到正確的結(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)算符:

  例如:
   "001" eq "1" True
   "001" streq "1" False !!!
   "*" eq "#" True !!!

 6.9. 賦值運(yùn)算


  運(yùn)算符=(賦值)是一個(gè)特殊的運(yùn)算符。左邊必須是變量(或數(shù)組元素)。右邊可以是任何表達(dá)式。下面是正確的賦值運(yùn)算的例子:
    x = 1;
    Month = 3;
    MonthName = "March";
    TotalSeconds = Hours*3600 + Mins*60 + Secs;

  除此以外還有下列賦值運(yùn)算符:+=,-=,*=和/=。最常用的運(yùn)算符是+=,可以解釋為相加后賦值,例如:
    n+=1;
  表示n加1。先把右邊的表達(dá)式計(jì)算出結(jié)果,此值加左邊的變量。同樣,-=是相減后賦值。因?yàn)榧?和減1的運(yùn)算比較頻繁,所以提供了++和-這兩個(gè)運(yùn)算符,如下所示:
    x++ x加1,(x++)取x加1前的值。
    ++x x加1,(++x)取x加1后的值。
    x-- x減1,(x--)取x減1前的值。
    --x x減1,(--x)取x減1后的值。

  如果只是對一個(gè)變量進(jìn)行加1或減1的運(yùn)算,就不需要考慮運(yùn)算前后的值。比如,下面兩個(gè)運(yùn)算式等價(jià):
    x++;
    ++x;

  這兩個(gè)運(yùn)算結(jié)果相同,如果運(yùn)算的結(jié)果在后續(xù)的運(yùn)算中使用,例如:
    x = 8;
    y = x++; # y=8, x=9
    x = 8;
    y = ++x; # y=9, x=9

  可以看出,計(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è)例子:
    FirstName = "Joe";
    LastName = "Smith";
    FullName = FirstName & " " & LastName;
    FullName的值為"Joe Smith";

  要點(diǎn):
  注意字符串連接是優(yōu)先級比較高的運(yùn)算,當(dāng)與算術(shù)運(yùn)算符一起使用時(shí),可能會出現(xiàn)一些微小的錯(cuò)誤,看下面的例子:
  表達(dá)式:
    x = "Result is " & 2*2;
  的結(jié)果為x="0",這是因?yàn)?amp;的優(yōu)先級比*高,所以先進(jìn)行連接字符串的運(yùn)算:
    x = "Result is 2"*2
  但字符串"Result is 2"轉(zhuǎn)換為數(shù)字時(shí)為0(因?yàn)榈谝粋(gè)字符不是數(shù)字)。所以最終結(jié)果為0*2=0。如果要先進(jìn)行乘法運(yùn)算,可以使用圓括號。
    x = "Result is " & (2*2);

  6.11. 循環(huán)

  循環(huán)就是重復(fù)運(yùn)行一條或多條語句,VOS語言包括三種循環(huán):for,do…until和while。可根據(jù)自己的風(fēng)格選用,任何循環(huán)操作都可以由這三種循環(huán)完成。
  用法如下:

    for (initialize ; test ; increment)
      statements
    endfor

    while ( test )
      statements
    endwhile


  程序中斜體字使用相應(yīng)的代碼:
    statements
  循環(huán)重復(fù)運(yùn)行一條或多條語句,可能運(yùn)行0次或多次。
    initialize
  循環(huán)開始前運(yùn)算的表達(dá)式。在for循環(huán)中,如果不需要可以為空。
    test
  一個(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)。
    increment
  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):
    for (;;)
     # ...
    endfor

  或while循環(huán)實(shí)現(xiàn):
    while (1)
     # ...
    endwhile

  條件真用"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)用的例子:
    vid_write("Hello"); # 內(nèi)置函數(shù)
    MyFunc(); # 用戶定義函數(shù)
    code = Fquery(queue, index); # RLL函數(shù)

  因?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總是返回空字符串。如果返回值在語句中沒有使用。比如:
    vid_write("Hello"); #返回值沒有使用
  VOS忽略返回值。如果返回值有用,返回值可以用在表達(dá)式中。例如,假設(shè)函數(shù)MyFunc需要兩參數(shù),返回一個(gè)數(shù)值,則下列語句為正確的:
    MyFunc(1,2);#忽略返回值
    x=MyFunc(1,2);#返回值賦值給x
    y=x*MyFunc(1,2)+z;#表達(dá)式中使用函數(shù)返回值

  函數(shù)的參數(shù)可以是常量、變量和表達(dá)式,下面語句是正確的:
    MyFunc(1, 2); # 常量
    MyFunc(x, y); # 變量
    MyFunc(z, y+123); # 表達(dá)式
  函數(shù)參數(shù)中的表達(dá)式本身可以包含函數(shù)調(diào)用。類似于VOS語言中的其他特性,VOS允許多重遞歸調(diào)用。

 6.13. 函數(shù)和庫文件

  VOS中有多種管理用戶函數(shù)的方法:函數(shù)文件和庫函數(shù)文件。
  函數(shù)文件一般都是文本文件,文件名為函數(shù)名,擴(kuò)展名為.FUN。例如:
  文件->add.fun
    func add(arg1,arg2)
      return arg1+arg2;
    endfunc

  庫函數(shù)文件的擴(kuò)展名為.vl。這種文件是一組函數(shù)(.FUN)的集合?梢允褂胢kvl命令生成這種庫函數(shù)文件,并可以加密。
   mkvl <fich. Definition> <file lib>
  定義的庫文件為文本文件,含有.FUN文件索引。
    func1.fun
    func2.fun
    \PROJ\FUNCS\LongFunctionName.fun
    E:\SHAREDF\PROJ\OtherLongName.fun

 6.14. 包含文件

  一個(gè)源碼文件可以使用include語句來包含另一個(gè)文件的所有內(nèi)容。這種方式一般用來包含標(biāo)準(zhǔn)的常量定義。例如:
   dec
     include "project.inc"
     var MyVar : 2;
    enddec

 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è)全局變量值改變或等待呼入:
    while (glb_get(0) strneq "NEW" and not TrunkGetState() strneq "Idle"))
      sleep(2);
    endwhile

  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ù)的返回值表示此操作是否成功:
   -1  無效任務(wù)號(此任務(wù)根本沒有激活過)。
   0  任務(wù)被掛起,當(dāng)前的函數(shù)結(jié)束后任務(wù)就終止
   1  無效任務(wù)號(任務(wù)被激活過,但已經(jīng)終止了)。
   其他 任務(wù)立即終止。


  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ò)誤。

 例:
   sem_set(1);
     # Update Critial-Zone
   sem_clear(1);

  共有兩種信號:編號的信號量和命名的信號量。命名的信號量可以通過信號量的名稱來進(jìn)行操作,下面列出了管理命名信號量的函數(shù):

  VOS任務(wù)間使用msg_函數(shù)來傳送字符串消息。
    code = msg_put(pid, string);
    string = msg_get(seconds);
    pid = msg_pid();
    name = msg_sendername()
    msg_flush()

  全局變量是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è)程序或者拒絕呼入。

 

[ 全文英文版 ]

 

 


本文 [ 目錄 ] [ 第一頁 ] [ 第二頁 ] [ 第三頁 ]

融合通信專欄>>技術(shù)開發(fā)>>