Asterisk PBX - бесконечный цикл, когда пользователь отключается при использовании приложения «Чтение» из LUA - PullRequest
0 голосов
/ 22 января 2019

Я сейчас настраиваю интерактивные абонентские группы для звездочки, и, поскольку я уже знаю некоторые 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 ожидает его ответа, звездочка заканчивается бесконечным циклом, поскольку d всегда будет nil.

. Я БУДУ проверять d==nil, чтобы обнаружить отключение, но nil также появляется, когда пользователь просто нажимает знак # фунта во время app.read.

До сих пор я использовал циклы for вместо while для ограничениямаксимальное количество итераций, но я бы лучше узнал, как обнаружить отключенный канал.Хотя я не могу найти какую-либо документацию по этому вопросу.

Я также пытался установить расширение h, но программа не пойдет на него, когда пользователь повесит трубку.

ЗвездочкаПодробный вывод:

[...]
-- 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")
[...]

Спасибо за любую помощь, которую вы можете предложить.

1 Ответ

0 голосов
/ 23 января 2019

Прежде всего вы можете увидеть в документах app_read (и в любом другом документе), что он возвращает разные значения для некорректного выполнения (когда канал не работает).

Также это точное приложение предлагает упрощенный способ определения результата:

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

Если это все еще не подходит вам, вы можете напрямую спросить звездочку о канале (штат)

PS Вы НИКОГДА не должны писать план набора номеров или любую другую программу с бесконечным циклом. Подсчитайте свои петли и выйдите на 10+. Это сэкономит ALOT денег для клиента.

...