Asterisk PBX - 当用户在使用LUA的“Read”应用程序时断开连接时陷入无限循环

我目前正在为Asterisk配置交互式拨号计划,因为我已经了解一些LUA,所以我认为这样做会更容易。

我有一个像这样的起始扩展:

["h"] = function(c, e)
    app.verbose("挂机")
  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('前台')
      end

      d = 0
    end

    say:goodbye()
end;

正如您所看到的,我希望每当用户给出无效答案时重复指示say:hello()。但是,如果用户挂断电话,而app.read等待他们的答案,那么Asterisk将陷入无限循环,因为d始终为nil

我本来会检查d == nil来检测断开连接,但是nil也会在用户在app.read期间按下“#”符号时出现。

到目前为止,我已经开始使用for循环而不是while来限制最大迭代次数,但我宁愿找出如何检测已断开的通道。但我找不到任何关于此的文档。

我也尝试设置一个h扩展,但当用户挂断电话时程序不会转到它。

Asterisk详细输出:

[...]
-- 正在执行 [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")                │        test.lua:3: in main chunk
-- 接受最多1位数字。                                                       │        [C]: ?
-- 用户断开连接                                                                      │root@cirro asterisk lua test.lua
-- 正在执行 [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")                │Global B
-- 接受最多1位数字。                                                       │LocalB-B->a
-- 用户断开连接                                                                      │LocalB-A
-- 正在执行 [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")                │LocalB-A
-- 接受最多1位数字。                                                       │LocalB-A
-- 用户断开连接                                                                      │root@cirro asterisk cp ~/test.call /var/spool/asterisk/outgoing
-- 正在执行 [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")
[...]

感谢您能够提供的任何帮助。

点赞
用户861388
用户861388

首先,您可以在 app_read 的文档(以及任何其他文档)中看到,它针对执行不正确(通道关闭时)返回不同的值。

此外,这个应用程序提供了一种简化的方法来确定结果:

核心显示应用程序读取

     -=关于应用程序“读取”的信息=-

[概要]
读取变量。

[描述]
从用户中读取一系列数字,有特定数量的字符数,然后将其保存到给定的<variable>中。
本应用程序在完成后设置以下通道参数:
$ {READSTATUS}:这是读取操作的状态。
     OK
     ERROR
     HANGUP
     INTERRUPTED
     SKIPPED
     TIMEOUT

如果这仍然不适合您,您可以直接询问 asterisk 关于 CHANNEL(状态)

PS永远不应该编写具有无限循环的拨号计划或任何其他程序。计算你的循环并在10+时退出。这将为客户节省大量的费用。

2019-01-23 04:47:54