【问题标题】:Asterisk Hangup Handler using lua使用 lua 的星号挂断处理程序
【发布时间】:2016-09-06 14:55:21
【问题描述】:

我正在尝试在我的拨号计划中添加一个挂断处理程序,以捕获来自多个分机的拨号未应答的呼叫。但不幸的是,我的挂断处理程序根本没有执行。 下面是我的 extensions.lua

CONSOLE = "Console/dsp" -- Console interface for demo
IAXINFO = "guest"       -- IAXtel username/password
TRUNK = "SIP"

GSMTRUNK = "Dongle/dongle0/"
PRITRUNK = "DAHDI/g0/"
TRUNKMSD = 1
local inspect = require ('inspect')
--from here onwards our logic is there Rajesh
function dialtomobind(number)
        app.Dial(GSMTRUNK..number, 50,'egb(add-hangup-handler^'..number..'^1)')
        local dialstatus = channel['DIALSTATUS']:get()
        app.NoOp('DIAL STATUS:'..dialstatus)
        app.Hangup(16)
end

function add_hangup_handler(context, extension)
        channel['hangup_handler_push']='hangup-handlers,s,1'
        app.NoOp('pre-dial handler, Adding Hangup Handler'..channel['hangup_handler_push']:get())
        app.Return()
end

function h_handler(context, extension)
        app.NoOp('After Hangup:'..extension)
        --app.DumpChan(3)
end

function directdialing(c,e)
        app.Answer(5)
        app.Playback('tt-monkeys')
        dialtomobind(string.sub(e, 4))
        app.Hangup(16)
end


function hangup_handler_1(c,e)
        --channel['hangup_handler_push']
        app.NoOp('Hangup Handler 1 Executed')
        app.Return()
end

extensions = {
        ['from-internal-sip']={
                ['h']=h_handler;
                ['_500XXXXXXXXXX']=directdialing;
        };
        ['dongle_incoming']={
                ['_.']=gsm_dongle_handler;
        };
        ['add-hangup-handler']={
                ['_.']=add_hangup_handler;
        };
        ['hangup-handlers']={
                ['_.']=hangup_handler_1;
        };
}

ASTERISK CLI 输出:

    -- Executing [5008884882772@from-internal-sip:1] Answer("SIP/8884882772-00000047", "5")
       > 0x7f14c80072a0 -- Probation passed - setting RTP source address to 192.168.2.30:54032
[Aug 29 18:24:17] NOTICE[26470][C-000000c5]: res_rtp_asterisk.c:4478 ast_rtp_read: Unknown RTP codec 95 received from '192.168.2.30:54032'
    -- Executing [5008884882772@from-internal-sip:1] Playback("SIP/8884882772-00000047", "tt-monkeys")
    -- <SIP/8884882772-00000047> Playing 'tt-monkeys.gsm' (language 'en')
    -- Executing [5008884882772@from-internal-sip:1] Dial("SIP/8884882772-00000047", "Dongle/dongle0/8884882772,50,egb(add-hangup-handler^8884882772^1)")
    -- Dongle/dongle0-010000000e Internal Gosub(add-hangup-handler,8884882772,1) start
    -- Executing [8884882772@add-hangup-handler:1] NoOp("Dongle/dongle0-010000000e", "pre-dial handler, Adding Hangup Handlerhangup-handlers,s,1")
    -- Executing [8884882772@add-hangup-handler:1] Return("Dongle/dongle0-010000000e", "")
  == Spawn extension (dongle_incoming, 5008884882772, 1) exited non-zero on 'Dongle/dongle0-010000000e'
    -- Dongle/dongle0-010000000e Internal Gosub(add-hangup-handler,8884882772,1) complete GOSUB_RETVAL=
    -- Called Dongle/dongle0/8884882772
    -- Dongle/dongle0-010000000e is making progress passing it to SIP/8884882772-00000047
  == Spawn extension (from-internal-sip, 5008884882772, 1) exited non-zero on 'SIP/8884882772-00000047'
    -- Executing [h@from-internal-sip:1] NoOp("SIP/8884882772-00000047", "After Hangup:h")

【问题讨论】:

    标签: lua asterisk


    【解决方案1】:

    挂断处理程序是拨号方案处理程序。

    因此,如果您想使用它,请在挂起时在提交的上下文/扩展名处启动其他 lua 脚本。

    扩展 hangup-handlers,s,1 有效且存在。

    你用过

    app.Set('CHANNEL(hangup_handler)=hangup-handlers,s,1');
    

    因为它不是变量,它是函数。

    【讨论】:

    • 我有有效的上下文和 catch-all 扩展,但它仍然没有被星号调用。我上面的代码有什么问题吗?还是 lua 扩展没有挂断处理程序的功能?
    • 调试不是 SO 的主题(参见规则。尝试 app.Set('CHANNEL(hangup_handler)=hangup-handlers,s,1');
    • 谢谢,app.Set 方法有效,但不适用于两种 lua 通道变量方法。 1) channel.hangup_handler_push='hangup-handlers,s,1' 2) channel['hangup_handler_push']='hangup-handlers,s,1' @arheops 用 app.Set 方法改变你的答案,这样我就可以标记为正确答案
    【解决方案2】:
    1. hangup_handler_push 根本不是通道变量。所以无法使用以下方法访问。

      channel['hangup_handler_push']='hangup-handlers,s,1'
      

      channel['hangup_handler_push']='hangup-handlers,s,1'
      
    2. 要设置挂断处理程序,我们必须使用拨号计划函数 CHANNEL(https://wiki.asterisk.org/wiki/display/AST/Hangup+Handlers)。所以下面的方法会起作用。

      channel.CHANNEL('hangup_handler_push'):set('hangup-handlers,s,1')
      
    3. As Asterisk Set Application 可以用来设置通道变量,也可以调用星号函数。所以下面的代码也可以工作。

      app.Set('CHANNEL(hangup_handler)=hangup-handlers,s,1');
      

    参考: Lua 中的拨号计划功能 https://wiki.asterisk.org/wiki/pages/viewpage.action?pageId=16548029

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多