【问题标题】:How to set Asterisk call log CDR database fields from AMI ORIGINATE如何从 AMI ORIGINATE 设置 Asterisk 呼叫日志 CDR 数据库字段
【发布时间】:2013-02-18 20:41:02
【问题描述】:

我在 PHP 中使用 Asterisk 管理接口 (AMI) 发起出站呼叫。下面是我正在使用的代码的 sn-p:

// snippet
// $num is the number to dial e.g. 0207 121 3456
// $ext is the extension use to make the call e.g. 101
// $name is the name of the caller e.g. Fred Flintstone
//
fputs($socket, "Action: Originate\r\n" );
fputs($socket, "Channel: SIP/$ext\r\n" );
fputs($socket, "Exten: $num\r\n" );
fputs($socket, "Context: from-internal\r\n");
fputs($socket, "Priority: 1\r\n" );
fputs($socket, "CallerID: \"".$name."\" <".$num.">\r\n" );
fputs($socket, "Async: yes\r\n\r\n" );

如何设置呼叫者姓名 ($name) 或写入 asteriskcdrdb 的其他详细信息以用于发起脚本中的出站呼叫?理想情况下,我想以与设置呼入字段相同的方式设置 dst 字段。

【问题讨论】:

    标签: php asterisk cdr


    【解决方案1】:

    您可以将任何变量置于动作中:

        fputs($socket, "Action: Originate\r\n" );
        fputs($socket, "Channel: SIP/201\r\n" );
        fputs($socket, "Exten: 1234\r\n" );
        fputs($socket, "Account: FOOBAR\r\n" );
        fputs($socket, "Context: from-internal\r\n" );
        fputs($socket, "Priority: 1\r\n" );
        fputs($socket, "WaitTime: 15\r\n" );
        fputs($socket, "Callerid: 123456\r\n" );
        fputs($socket, "Variable: CDR(userfield)=AnyData\r\n\r\n" );
        $wrets=fgets($socket,128);
        echo $wrets;
    

    【讨论】:

      【解决方案2】:

      originate 之后,您可以解析输出以查找频道 ID,然后您可以使用 Setvar 设置 CDR(userfield) 或 CDR(accouncode) ...等。

      我的例子:

      fputs($socket, "Action: Originate\r\n");
      fputs($socket, "Channel: $userExt\r\n");
      fputs($socket, "Context: $AMIcntx\r\n");
      fputs($socket, "Exten: $phoneNum\r\n");
      fputs($socket, "Priority: 1\r\n");
      
      $chan=true;
      $channelID=0;
      
      while (!feof($socket))
      {
          if ($chan && preg_match("#Channel: ([a-zA-Z0-9\\/-]+)#", $wrets, $cm))
          {
              $channelID = $cm[1];        
              fputs($socket, "Action: Setvar\r\n");
              fputs($socket, "Channel: $channelID\r\n");
              fputs($socket, "Variable: CDR(userfield)\r\n");
              fputs($socket, "Value: FOOBAR\r\n\r\n");        
              fputs($socket, "Action: Logoff\r\n\r\n");
              $chan = false; //There are various Channel response, not overwrite.
          }
          //Further parsing of the AMI response go heres
      }
      

      SetVar 仅为指定通道设置变量。您必须在通话结束之前尽早发送 setvar 命令。

      如果您可以编辑您的拨号计划(我不能,因为我使用 freepbx),另一种方法是为 ami 调用创建一个特定的上下文,将一些变量从始发地传递到上下文,将 this vars 设置为 CDR在拨号方案中。

      【讨论】:

        【解决方案3】:

        您不需要使用 Action: Setvar 来设置 CDR(accountcode) ,您只需在呼叫发起期间添加以下行

                   fputs($socket, "Account: FOOBAR\r\n" );
        

        以下是完整示例

               fputs($socket, "Action: Originate\r\n" );
                fputs($socket, "Channel: SIP/201\r\n" );
                fputs($socket, "Exten: 1234\r\n" );
                fputs($socket, "Account: FOOBAR\r\n" );
                fputs($socket, "Context: from-internal\r\n" );
                fputs($socket, "Priority: 1\r\n" );
                fputs($socket, "WaitTime: 15\r\n" );
                fputs($socket, "Callerid: 123456\r\n\r\n" );
                $wrets=fgets($socket,128);
                echo $wrets;
        

        【讨论】:

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