首頁(yè)>>廠商>>語(yǔ)音板卡開發(fā)商>>OpenVox

Asterisk命令MeetMe詳解

2010/02/02

>>開放源代碼的IP呼叫中心專欄

MeetMe

概要

  MeetMe 會(huì)議橋

描述

  語(yǔ)法:MeetMe([confno][,[options][,pin]])

  用途: 讓用戶進(jìn)入一個(gè)指定的MeetMe會(huì)議。如果省略了會(huì)議編號(hào),系統(tǒng)會(huì)提示用戶選擇一個(gè)。(注意:MeetMe會(huì)議需要一個(gè)Zaptel時(shí)鐘才能工作,你可以不裝任何板卡,但是你需要安裝Zaptel)

  參數(shù):options可以為空,也可以設(shè)置一個(gè)或者多個(gè)參數(shù),參數(shù)有如下一些:


參數(shù)詳解

  參數(shù) 's'

  's' 和 'p' 參數(shù)不能跟 'X' 參數(shù)共同使用。

  參數(shù) 'q'

  最好在 Asterisk v1.2以上版本用,早期版本的SIP通道會(huì)有延遲。

  參數(shù) 'r'

  在開始MeetMe()錄音之前,要指定Set ${MEETME_RECORDINGFILE}的值。

  否則,錄音文件將存放在/var/lib/asterisk/sounds目錄下,該目錄是存放系統(tǒng)提示音的,不適合存放錄音文件。

  例如:

  exten => s,1,SetVar(MEETME_RECORDINGFILE=/var/conf_recording-${EPOCH}-${USER})
  exten => s,2,MeetMe(,rD) ;開設(shè)一個(gè)新會(huì)議,對(duì)會(huì)議錄音,

  例子

  在meetme.conf 中設(shè)定一個(gè)會(huì)議室號(hào)為101,密碼為123456的會(huì)議。
  exten => 500,1,MeetMe(101||123456)

  授權(quán)的會(huì)議

  exten => 18,1,Answer
  exten => 18,2,Wait(1)
  exten => 18,3,Authenticate(5678)
  exten => 18,4,MeetMe(18|p)
  exten => 18,5,Playback(vm-goodbye)
  exten => 18,6,Hangup

  動(dòng)態(tài)會(huì)議室,用戶需要按鍵輸入要?jiǎng)?chuàng)建的會(huì)議室號(hào)

  exten => 9999,1,Wait(1)
  exten => 9999,2,MeetMe(|Md)

  注意:如果你加入?yún)?shù)'e', 按*將選擇#會(huì)議室
  如果你需要為會(huì)議室設(shè)定一個(gè)密碼,,請(qǐng)將 'd' 參數(shù)改為 'D' 。

  動(dòng)態(tài)會(huì)議室123設(shè)為安靜模式。如果用戶foo 撥打分機(jī)號(hào)10,他將成為一個(gè)標(biāo)記用戶(’A’),foo離開會(huì)議后,會(huì)議室將被關(guān)閉,其他的撥打11的用戶也將被迫離開會(huì)議室。

  exten => 10,1,MeetMe(123|Aqd)
  exten => 11,1,MeetMe(123|xqd)

  OEJ發(fā)表的回顧 (May 23, 2004)

  你發(fā)現(xiàn)這個(gè)簡(jiǎn)單得不能再簡(jiǎn)單的(not-so-simple-anymore)簡(jiǎn)單MeetMe會(huì)議橋了嗎?這可是Asterisk的一個(gè)殺手級(jí)應(yīng)用哦。它帶來(lái)豐富的功能應(yīng)用:


  更多豐富命令包括


  在CLI 下面也可以管理MeetMe:


  OEJ附加說(shuō)明


