Asterisk:如何以URL形式将数组数据传递给AGI脚本?

时间:2015-03-26 22:04:29

标签: arrays url asterisk agi

研究员stackoverflowers:

我带着一个到目前为止我自己无法解决的问题来到这里。

我希望能够将数据从数组传递到我的Asterisk PBX拨号方案中的AGI脚本,该脚本按以下方式格式化:

exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param1=value1&param2=value2...&paramN=valueN)

但其中一个参数必须接收数组数据,就像它是CGI脚本中的URL参数一样,如:

exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array=value1,value2,value3...,valueN)

我知道AGI脚本能够接收数组作为参数,但是URL形式的AGI脚本的可用文档没有说明如何将数组数据作为脚本参数接收;这就是我在这里发布这个问题的原因。

我已尝试(以不成功的结果)以下列方式传递数据:

  1. 逗号分隔:

    exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array=array_value1,array_value2...,array_valueN)
    
  2. 管分隔的:

    exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array=array_value1|array_value2...|array_valueN)
    
  3. 分号分隔的:

    exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array=array_value1;array_value2...;array_valueN)
    
  4. 但到目前为止,我只是成功地通过以下方式传递数组数据:

    exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array=array_value1&param_array=array_value2...&param_array=array_valueN)
    

    根据我的阅读,这不是将参数传递给URL的正确方法,这是我用来将数据传递给AGI脚本的方式。

    如果有人能够解决这个问题我会非常感激,因为我真的不想像我迄今为止那样单独传递每个数组项目。

3 个答案:

答案 0 :(得分:1)

我会使用引号并用逗号分隔支持的

中的param_array
exten => some_exten,priority,AGI(agi:hostname:port/agi_script.agi?param_array="a=1,b=2,c=3,d=4") 

答案 1 :(得分:1)

在星号中:

exten => s,n,Read(ZIPCODE,,8,3) ;ZIPCODE is my variable
exten => s,n,AGI(query-database.php|${ZIPCODE})

在PHP脚本中查询-database.php:

$zipcode = $argv[1]; Get the value of first var.

答案 2 :(得分:0)

答案不是很正确,也很晚,但是我使用agipython脚本发送和接收变量的方式如下:

上下文:

[agi_demo]
exten => s,1,NoOp()
exten => s,n,AGI(agi://127.0.0.1:4573/demo2,1,2,3,4,5) ; send args 1 2 3 4 5 to demo2 
exten => s,n,Verbose(OK = ${ok}) ; receive variable 'ok' from agi
exten => s,n,Hangup()

调试日志:

-- Executing [s@agi_demo:2] AGI("SIP/trunk-00000016", "agi://127.0.0.1:4573/demo2,1,2,3,4,5") in new stack
-- <SIP/trunk-00000016> Playing 'agi_demo/i_just_called.slin' (escape_digits=12) 
-- <SIP/trunk-00000016>AGI Script agi://127.0.0.1:4573/demo2 completed, returning 0
-- Executing [s@agi_demo:3] Verbose("SIP/trunk-00000016", "OK = AGI Rocks") in new stack
OK = AGI Ricks
    -- Executing [s@agi_demo:4] Hangup("SIP/trunk-00000016", "") in new stack

注意:

  1. 通过发出以下命令来启动快速agi服务器:python3 fast_agi_server.py,它 将开始在127.0.0.1:4573

  2. 上收听
  3. 我的声音文件位于与 context并格式化为WAV PCM 8Khz 16Bits,即:

    /var/lib/asterisk/sounds/agi_demo/i_just_called
    
  4. 来自fast_agi_server.py egg的服务器源代码pystrix

  5. 要使用AGIpystrix发送变量,请使用SetVariable方法:

    agi.execute(pystrix.agi.core.SetVariable("ok", "AGI Rocks"))