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+ 时退出。这将为客户节省 很多 的钱。