性能方面的考慮

  在ISDN PRI環(huán)境下開超過10個(gè)人的MeetMe會(huì)議

  我曾經(jīng)發(fā)現(xiàn)在ISDN PRI環(huán)境下超過10個(gè)人的會(huì)議回發(fā)生嘯叫。人們認(rèn)為電信運(yùn)營(yíng)商已經(jīng)對(duì)ISDN-PRI這樣的純數(shù)字化環(huán)境做過回聲消除了,所以不需要再設(shè)置回聲消除。然而事實(shí)并非如此。我在配置文件 /etc/asterisk/zapata.conf下面增加了下列的參數(shù)項(xiàng),從而解決了這個(gè)問題:

  echocancel=yes
  echocancelwhenbridged=yes
  echotraining=yes

架構(gòu)和局限

  在Asterisk 1.2版本中,同時(shí)開很多個(gè)會(huì)議的時(shí)候可能會(huì)有些局限。目前大部分版本已經(jīng)升到1.4及以上,也就不存在這些問題了,不再鏊述。

  關(guān)于參數(shù)'b' (AGI_BACKGROUND)

  網(wǎng)友疑問

  我看了論壇上一些老的帖子,但是還是有個(gè)疑問,是關(guān)于AGI_BACKGROUND的。如果我的機(jī)器上安裝了Asterisk兼容板卡但是會(huì)議里沒有加入Zap通道,只有SIP通道,那么SIP通道上的MEETME_AGI_BACKGROUND腳本能正常工作嗎?

  回答

  不能正常工作。下面我們分析一下工作原理:

  合并輸入的語(yǔ)音包,輸出合并后的語(yǔ)音包,這些工作是在Zaptel驅(qū)動(dòng)里面做的。對(duì)于真實(shí)的Zap通道,這個(gè)工作是在驅(qū)動(dòng)層就請(qǐng)全部完成的。而對(duì)于非Zap通道,系統(tǒng)會(huì)創(chuàng)建一個(gè)Zap虛擬通道,然后在非Zap通道和Zap虛擬通道之間雙向拷貝語(yǔ)音數(shù)據(jù)。

  看一下這部分源代碼(在conf_run()中),我們會(huì)發(fā)現(xiàn),conf_run() 函數(shù)要么執(zhí)行AGI腳本,要么執(zhí)行虛擬通道拷貝循環(huán),不能同時(shí)執(zhí)行兩個(gè)。所以當(dāng)你使用AGI腳本的時(shí)候,在非Zap 通道和Zap虛擬通道之間就沒有任何連接了。

  擁有一塊Asterisk卡或者dummy時(shí)鐘驅(qū)動(dòng) (比如: ztdummy 或者 zaprtc) 都能使用MeetMe功能,但是這并不意味著你可以在參加會(huì)議的SIP通道上使用AGI:他們沒有執(zhí)行任何AGI的能力。你可以試下看,但是最終的結(jié)果一定是什么聲音也得不到。

  還要注意的是,使用AGI將會(huì)使其他的一些內(nèi)置功能,比如說(shuō)靜音、踢人和音樂等待等功能不能使用。

  AGI_BACKGROUND Pros/Cons

  使用AGI將會(huì)使其他的一些內(nèi)置功能,比如說(shuō)不用通過命令行實(shí)現(xiàn)靜音、踢人和音樂等待等功能。

  參數(shù) 'p' (按#退出) 也不能用。錄音功能也不能用。

  如果你需要把會(huì)議中的某個(gè)成員踢出去,首先需要停止該成員的AGI_BACKGROUND 任務(wù)。

  一旦AGI_BACKGROUND腳本停止,該成員就自動(dòng)退出會(huì)議室了。

  所有的DTMF按鍵事件都被送到AGI_BACKGROUND 進(jìn)程/腳本。所以你可以讓你的.agi腳本不停地循環(huán),捕獲按鍵音,來(lái)決定怎樣處理一個(gè)特定的按鍵。

  AGI_BACKGROUND 也開放了很多開發(fā)的編程機(jī)會(huì)。你可以使用進(jìn)程間通訊(sockets, signals等等)來(lái)遠(yuǎn)程控制會(huì)議室(即: 基于外部時(shí)間或用戶輸入來(lái)給會(huì)議室放音)。

  從普通通話發(fā)起多方通話(邀請(qǐng)用戶參加會(huì)議)

  下面我講一下怎樣從一個(gè)普通通話(兩方通話)發(fā)起多方通話。主要是通過MeetMe和ChannelRedirect來(lái)實(shí)現(xiàn)。

  疑問: 在 Asterisk 1.4 版本中,我們是否需要用'ManagerRedirect'來(lái)替換 'ChannelRedirect'?

  下面是dialplan 例子:

  [default]
  exten => _XXX,1,Set(DYNAMIC_FEATURES=nway-start)
  exten => _XXX,n,Dial(SIP/${EXTEN})

  [dynamic-nway]
  exten => _XXX,1,Answer
  exten => _XXX,n,Set(CONFNO=${EXTEN})
  exten => _XXX,n,Set(MEETME_EXIT_CONTEXT=dynamic-nway-invite)
  exten => _XXX,n,Set(DYNAMIC_FEATURES=)
  exten => _XXX,n,MeetMe(${CONFNO},pdMX)
  exten => _XXX,n,Hangup

  [dynamic-nway-invite]
  exten => 0,1,Read(DEST,dial,,i)
  exten => 0,n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
  exten => 0,n,Dial(Local/${DEST}@dynamic-nway-dest,,g)
  exten => 0,n,Set(DYNAMIC_FEATURES=)
  exten => 0,n,Goto(dynamic-nway,${CONFNO},1)
  exten => i,1,Goto(dynamic-nway,${CONFNO},1)

  [dynamic-nway-dest]
  exten => _XXX,1,Dial(SIP/${EXTEN})

  [macro-nway-start]
  exten => s,1,Set(CONFNO=${FindFreeConf()})
  exten => s,n,ChannelRedirect(${BRIDGEPEER},dynamic-nway,${CONFNO},1)
  exten => s,n,Read(DEST,dial,,i)
  exten => s,n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
  exten => s,n,Dial(Local/${DEST}@dynamic-nway-dest,,g)
  exten => s,n,Set(DYNAMIC_FEATURES=)
  exten => s,n,Goto(dynamic-nway,${CONFNO},1)

  [macro-nway-ok]
  exten => s,1,ChannelRedirect(${BRIDGEPEER},dynamic-nway,${CONFNO},1)

  [macro-nway-notok]
  exten => s,1,SoftHangup(${BRIDGEPEER})

  注意:你需要用 FindFreeConf() 函數(shù) (或者其他方式) 來(lái)獲得空閑的會(huì)議室號(hào)碼。

  此外,還需要修改 features.conf,增加下面的內(nèi)容:

  [applicationmap]
  nway-start => *0,caller,Macro,nway-start
  nway-inv => **,caller,Macro,nway-ok
  nway-noinv => *#,caller,Macro,nway-notok

(譯注:事實(shí)上,F(xiàn)indFreeConf()這個(gè)函數(shù)好像需要Trunk版本支持,需要修改一下這個(gè)例子的部分內(nèi)容才能運(yùn)行。另外,實(shí)際測(cè)試中我們也發(fā)現(xiàn),兩個(gè)按鍵*0之間的間隔時(shí)間不能太長(zhǎng),最好是連續(xù)按鍵。)

  工作原理:

  普通通話情況下:

  當(dāng)你和別人通話的時(shí)候,按*0 (執(zhí)行宏 nway-start)。 被叫馬上被傳遞到一個(gè)空閑的會(huì)議室,而你將聽到撥號(hào)音,等待你輸入你要邀請(qǐng)的電話號(hào)碼。當(dāng)被邀請(qǐng)方接通后,你在和這個(gè)第三方通話的過程中,可以按 ** (在features.conf可以定義)加入會(huì)議,按 *# 掛掉他然后返回會(huì)議。

  會(huì)議室情況下:

  在會(huì)議室里面,任何用戶可以按0邀請(qǐng)其他用戶加入會(huì)議,其他的步驟同上。

  合并會(huì)議

  這些可以使用使用 Asterisk local channels 和 Asterisk manager API來(lái)實(shí)現(xiàn)(一般使用AGI 或者Call Files) 。

  下面是一個(gè)合并會(huì)議123和會(huì)議124的OriginateAction例子:

  在dialplan (context = default):
  exten => 7799,1,Meetme(123|qd)
  exten => 7798,1,Meetme(124|qd)

  在Manager API:
  Action: Originate
  ActionID: 12345678
  Channel: local/7798
  Context: default
  Exten: 7799
  Priority: 1

  與某個(gè)成員悄悄話

  在Meetme中,還有一個(gè)類似ChanSpy的悄悄話功能(密談)。會(huì)議成員可以與其他成員通過'whisper'功能來(lái)密談。

  我還增加了一個(gè) 'z' 標(biāo)志:

  'z' — 所有的DTMF按鍵事件將被送到manager

  用戶可以通過對(duì)MeetMe系統(tǒng)中的按鍵進(jìn)行偵測(cè),然后在決定在manager命令中如何處理。
除了標(biāo)準(zhǔn)MeetMe之外的其他選擇

  MeetMe2

  MeetMe2是在MeetMe基礎(chǔ)上增加了Web控制界面的一個(gè)變體。

  "目的是控制會(huì)議室里面的聲音和成員。這個(gè)功能可以為你提供一個(gè)通過網(wǎng)絡(luò)來(lái)控制會(huì)議和直觀查看會(huì)議的方法。app_meetme已經(jīng)做了大量改動(dòng),將一些會(huì)議信息寫入DB,并檢查會(huì)議屬性是否已經(jīng)改變。"

  Q: 我看到會(huì)議中的成員,但是我不能把他們踢出去,也不能將他們的模式從說(shuō)變成可聽可說(shuō)。沒有顯示任何錯(cuò)誤。
  A: 在php中打開register_globals。
  你也可以在php文件的頂部加入"extract($_GET);"
(也有網(wǎng)友建議使用MeetMe-Web-Control來(lái)替代MeetMe2)

  app_conference

  另外一個(gè)變種 app_conference,針對(duì)大容量的會(huì)議。
  http://sourceforge.net/projects/appconference/
  有些人認(rèn)為它比MeetMe更為強(qiáng)大,但是目前還沒有人提供詳細(xì)的比較測(cè)試數(shù)據(jù)。

  遠(yuǎn)程會(huì)議主機(jī)

  通過第三方會(huì)議提供商: http://www.junctionnetworks.com,IAX和SIP通道可以加入遠(yuǎn)程會(huì)議。在dialplan里面可以這樣寫:
  exten => 7000,1,Dial(IAX2/conference@iax.jnctn.net)
  exten => 7000,1,Dial(SIP/conference@sip.jnctn.net)

  通過撥打7000,您就可以參加他們的會(huì)議。
  他們提供很多種參加會(huì)議的方法,可以通過Web網(wǎng)頁(yè)來(lái)訂制,方便了會(huì)議管理和統(tǒng)計(jì)。

CTI論壇編輯



相關(guān)閱讀:
OpenVox攜手UcSky™為美國(guó)普達(dá)構(gòu)建融合通訊系統(tǒng) 2010-03-16
可管理的電話會(huì)議系統(tǒng)開發(fā)從入門到精通(四) 2010-03-02
可管理的電話會(huì)議系統(tǒng)開發(fā)從入門到精通(三) 2010-02-21
可管理的電話會(huì)議系統(tǒng)開發(fā)從入門到精通(二) 2010-02-09
可管理的電話會(huì)議系統(tǒng)開發(fā)從入門到精通(一) 2010-02-08

熱點(diǎn)專題:  開源軟件