Asterisk 如何读取星号中*终止的dtmf数字

Asterisk 如何读取星号中*终止的dtmf数字,asterisk,Asterisk,我知道Read命令得到以#结尾的dtmf数字。但如何读取以星号字符“*”结尾的dtmf数字? 例如,如果我必须输入“092”,我从键盘上按“092*。这里有两种方法 1) 不可能实现,但大部分时间都可以工作。只需使用AGI getdata或dialplan read命令一次读取一个数字 2) 创建app_read分支并在代码中将#更改为*。要修改行为,请参阅星号源目录中的apps/app_read.c if (tmp[x-1] == '#') { tmp[x-1] = '\0';

我知道Read命令得到以#结尾的dtmf数字。但如何读取以星号字符“*”结尾的dtmf数字? 例如,如果我必须输入“092”,我从键盘上按“092*。

这里有两种方法

1) 不可能实现,但大部分时间都可以工作。只需使用AGI getdata或dialplan read命令一次读取一个数字


2) 创建app_read分支并在代码中将#更改为*。

要修改行为,请参阅星号源目录中的apps/app_read.c

if (tmp[x-1] == '#') {
    tmp[x-1] = '\0';
    status = "OK";
    break;
}
将#替换为*

您只需重新编译该模块:

rm apps/app_read.o apps/app_read.so
make
cp -f apps/app_read.so /lib/asterisk/modules/
service asterisk restart

在apps/app#u read.c中将
tmp[x-1]=='#'
更改为
tmp[x-1]='*'
是必要的,但还不够。

您可以执行以下步骤:

1.将apps/app#read.c中的#替换为*:

// if (tmp[x-1] == '#'){
if (tmp[x-1] == '*'){
    tmp[x-1] = '\0';
    status = "OK";
    break;
}

2.将main/app.c中的#替换为*:

//res = ast_readstring_full(c, s, maxlen, to, fto, "#", audiofd, ctrlfd);
res = ast_readstring_full(c, s, maxlen, to, fto, "*", audiofd, ctrlfd);

//static const char default_acceptdtmf[] = "#";
static const char default_acceptdtmf[] = "*";

//res = ast_readstring(c, s, maxlen, to, fto, "#");
res = ast_readstring(c, s, maxlen, to, fto, "*");

3.重新编译星号:

sudo make clean
sudo make
sudo make install


我已经完成了这些步骤,它对我很有效。

它总是3位数的分机吗?如果必须使用*作为终止数字,可以调用Read在循环中收集1个数字。连接数字字符串,直到得到“*”。扩展名不是固定长度,可以是3到6个数字。当我按照您的建议运行make命令时,所有星号将再次开始重新编译。如何确保仅重建应用程序读取?编译器配置可能已更改。如果让它编译一次,然后只修改一个文件,那么只有该文件(以及依赖于它的模块)将重新编译。我猜自从上次完整编译以来,操作系统上已经安装了新版本的-dev/-devel包。