• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
     
    GVOS 8.2 SP1 (ADL)& CT ADE 結構
    (一)
     

     

    1. Dialogic CT ADE

      任何CT應用的核心都是語(yǔ)音卡。語(yǔ)音卡就是類(lèi)似于以太網(wǎng)卡或聲卡的一個(gè)PC擴展卡,具有語(yǔ)音處理的功能。支持多種PC總線(xiàn):ISA(16bit,8 Mhz)和PCI(33 MHz)。具有模擬和數字兩種網(wǎng)絡(luò )接口。模擬接口為RJ-11口,數字接口為E-1口(EE.UU. 為T(mén)1口)或者為ISDN 端口(PRI或BRI)。
      另一個(gè)重要的概念是語(yǔ)音總線(xiàn),語(yǔ)音總線(xiàn)可以使資源共享。語(yǔ)音卡附帶基于C/C++環(huán)境的DLL的API。C/C++語(yǔ)言通常是用于復雜的底層應用開(kāi)發(fā)的語(yǔ)言(S.O. , 設備驅動(dòng)程序等等)。C/C++代碼的維護和編寫(xiě)都比較容易。
      Dialogic的 CT ADE 的基本目的是幫助開(kāi)發(fā)者縮短開(kāi)發(fā)流程,它是一種易用、功能齊全、工業(yè)級的軟件開(kāi)發(fā)環(huán)境。

    2. 介紹

      CT ADE - 圖形化的 VOS 8.2 SP1,是Dialogic 最新版本的電話(huà)應用開(kāi)發(fā)工具。這些工具包括信息流圖產(chǎn)生器,VOS源碼編輯器,VOS源碼編譯器,VOS 源碼單步調試器和信號量(Simaphore):一個(gè)可以使用任何windows 聲音設備(比如聲霸卡)的電話(huà)線(xiàn)模擬器。所有的這些工具都集成在一個(gè)單一的開(kāi)發(fā)環(huán)境中:CT ADE。

     2.1 Dialogic 商標名稱(chēng)

      Since the acquisition of Dialogic over Parity Software,本產(chǎn)品不斷更新,請參照下表熟悉新的用語(yǔ):
    Graphical VOS-應用開(kāi)發(fā)語(yǔ)言(ADL)
    CallSuite - 應用開(kāi)發(fā)Activex組件(ADX)

    3. CTADE,第一步:安裝


      首先必須安裝 CT ADE,首先把CD(自動(dòng)運行的CD)放入光驅?zhuān)聊簧蠒?huì )彈出下列菜單:我們安裝了帶有 CTADE 體系結構引擎的VOS。

    4. CTADE,圖形化的VOS

      安裝完圖形化的VOS后,可以看到下面的菜單:

      接下來(lái)必須設置CTADE_A層,以便可以檢測到系統中安裝的Dialogic驅動(dòng)和板卡(R4,S.100, 等等)。CTADE_A可以通過(guò)運行TopazProfile.exe檢測到Dialogic的設置。
      只要我們做了這樣的檢測(第一次和每次通話(huà)設置改變以后)。就可以使用帶有CTADE_A的圖形化的VOS了。
      下面討論Graphical VOS的重要特征以及如何利用此工具得出最佳的結果。

    5. VOS語(yǔ)言參考


     5.1 什么是VOS?

      VOS(Voice Operative System) 是包括:
      ·腳本語(yǔ)言
      ·VOS 語(yǔ)言編譯器
      ·VOS 代碼運行

     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ù)運行的能力,下面看一個(gè)兩程序并行運行的例子。
    下面程序在屏幕上顯示一個(gè)簡(jiǎn)單的時(shí)鐘,每秒鐘刷新:
      program
       for (;;)
        vid_cur_pos(0, 50);
       vid_print(time() & " " & date());
       sleep(10); # Wait one second
       endfor
      endprogram

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

    6. VOS語(yǔ)言

      本章中我們簡(jiǎn)要的回顧一下VOS語(yǔ)言的重要的概念。
      VOS語(yǔ)言專(zhuān)門(mén)用于進(jìn)行呼叫處理,是一種易學(xué)、健壯、運行快速的語(yǔ)言。例如,沒(méi)有動(dòng)態(tài)內存分配,因此系統不會(huì )內存不足。VOS語(yǔ)言比VB簡(jiǎn)單,更比C/C++簡(jiǎn)單得多。

     6.1 源代碼

      VOS是一種字母大小寫(xiě)敏感得語(yǔ)言,語(yǔ)言的所有組成部分都區分大小寫(xiě)。
      源代碼中的注釋可以用"#"字符標識(這是一個(gè)所謂的"英鎊"符號,在英語(yǔ)PC中顯示為? 或者非英語(yǔ)PC中顯示為其他特殊符號,ASCII碼為35,十六進(jìn)制為23h)。注釋一直到此行結束。
      除非作為注釋行,否則行結束符沒(méi)有特殊的語(yǔ)法規定,多條語(yǔ)句可以寫(xiě)在同一行內。但不提倡這樣寫(xiě),因為這樣會(huì )使源碼難以理解。
    一個(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 數值

      VOS中的所有的數值都以字符串的形式保存。字符串以雙引號表示,如下所示:
    "This is a string "

      6.2.1. 數字值

      數字由十進(jìn)制的字符串表示,例如,123由字符串"123"表示。數字字符串在書(shū)寫(xiě)時(shí)可以省略雙引號,所有"123"和123表示相同的數值。

      6.2.2. 邏輯值

      邏輯值"真"和"假"也是由字符串表示,"假"由空字符串表示,記為"","真"由"1"表示。

     6.3 變量

      變量名就是一個(gè)字符串,當VOS開(kāi)始運行或者重啟時(shí),所有的變量均置為空字符串。
      變量長(cháng)度有限制,如果字符串的長(cháng)度大于最大長(cháng)度,則按最大長(cháng)度取值。如果在調試模式下運行VOS,當一個(gè)字符串被截短后會(huì )彈出一個(gè)警告信息。(如果要避免這些告警,賦值時(shí)使用substr函數)

      為什么要對變量限定最大長(cháng)度?為什么VOS不運行動(dòng)態(tài)分配內存?主要是因為呼叫處理系統常常在無(wú)人維護的狀態(tài)下運行數天、數星期或者數個(gè)月。設計VOS時(shí)避免使用內存動(dòng)態(tài)分配是為了防止內存碎片和內存不足等問(wèn)題,這也是為VOS設計一種新的語(yǔ)言而不使用現存的語(yǔ)言的原因。
      變量在使用前必須聲明(給定變量名和最大長(cháng)度),變量可以在兩個(gè)地方聲明:主程序運行前或者函數內。一個(gè)帶有變量聲明塊的例子程序如下:

      此例中定義了兩個(gè)變量:一個(gè)為x,長(cháng)度為2個(gè)字符,一個(gè)為y,長(cháng)度為3個(gè)字符。
      變量名必須以字母開(kāi)始,可以包括數字(0…9)、下劃線(xiàn)(_),變量名長(cháng)度不限。VOS語(yǔ)言區分大小寫(xiě),所以X和x代表兩個(gè)不同的變量。

      必須注意符號表的概念,VOS符號表不分級別,也就是說(shuō)函數名是全局的,并且變量名在整個(gè)任務(wù)中均可見(jiàn):
      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; <<<< - ----- 編譯錯誤
      enddec
       x = a+b;
       return x;
      endfunc

     6.4. 數組

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

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

      數組的索引可以使用任何表達式。
      一般來(lái)說(shuō),數組定義方式為:
      <ArrayName> [ <MinIndex> .. <MaxIndex> ] : <MaxLen>
      數組索引必須在0….255.范圍內,也就是說(shuō)<MinIndex>和 <MaxIndex>范圍為0…255。
      一個(gè)程序中定義的數組個(gè)數不能超過(guò)255。
      對于更大的數組,強烈建議使用glb_dimx來(lái)實(shí)現,使用動(dòng)態(tài)內存分配,以后再討論。

     6.5 常量,介紹


      常量是指VOS使用的固定值,由字符串表示,字符串通常由雙引號括起來(lái):
      "This is a string"
      如果字符串中的所有字符都是十進(jìn)制的數字,則雙引號可以省略,"123"和123表示相同的字符串。注意,由于此規則,-123表示一個(gè)單一的負號和一個(gè)常量字符串"123",而"-123"表示一個(gè)長(cháng)度為4個(gè)字符的常量字符串。
      一個(gè)字符串中,后半個(gè)單引號,',具有特殊的意義。符號,',及其隨后的字符的含義如下所示:

     序列 此單個(gè)字符在字符串中的意義
     ''  單個(gè)后向單引號'
     'q  雙引號"
     'r  回車(chē)(十六進(jìn)制 0x0A)
     'n  換行(十六進(jìn)制 0x0D)
     't  Tab (十六進(jìn)制 0x09)
     'xx  十六進(jìn)制字節xx,比如'09與't相同,但'00非法。

      在一個(gè)dec…..enddec塊中,可以為一個(gè)常量取一個(gè)名字。Dec … enddec塊可以放在主程序的前面,這種情況下,所聲明的常量可以在整個(gè)程序中使用。如果Dec … enddec塊在一個(gè)函數前面,則所聲明的常量只能在此函數內使用。當VOS開(kāi)始執行程序時(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"。
      此定義之后,當程序中要使用"24"字符串時(shí),就可以用MAX_LINES代替。
      可以用常量表達式為常量名賦值,常量表達式就是由常量字符串、運算符和括號(但不能包括函數調用)組成的表達式。例如:

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

      習慣上常量名一般使用大寫(xiě)字母,但VOS或vlc中可以不遵循此慣例。

     6.6. 算術(shù)表達式

      VOS中可以使用以下基本算術(shù)表達式:

      運算符有不同的優(yōu)先級,例如,乘法的優(yōu)先級比加法高,所以在表達式A+B*C中,先計算乘法B*C,乘法結果再與A相加。可以用園括號(…)改變優(yōu)先級,比如表達式(A+B)*C中,先計算加法。

      重要提示:

      算術(shù)運算由VOS采用32位整數的精度進(jìn)行運算。如果結果中包括10個(gè)或10個(gè)以上十進(jìn)制位,則結果可能是錯誤的。如果數值的精度超過(guò)32位,VOS不會(huì )產(chǎn)生警告或錯誤的信息。
      因為VOS內部采用32位的精度,VOS中數值的范圍是-231~231-1,即:
       -2147483648 to 2147483647
      因此可以表示所有9位的十進(jìn)制數,但是大部分10位的十進(jìn)制數都不能表示。也就是任何兩個(gè)9位的十進(jìn)制數字都可以相加,并且結果正確,所以
       999999999 + 888888888
      可以得到正確的結果,但是:
       (999999999*5)/4
      不能得到正確的結果,因為運算中乘法的結果超過(guò)32位的精度。

     6.7.帶小數點(diǎn)的算術(shù)值

      VOS還沒(méi)有處理定點(diǎn)或浮點(diǎn)小數的內置函數。可以免費得到支持DOS和Windows的FP RLL,可以提供十進(jìn)制小數運算函數,如fp_add, fp_sub 等等。

     6.8. 邏輯條件

      VOS提供了邏輯運算符(與,或,非)和關(guān)系運算符(大于,小于…),運算結果為邏輯值(true和false),真由"1"表示,假由""表示,兩個(gè)邏輯值的邏輯運算符如下:

      關(guān)系比較運算符:

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

     6.9. 賦值運算


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

      除此以外還有下列賦值運算符:+=,-=,*=和/=。最常用的運算符是+=,可以解釋為相加后賦值,例如:
        n+=1;
      表示n加1。先把右邊的表達式計算出結果,此值加左邊的變量。同樣,-=是相減后賦值。因為加1和減1的運算比較頻繁,所以提供了++和-這兩個(gè)運算符,如下所示:
        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的運算,就不需要考慮運算前后的值。比如,下面兩個(gè)運算式等價(jià):
        x++;
        ++x;

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

      可以看出,計算結果中y的值不同,如果用戶(hù)感到類(lèi)似+=、++等運算比較容易混淆,可以不使用它們,使用=運算符也可以達到相同的結果。如果你是C語(yǔ)言程序員,就會(huì )發(fā)現這些運算符比較方便。

      6.10. 字符串連接

      &運算符將其左右的兩個(gè)字符串合在一起,連成一個(gè)字符串,稱(chēng)為字符串連接。例如,"A" & "B"的結果是"AB"。看另一個(gè)例子:
        FirstName = "Joe";
        LastName = "Smith";
        FullName = FirstName & " " & LastName;
        FullName的值為"Joe Smith";

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

      6.11. 循環(huán)

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

        for (initialize ; test ; increment)
          statements
        endfor

        while ( test )
          statements
        endwhile


      程序中斜體字使用相應的代碼:
        statements
      循環(huán)重復運行一條或多條語(yǔ)句,可能運行0次或多次。
        initialize
      循環(huán)開(kāi)始前運算的表達式。在for循環(huán)中,如果不需要可以為空。
        test
      一個(gè)邏輯條件,每次循環(huán)都檢查邏輯結果,決定是否進(jìn)行后面的循環(huán)操作。For和while-loop循環(huán)中,每次循環(huán)前檢查條件,如果結果為真,則繼續循環(huán),如果第一次檢查結果就為假,則循環(huán)的語(yǔ)句永遠不會(huì )運行。Do…until循環(huán)中,循環(huán)操作一直運行,直到條件成立。For循環(huán)中,此條件可以為空,這種情況下條件永遠為真,循環(huán)操作永遠進(jìn)行,或者通過(guò)goto,jump或return語(yǔ)句退出循環(huán)。
        increment
      for循環(huán)中,每次循環(huán)后計算此表達式,如果第一次test條件為假,則此表達式永遠不會(huì )執行。For循環(huán)中,此處可以為空。
      最常見(jiàn)的循環(huán)是變量從1開(kāi)始,直到上限,即最大值。下面循環(huán)使用變量n計算1+2+….+Max的和,

     

      無(wú)窮循環(huán)(或通過(guò)break退出)可以用for循環(huán)實(shí)現:
        for (;;)
         # ...
        endfor

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

      條件真用"1"表示,所以條件永遠為真。

     6.12. 函數調用

      一個(gè)函數是指一組語(yǔ)句序列,具有函數名和返回值。一個(gè)函數可以有一個(gè)或多個(gè)參數。參數在函數內可以當作變量一樣使用,但不能為其賦值。
      VOS中有三種函數:

    • 內置函數。這些函數是固化到VOS和vlc中的函數,因此程序中總可以使用這種函數。
    • 用戶(hù)定義函數。用VOS源碼編寫(xiě)的程序。
    • RLL程序。這些函數是用C或C++編寫(xiě)的。以二進(jìn)制文件的格式載入,稱(chēng)為運行連接庫(RLL)。DOS中,RLL是駐留內存程序,Windows中,RLL是動(dòng)態(tài)連接庫(DLL)。


      這三種函數的調用方式完全一樣,調用方式是函數名,后面為括號中的參數,參數由逗號分開(kāi)。即使函數沒(méi)有參數,括號也不能省略。下面是一些函數調用的例子:
        vid_write("Hello"); # 內置函數
        MyFunc(); # 用戶(hù)定義函數
        code = Fquery(queue, index); # RLL函數

      因為用法幾乎相同,所以不能從調用方式中區分內置函數、用戶(hù)自定義函數和RLL函數。
      一個(gè)表達式中含有函數名時(shí),先執行函數(調用函數),得到返回值,表達式中使用函數返回值。
      所有的函數都有返回值,如果函數中沒(méi)有指定返回值,則返回空字符串(不包含字符的字符串"");許多函數都不返回有用的返回值,比如vid_write總是返回空字符串。如果返回值在語(yǔ)句中沒(méi)有使用。比如:
        vid_write("Hello"); #返回值沒(méi)有使用
      VOS忽略返回值。如果返回值有用,返回值可以用在表達式中。例如,假設函數MyFunc需要兩參數,返回一個(gè)數值,則下列語(yǔ)句為正確的:
        MyFunc(1,2);#忽略返回值
        x=MyFunc(1,2);#返回值賦值給x
        y=x*MyFunc(1,2)+z;#表達式中使用函數返回值

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

     6.13. 函數和庫文件

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

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

     6.14. 包含文件

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

     6.15. 內部函數

      VOS包含了眾多的內置函數,這一部分我們對重要的一些函數組進(jìn)行簡(jiǎn)要地介紹:

      6.15.1. 數據庫函數


      db_函數支持dBase兼容的DBF數據庫以及Clipper兼容的NTX索引。程序運行中可以打開(kāi)和關(guān)閉數據庫,一個(gè)任務(wù)可以同時(shí)打開(kāi)多個(gè)數據庫。支持多用戶(hù)文件和記錄表鎖定。可以通過(guò)RLL操作其他類(lèi)型數據庫,操作細節隨操作系統不同而變化。
      建議使用我們的數據庫操作RLL,象可用于任何系統的AdoRll。AdoRll可以通過(guò)SQL語(yǔ)句操作數據庫服務(wù)器(Informix,Oracle,SQLServer等等)。

      6.15.2. 串口通信


      ser_ functions支持通過(guò)COM1~COM4的RS-232串行通信。

      6.15.3. 任務(wù)管理


      有許多任務(wù)管理的內置函數,包括spawn,chain,exec,arg,getpid和kill。

      6.15.4. 任務(wù)間通信

      VOS提供了任務(wù)間通信的四種方法:全局變量 (glb_functions),信號量 (sem_ functions), 消息 (msg_ functions)和 分組 (grp_functions)。
      在手冊中后面介紹這些方法。

      6.15.5. 字符串處理

      有許多種處理字符串的函數,包括length,substr和許多其他的函數,參照字符串函數。

      6.15.6. 屏幕和鍵盤(pán)

      vid_和kb_函數提供了簡(jiǎn)單的屏幕輸出和用戶(hù)輸入的方式。在Windows下,你也許想要制作圖形用戶(hù)界面,可以通過(guò)使用NetHub ActiveX組件在Visual Basic,Delphi,Visual C++或其他Windows可視化工具下制作用戶(hù)界面。

     6.16. 外部函數

      VOS的所以外部函數都是在C/C++下開(kāi)發(fā)的。這些函數是帶有特殊入口的DLL。VOS通過(guò)入口調用DLL的內部函數。我們常稱(chēng)這些DLL為RLL(運行連接庫)。我們提供了C/C++開(kāi)發(fā)包,用戶(hù)可以使用任何Windows的C/C++編譯器(Visual C++,Borland C++,C++ Builder等等)開(kāi)發(fā)自己的RLL。
      下面介紹一些最常用的RLL。

      6.16.1. NetHub Plus RLL


      NetHub Plus是一個(gè)企業(yè)化的組件,它支持進(jìn)程中線(xiàn)程間的通信,這些進(jìn)程包括PC中單個(gè)進(jìn)程或局域網(wǎng)以及廣域網(wǎng)上節點(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è)單獨的NetHub Plus ActiveX組件例程。

      消息
      NetHub Plus的任何例程之間都可以收發(fā)消息。消息是一個(gè)字符串,最大長(cháng)度為127的字符,可以通過(guò)MsgGet方法接收,或者通過(guò)MessageReceived事件接收。

      信號量(Semaphore)
      可以使用信號量來(lái)保護共享資源和代碼的關(guān)鍵部分。一個(gè)信號量是一種特殊的變量,有兩種可能值:設置或清楚。如果一個(gè)NetHub Plus例程設置了一個(gè)信號量,直到這個(gè)例程清除,其他的例程都不能設置。信號量只能由設置它的例程清除。

      共享的網(wǎng)絡(luò )變量
      共享網(wǎng)絡(luò )變量包含網(wǎng)絡(luò )上任何NetHub Plus的例程都可以訪(fǎng)問(wèn)的數據。網(wǎng)絡(luò )變量由變量名和索引號組成。索引與數組下標相似。共享的網(wǎng)絡(luò )變量的最大長(cháng)度為127個(gè)字符。
      信號量(Semaphores)和網(wǎng)絡(luò )變量都由名字區分,名字是一個(gè)長(cháng)度為1到127的字符串。第一個(gè)字符必須是字母或下劃線(xiàn),其他的字符可以是字母、下劃線(xiàn)或數字。

      6.16.2. Ado RLL

      ADORLL是一種可以通過(guò)ADO或者ODBC可以直接訪(fǎng)問(wèn)數據庫服務(wù)器的RLL。
      強烈建議使用ADO Ole DB提供連接 ,盡量不要使用ODBC提供連接,因為穩定性和性能都不太好。

      6.16.3. Socket RLL

      IP網(wǎng)絡(luò )上運行的VOS任務(wù)可以通過(guò)Sockets RLL交換消息,IP網(wǎng)可以是企業(yè)內部網(wǎng)、因特網(wǎng)、運行TCP/IP的Novell網(wǎng)或任何支持IP的其他網(wǎng)絡(luò )。
    RLL只是支持Windows NT,不支持Windows 9x。
      缺省Socket RLL使用端口2222(十六進(jìn)制 0x08AE),可以通過(guò) ws_SetRemotePort函數來(lái)改變連接端口號。

      6.16.4. Web RLL

      WebRLL是VOS的一個(gè)運行連接庫(RLL)。
      WebRLL提供函數,可以使VOS程序:
      ·從一個(gè)Web服務(wù)器獲得文檔
      ·從獲得的網(wǎng)頁(yè)中獲得數據(例如一個(gè)電子商務(wù)服務(wù)器)
      ·通過(guò)FTP協(xié)議發(fā)送和接收文件



     6.17. 多任務(wù)

      VOS可以同時(shí)運行多行語(yǔ)句,VOS有自己的多線(xiàn)程引擎來(lái)管理每一個(gè)任務(wù)。一個(gè)單通道的VOS應用程序如下:

      上圖中是一個(gè)簡(jiǎn)單的單通道VOS任務(wù),如果想用這個(gè)程序來(lái)管理4個(gè)通道,我們只有采用下面方式:

      VOS內部同時(shí)運行4個(gè)任務(wù)。開(kāi)始只有一個(gè)任務(wù),此任務(wù)產(chǎn)生了4個(gè)任務(wù),各任務(wù)間互相傳遞參數(通道號)。函數arg(1)檢索參數個(gè)數1,這種情況下,arg()是通道號碼。
      可以使用兩種方法來(lái)產(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能夠為多通道應用同時(shí)管理多個(gè)任務(wù)或者運行后臺任務(wù),任何任務(wù)都有自己的一組變量和數組以及自己的執行路徑。
      下面介紹管理VOS任務(wù)的一些基本概念

      6.18.1. 任務(wù)號

      每一個(gè)運行的任務(wù)都有一個(gè)唯一的任務(wù)號,任務(wù)號也稱(chēng)為進(jìn)程號(pid),這是從UNIX的術(shù)語(yǔ)中得來(lái)的,UNIX中任務(wù)也稱(chēng)為進(jìn)程。Getpid函數返回當前任務(wù)的任務(wù)號,例如:
      my_task_nr=getpid();

      6.18.2任務(wù)掛起

      使用函數sleep可以隨時(shí)掛起當前任務(wù)。參數是任務(wù)重新運行所需要等待的時(shí)間,單位為0.1秒。例如:
      sleep(50); # 等待5秒鐘
      掛起時(shí)間必須小于12個(gè)小時(shí),即小于432000。
      掛起的任務(wù)不占用任何處理器資源(VOS v5或更高版本)。這就意味著(zhù)輪循所產(chǎn)生的性能問(wèn)題可以通過(guò)短時(shí)間掛起循環(huán)操作來(lái)消除。例如,如果一個(gè)任務(wù)在等待一個(gè)全局變量值改變或等待呼入:
        while (glb_get(0) strneq "NEW" and not TrunkGetState() strneq "Idle"))
          sleep(2);
        endwhile

      6.18.3. 終止任務(wù)

      可以使用kill函數來(lái)終止一個(gè)任務(wù),kill函數用任務(wù)號作為參數:
       kill(condemned_task_nr);
      執行此函數后任務(wù)馬上就會(huì )終止,除非任務(wù)已被掛起,在等待內置函數的結束,例如sleep、sem_set、sc_play等函數。在任務(wù)被掛起的情況下,任務(wù)會(huì )在當前的內置函數結束后終止。
      Kill函數的返回值表示此操作是否成功:
       -1  無(wú)效任務(wù)號(此任務(wù)根本沒(méi)有激活過(guò))。
       0  任務(wù)被掛起,當前的函數結束后任務(wù)就終止
       1  無(wú)效任務(wù)號(任務(wù)被激活過(guò),但已經(jīng)終止了)。
       其他 任務(wù)立即終止。


      6.18.4. 信號量、消息和全局變量


      VOS提供的多任務(wù)環(huán)境中,通常情況下各任務(wù)獨立地運行。有時(shí),任務(wù)之間需要調整它們之間地活動(dòng)或交換信息。
      VOS提供了三種任務(wù)間通信的函數:
      ·信號量(Semaphores)
      ·消息
      ·全局變量
      信號量(Semaphores)通常管理代碼的關(guān)鍵部分,所謂關(guān)鍵部分就是指一組語(yǔ)句序列,如果兩個(gè)任務(wù)同時(shí)運行這部分代碼時(shí),會(huì )產(chǎn)生錯誤。

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

      共有兩種信號:編號的信號量和命名的信號量。命名的信號量可以通過(guò)信號量的名稱(chēng)來(lái)進(jìn)行操作,下面列出了管理命名信號量的函數:

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

      全局變量是VOS任務(wù)間共享信息的一種非常有用的方式,采用全局變量的函數如下所示:

      全局變量
      glb_get   value = glb_get(num)
      取得給定全局變量號碼的當前值。
      glb_set   glb_set(num, string)
      設定全局變量為給定得字符串。

      命名的全局變量
      glb_clrallx  glb_clrallx(Name)
      設置全局變量所有值為空字符串。
      glb_decx    glb_decx(Name[,Index1, ...])
      一個(gè)命名的全局變量值減去1。
      glb_dimx    glb_dimx(Name[,Lower1,Upper1, ...] [,MaxLength])
      產(chǎn)生一個(gè)新的命名全局變量。
      glb_getsizex  glb_getsizex(Name)
      返回指定的全局變量的最大長(cháng)度。
      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)
      返回全局變量的維數。標量返回0,矢量返回1,矩陣返回2等等。
      glb_rangex    glb_rangex(Name[,DimNr])
      返回變量某一維索引的范圍(若沒(méi)有給定,則取0)。
      glb_setallx   glb_setallx(Name, Value)
      將某個(gè)全局變量的所有字符串設置為給定值。
      glb_setx     glb_setx(Name[,Index1, ...], Value)
      將某全局變量的某字符串設置為給定值。
      glb_upperx    glb_upperx(Name[,DimNr])
      返回變量某維索引的上限。

     6.19. 日期與時(shí)間函數

      IVR系統中的任務(wù)常常使用日期和時(shí)間(比如,呼叫的時(shí)間)。VOS的日期和時(shí)間函數如下所示:

     6.20. 字符串函數

     6.21. 文件和目錄函數(fil_,dir_)

      VOS提供了許多讀寫(xiě)、查找文件和目錄的內置函數,任何可以通過(guò)命令行查看的文件,包括網(wǎng)絡(luò )服務(wù)器文件,都可以通過(guò)這些函數來(lái)訪(fǎng)問(wèn)。

     6.22 圖形化VOS,介紹

      第一次運行圖形化的VOS時(shí),會(huì )看到如下界面:

      首先介紹一個(gè)新的概念――項目(PROJECT),對于使用VOS早期版本的開(kāi)發(fā)者來(lái)說(shuō),這是一個(gè)新的東西,像市場(chǎng)上許多其他的編程工具(Visual Basic,Visual C,Borland C++Builder,等等)一樣,一個(gè)Project包含應用程序必須的所有文件。一個(gè)VOS的Project包括:
      ·VOS源代碼(.VS)
      ·信息流表(Flow Charts)(.flw)
      ·與項目相關(guān)的RLL
      ·INC,FUN,DEC,VL文件
      VOS源代碼文件是使用VOS語(yǔ)言編寫(xiě)的文本文件。VOS源代碼文件通過(guò)如下格式加入文件夾Application中的項目中:Application+Vos源代碼文件名:

      在每一個(gè)文件夾中都有包含文件(.inc),函數文件(.fun),declaration文件和函數庫文件(.vl)的索引。
      信息流表文件指信息流表格的CTI應用。例如:

      6.23. 圖形化VOS,第一步

      下面,創(chuàng )建一個(gè)新的VOS項目(Project)來(lái)了解一下設置過(guò)程,創(chuàng )建一個(gè)新的VOS項目后,可以得到一個(gè)文件夾名為master。
      非常重要提示!!!永遠不要刪除程序master的索引,因為這是VOS要求的!
    這一步完成后,我們可以使用File菜單中的New函數來(lái)添加、刪除、編輯信息流表和VOS應用。

      6.24. 圖形化VOS,基本配置

      首先配置系統的中繼線(xiàn)(菜單 Project->設置中繼)。在中繼設置主窗口中,有一個(gè)TrunkConfiguration 選項卡。本選項卡用來(lái)設置每一通道應用及其相關(guān)程序類(lèi)型。共有3種程序:
     1. 固定的:確實(shí)的類(lèi)型的程序。當有站內呼叫通過(guò)此通道。VOS執行此程序。
     2. ANI:對于選定的通道,VOS執行"ANI Phone Number"選項中設置的應用
       程序。
     3. DNIS:對于選定的通道,VOS執行"DNIS Phone Number"選項中設置的應
       用程序。
      ANI和DNIS 選項卡用來(lái)設置ANI和DNIS控制執行的應用程序,一個(gè)典型的例子就是不同DNIS下不同業(yè)務(wù)的900語(yǔ)言文本系統。

      對于其他的DNIS或ANIS(沒(méi)有列出),可以關(guān)聯(lián)一個(gè)程序或者拒絕呼入。

     

    [ 全文英文版 ]

     

     


    本文 [ 目錄 ] [ 第一頁(yè) ] [ 第二頁(yè) ] [ 第三頁(yè) ]

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

     
     

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 巴楚县| 东辽县| 于田县| 子长县| 江山市| 临泽县| 闸北区| 正宁县| 宝应县| 崇左市| 宣汉县| 富宁县| 台东县| 伽师县| 三穗县| 原阳县| 花垣县| 郧西县| 阜平县| 揭西县| 安西县| 北辰区| 吉安市| 农安县| 新晃| 柯坪县| 黄陵县| 涞源县| 宜阳县| 迁西县| 马鞍山市| 安塞县| 古浪县| 怀柔区| 宁阳县| 平昌县| 华宁县| 酉阳| 兰州市| 康马县| 商城县| http://444 http://444 http://444 http://444 http://444 http://444