📄 00000001.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: wxb1 (ben), 信区: Linux <BR>标 题: [2/8] 语音数据机录/放音 <BR>发信站: BBS 水木清华站 (Fri Jun 11 14:13:28 1999) <BR> <BR> <BR>以Linux实作 语音/传真/EMAIL/BBC 整合系统 <BR>2.语音数据机录/放音 <BR> <BR> 目前市面上的语音数据机,有九成以上皆使用Rockwell的晶片,因此以 <BR>下的说明,皆针对此类的语音数据机,若您使用Zyxel等非Rockwell晶片的数据 <BR>机,请参考其说明手册(英文的那一本),虽然AT Command 不同,但颇为类似 <BR>!至於 Rockwell 的完整AT Command,或Voice Command,也可至其网站 <BR><A HREF="http://www.rockwell.com">http://www.rockwell.com</A> 抓取(我已忘了确实的 PATH)。 <BR> <BR>VMCP <BR> 要能控制语音数据机传送或接收语音讯息,除了需了解语音部分的AT <BR>Command 之外,也需有方便的应用程式,帮您做串列埠或数据机的设定,同时也 <BR>要能接收或传送语音资料。 VMCP (Voice Modem Control Program) 就是一个具 <BR>此功能的软体,您可在Internet上自由的下载并使用,利用此程式可轻松设定个 <BR>人电脑上的串列埠(如DTE速率)、传送AT Command 或二进位档至数据机, 亦可 <BR>将数据机传来的资料转存至档案中、捕捉电话线另一端使用者的按键 (DTMF <BR>tones) 、送出数据机指令并根据指定的结束字串等待其回应等等。 <BR> <BR>例如: <BR> vmcp -z38400 -t8 -c"ATZ" -wOK <BR>其意义为设定串列埠之速度为38400,并送出ATZ的数据机重置指令,等待数据机 <BR>回应"OK",若经过8秒仍无回应,则vmcp会有错误代码(100)回覆! <BR> <BR> vmcp -c"AT#VRX" -W"\cCONNECT\r\n" -e -t10 -s"tone.log" -x"#bcde" <BR>其意义为送出AT#VRX的语音指令(接收对方的语音或按键,此处主要是撷取按键) <BR>,-W(大写W,Skip String)略过数据机回应 CONNECT<CR><LF> (送出AT#VRX後, <BR>数据机的回应),等待对方按键,直到10秒钟Timeout,或遇到 -x 後所列的 <BR>DLE-escaped 字元为止( -e 表示要处理DLE-escaped字元,所以有 -x 就必须 <BR>有 -e),"#bcde"五字元各表示电话键盘上的"#"字符号、遇忙线音(Busy Tone) <BR>、语音转FAX( Calling Tone )、拨号音( Dial Tone )、或语音转Data传输( <BR>European Data Modem Calling Tone ), 并将对方按键(所有按键皆属 <BR>DLE-escaped字元)存入tone.log 档案中。 因此若对方按12345#,此VMCP指令即 <BR>会返回,并且在tone.log存有12345#。 <BR> <BR> 由以上可知,虽然VMCP可接收按键,但是其是以指定的结尾字元来作为 <BR>结束,而不能订定固定的长度(例如分机号码固定为三码,输入需为"123#"才可 <BR>,无法仅键入三码),不过因VMCP有附原始程式码,仅需略作如下的修改,即可 <BR>符合指定长度的要求: <BR> ………… <BR> <BR> /* 加入指定长度 L 的参数 */ <BR>while (( opt = getopt( argc, argv, "c:d:eghi:kl:L:o:qs:t:w:W:x:z:" ) ) != -1) <BR> { <BR> switch ( opt ) <BR> { <BR> …………. <BR> <BR> case 'L' : <BR> keylen = atoi(optarg); break; <BR> ………….. <BR> } <BR> } <BR> <BR> …………. <BR> <BR>/*----------------------------------------------------------------------*/ <BR>/* Write c to escape file, return TRUE if c is in esc_string. */ <BR>/*----------------------------------------------------------------------*/ <BR>int out_esc(int c) <BR> { <BR> …………. <BR> <BR> for ( i = 0 ; esc_string[i] != '\0' && esc_string[i] != (unsigned char) c <BR>; i++); <BR> if ( esc_string[i] == '\0' ) <BR> /* 加入此段 */ <BR> if ( keylen && ( esc_num >= keylen ) ) { <BR> ok_exit_code = -keylen; <BR> return TRUE; <BR> } else { <BR> return FALSE; <BR> } <BR> /* 结束加入 */ <BR> else <BR> ………… <BR> } <BR> <BR>如此当VMCP指定长度为n码时,若其EXIT CODE为 -n,表示对方确实为输入n码後 <BR>返回! <BR> <BR>本地录音 <BR> 目前在市面上买到的语襡cho "InHead:$InHead" <BR> InputLen=2 <BR> else <BR> InHead="" <BR> InputLen=3 <BR> fi <BR>fi <BR> <BR># 等待 User 输入代号 <BR>$VMCP -c"$AT_VRX" -W"\cCONNECT\r\n" -e -t10 -s$tmpfile -L$InputLen -x"bcde" <BR>N=$? <BR>$VMCP -c"\c\n" -wVCON <BR>if [ $N -lt 253 ]; then <BR> #256-3=253 ; 256-2=254 <BR> hang_up <BR>fi <BR> <BR>read InTail < $tmpfile <BR>UserID="$InHead$InTail" <BR> <BR># Check User <BR>if [ -f ${MAINPATH}conf/$UserID.reg ]; then <BR> # 寻找此 USER 是否有别人的留言 <BR> vocfiles=`$FIND ${MAINPATH}voc/${UserID}.* -printf " %p"` <BR> PLAYFILE="${MAINPATH}voc/sys/select12.voc" <BR> if [ `$ECHO -n $vocfiles | $WC -w` -gt "0" ]; then <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -