Asterisk 11 GotoIf 整数比较
Asterisk 11 GotoIf Comparison of Integers
我无法让 GotoIf() 正确比较两个整数。
exten => _X.,n,Set(junky=${RAND(0,1000)})
exten => _X.,n,GotoIf(["${junky}"<"100"]?congest)
...
exten => _X.,n(congest),Log(VERBOSE,"congested " ${EXTEN})
exten => _X.,n,Congestion()
我尝试了无数关于主题的变体,例如:
exten => _X.,n,GotoIf([${junky}<100]?congest)
exten => _X.,n,GotoIf(${junky}<100?congest)
exten => _X.,n,GotoIf($["${junky}"<"100"]?congest)
...似乎没有任何效果。每个变体要么达到 "congest",要么不达到,但无论 junky 的值如何,它都会这样做。
这里有一个我们在 CLI 中看到的示例:
-- Executing [26343434@ts-in:3] Set("SIP/xxx.xxx.xxx.xxx-00000431", "junky=150") in new stack
-- Executing [26343434@ts-in:4] GotoIf("SIP/xxx.xxx.xxx.xxx-00000431", "0?congest") in new stack
在 Asterisk 11 中执行此操作的正确语法是什么?
您提供的示例在左括号前缺少美元符号 ($)。在操作数之间添加空格也是一个好习惯(如果不分隔,旧版本的 Asterisk 可能会在解析时出现问题),它应该如下所示:
exten => _X.,n,GotoIf($[ "${junky}" < "100" ]?congest)
在您提供的详细信息中,评估 returns false 因此调用将继续到下一个优先级(您可以判断,因为 GotoIf 行中问号前有一个零):
-- Executing [26343434@ts-in:3] Set("SIP/xxx.xxx.xxx.xxx-00000431", "junky=150") in new stack
-- Executing [26343434@ts-in:4] GotoIf("SIP/xxx.xxx.xxx.xxx-00000431", "0?congest") in new stack
如果以下优先级失败(例如拨号),呼叫将继续到下一个,依此类推,因此您最终会遇到拥塞。
希望对您有所帮助。
编辑:
我在我的服务器中做了一个例子,它是 运行 Asterisk 11.22,我删除了双引号,因为我们使用的是整数:
exten => 998,1,Set(junky=${RAND(0,1000)})
same => n,GotoIf($[ ${junky} < 100 ]?congest)
same => n,Playback(demo-congrats)
same => n(congest),Hangup()
这是一个示例,其中 GotoIf returns false:
-- Executing [998@from-internal:1] Set("SIP/1001-00009821", "junky=999") in new stack
-- Executing [998@from-internal:2] GotoIf("SIP/1001-00009821", "0?congest") in new stack
-- Executing [998@from-internal:3] Playback("SIP/1001-00009821", "demo-congrats") in new stack
-- <SIP/1001-00009821> Playing 'demo-congrats.ulaw' (language 'es')
-- Executing [998@from-internal:4] Hangup("SIP/1001-00009821", "") in new stack
因为它 returns false,拨号规则将继续,它会播放文件 demo-congrats 然后挂断
这是一个示例,其中 GotoIf returns true:
-- Executing [998@from-internal:1] Set("SIP/1001-00009834", "junky=1") in new stack
-- Executing [998@from-internal:2] GotoIf("SIP/1001-00009834", "1?congest") in new stack
-- Goto (from-internal,998,4)
-- Executing [998@from-internal:4] Hangup("SIP/1001-00009834", "") in new stack
由于评估 returns true 调用转到了跳过播放的拥塞标签。
我认为问题出在引号中,请尝试并告诉我。
我无法让 GotoIf() 正确比较两个整数。
exten => _X.,n,Set(junky=${RAND(0,1000)})
exten => _X.,n,GotoIf(["${junky}"<"100"]?congest)
...
exten => _X.,n(congest),Log(VERBOSE,"congested " ${EXTEN})
exten => _X.,n,Congestion()
我尝试了无数关于主题的变体,例如:
exten => _X.,n,GotoIf([${junky}<100]?congest)
exten => _X.,n,GotoIf(${junky}<100?congest)
exten => _X.,n,GotoIf($["${junky}"<"100"]?congest)
...似乎没有任何效果。每个变体要么达到 "congest",要么不达到,但无论 junky 的值如何,它都会这样做。
这里有一个我们在 CLI 中看到的示例:
-- Executing [26343434@ts-in:3] Set("SIP/xxx.xxx.xxx.xxx-00000431", "junky=150") in new stack
-- Executing [26343434@ts-in:4] GotoIf("SIP/xxx.xxx.xxx.xxx-00000431", "0?congest") in new stack
在 Asterisk 11 中执行此操作的正确语法是什么?
您提供的示例在左括号前缺少美元符号 ($)。在操作数之间添加空格也是一个好习惯(如果不分隔,旧版本的 Asterisk 可能会在解析时出现问题),它应该如下所示:
exten => _X.,n,GotoIf($[ "${junky}" < "100" ]?congest)
在您提供的详细信息中,评估 returns false 因此调用将继续到下一个优先级(您可以判断,因为 GotoIf 行中问号前有一个零):
-- Executing [26343434@ts-in:3] Set("SIP/xxx.xxx.xxx.xxx-00000431", "junky=150") in new stack
-- Executing [26343434@ts-in:4] GotoIf("SIP/xxx.xxx.xxx.xxx-00000431", "0?congest") in new stack
如果以下优先级失败(例如拨号),呼叫将继续到下一个,依此类推,因此您最终会遇到拥塞。
希望对您有所帮助。
编辑:
我在我的服务器中做了一个例子,它是 运行 Asterisk 11.22,我删除了双引号,因为我们使用的是整数:
exten => 998,1,Set(junky=${RAND(0,1000)})
same => n,GotoIf($[ ${junky} < 100 ]?congest)
same => n,Playback(demo-congrats)
same => n(congest),Hangup()
这是一个示例,其中 GotoIf returns false:
-- Executing [998@from-internal:1] Set("SIP/1001-00009821", "junky=999") in new stack
-- Executing [998@from-internal:2] GotoIf("SIP/1001-00009821", "0?congest") in new stack
-- Executing [998@from-internal:3] Playback("SIP/1001-00009821", "demo-congrats") in new stack
-- <SIP/1001-00009821> Playing 'demo-congrats.ulaw' (language 'es')
-- Executing [998@from-internal:4] Hangup("SIP/1001-00009821", "") in new stack
因为它 returns false,拨号规则将继续,它会播放文件 demo-congrats 然后挂断
这是一个示例,其中 GotoIf returns true:
-- Executing [998@from-internal:1] Set("SIP/1001-00009834", "junky=1") in new stack
-- Executing [998@from-internal:2] GotoIf("SIP/1001-00009834", "1?congest") in new stack
-- Goto (from-internal,998,4)
-- Executing [998@from-internal:4] Hangup("SIP/1001-00009834", "") in new stack
由于评估 returns true 调用转到了跳过播放的拥塞标签。
我认为问题出在引号中,请尝试并告诉我。