Asterisk PBX - 当用户在使用来自 LUA 的 'Read' 应用程序时断开连接时无限循环
Asterisk PBX - Infinite Loop when user disconnects while using 'Read' application from LUA
我目前正在为 asterisk 配置交互式拨号计划,因为我已经知道一些 LUA 我认为走那条路会更容易。
我有一个这样的开始扩展:
["h"] = function(c,e)
app.verbose("Hung Up")
end;
["s"] = function(c, e)
local d = 0
while d == 0 do
say:hello()
app.read("read_result", nil, 1)
d = channel["read_result"].value;
if d == 1 then
say:goodbye()
elseif d == 2 then
call:forward('front desk')
end
d = 0
end
say:goodbye()
end;
如您所见,我想重复说明 say:hello()
用户给出了无效答案。但是,如果用户挂机而
app.read
等待他们的回答,asterisk 以无限循环结束
因为 d
将永远是 nil
.
我会检查 d==nil
以检测断开连接,但 nil
也显示
当用户在 app.read
.
期间按下 #
井号时向上
到目前为止,我已经开始使用 for
循环而不是 while
来限制
最大迭代次数,但我宁愿找出如何检测断开连接的方法
渠道。不过,我找不到任何相关文档。
我也试过设置一个 h
扩展,但是当
用户挂断。
Asterisk 详细输出:
[...]
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │ test.lua:3: in main chunk
-- Accepting a maximum of 1 digit. │ [C]: ?
-- User disconnected │root@cirro asterisk lua test.lua
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │Global B
-- Accepting a maximum of 1 digit. │LocalB-B->a
-- User disconnected │LocalB-A
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │LocalB-A
-- Accepting a maximum of 1 digit. │LocalB-A
-- User disconnected │root@cirro asterisk cp ~/test.call /var/spool/asterisk/outgoing
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")
[...]
感谢您提供的任何帮助。
首先,您可以在 app_read 文档(和任何其他文档)中看到,它 return 不正确执行的不同值(当通道关闭时)。
此外,这个确切的应用程序还提供了确定结果的简化方法:
core show application Read
-= Info about application 'Read' =-
[Synopsis]
Read a variable.
[Description]
Reads a #-terminated string of digits a certain number of times from the user
in to the given <variable>.
This application sets the following channel variable upon completion:
${READSTATUS}: This is the status of the read operation.
OK
ERROR
HANGUP
INTERRUPTED
SKIPPED
TIMEOUT
如果仍然不适合您,您可以直接询问 asterisk 关于 CHANNEL(state)
PS 你绝不 应该编写拨号方案或任何其他具有无限循环的程序。计算您的循环并在 10+ 时退出。这将为客户节省 很多 的钱。
我目前正在为 asterisk 配置交互式拨号计划,因为我已经知道一些 LUA 我认为走那条路会更容易。
我有一个这样的开始扩展:
["h"] = function(c,e)
app.verbose("Hung Up")
end;
["s"] = function(c, e)
local d = 0
while d == 0 do
say:hello()
app.read("read_result", nil, 1)
d = channel["read_result"].value;
if d == 1 then
say:goodbye()
elseif d == 2 then
call:forward('front desk')
end
d = 0
end
say:goodbye()
end;
如您所见,我想重复说明 say:hello()
用户给出了无效答案。但是,如果用户挂机而
app.read
等待他们的回答,asterisk 以无限循环结束
因为 d
将永远是 nil
.
我会检查 d==nil
以检测断开连接,但 nil
也显示
当用户在 app.read
.
#
井号时向上
到目前为止,我已经开始使用 for
循环而不是 while
来限制
最大迭代次数,但我宁愿找出如何检测断开连接的方法
渠道。不过,我找不到任何相关文档。
我也试过设置一个 h
扩展,但是当
用户挂断。
Asterisk 详细输出:
[...]
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │ test.lua:3: in main chunk
-- Accepting a maximum of 1 digit. │ [C]: ?
-- User disconnected │root@cirro asterisk lua test.lua
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │Global B
-- Accepting a maximum of 1 digit. │LocalB-B->a
-- User disconnected │LocalB-A
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │LocalB-A
-- Accepting a maximum of 1 digit. │LocalB-A
-- User disconnected │root@cirro asterisk cp ~/test.call /var/spool/asterisk/outgoing
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")
[...]
感谢您提供的任何帮助。
首先,您可以在 app_read 文档(和任何其他文档)中看到,它 return 不正确执行的不同值(当通道关闭时)。
此外,这个确切的应用程序还提供了确定结果的简化方法:
core show application Read
-= Info about application 'Read' =-
[Synopsis]
Read a variable.
[Description]
Reads a #-terminated string of digits a certain number of times from the user
in to the given <variable>.
This application sets the following channel variable upon completion:
${READSTATUS}: This is the status of the read operation.
OK
ERROR
HANGUP
INTERRUPTED
SKIPPED
TIMEOUT
如果仍然不适合您,您可以直接询问 asterisk 关于 CHANNEL(state)
PS 你绝不 应该编写拨号方案或任何其他具有无限循环的程序。计算您的循环并在 10+ 时退出。这将为客户节省 很多 的钱。