随笔 - 272  文章 - 0  评论 - 283  阅读 - 142万

扩展Asterisk1.8.7的AMI接口

AsteriskAMI接口已经很丰富了,如果需要扩展,可以参考本文。

一、扩展AsteriskAMI接口

涉及文件:main/manager.c

1、函数注册

添加 myOriginate接口

在函数int __init_manager(int reload)中添加如下代码:

ast_manager_register_xml("myOriginate", EVENT_FLAG_ORIGINATE,action_myOriginate); // Add by Mike

2、功能实现:

复制代码
View Code
//Add by Mike
static int action_myOriginate(struct mansession *s, const struct message *m)
{
        const char *name = astman_get_header(m, "Channel");
        const char *exten = astman_get_header(m, "Exten");
        const char *context = astman_get_header(m, "Context");
        const char *priority = astman_get_header(m, "Priority");
        const char *timeout = astman_get_header(m, "Timeout");
        const char *callerid = astman_get_header(m, "CallerID");

        char tmp[256];
        int i=0;
        sprintf(tmp,"%ld_%s",time(NULL),name);
        int tmpLen = strlen(tmp);
        for(i=0;i<tmpLen;++i)
        {
                if(isalnum(tmp[i]))
                        continue;
                tmp[i]='_';
        }
        char fileName[1024]={0};
        sprintf(fileName,"/var/spool/asterisk/outgoing/%s.call",tmp);
        // FILE *fp = fopen("/var/spool/asterisk/outgoing/1.call","w");
        FILE *fp = fopen(fileName,"w");
        char buf[1024]={0};
        sprintf(tmp,"channel: %s\r\n",name);
        strcpy(buf,tmp);
        sprintf(tmp,"Callerid: %s\r\n",callerid);
        strcat(buf,tmp);
        strcat(buf,"MaxRetries: 1\r\n");
        strcat(buf,"RetryTime: 1\r\n");
       // sprintf(tmp,"WaitTime: %s\r\n",timeout);
        sprintf(tmp,"WaitTime: %s\r\n","30");
        strcat(buf,tmp);
        sprintf(tmp,"Context: %s\r\n",context);
        strcat(buf,tmp);
        sprintf(tmp,"Extension: %s\r\n",exten);
        strcat(buf,tmp);
        sprintf(tmp,"Extension: %s\r\n",exten);
        strcat(buf,tmp);
        fwrite((void*)buf,strlen(buf),1,fp);
        fclose(fp);
        return 0;
}
复制代码

二、配置Asterisk

1、编译安装

make && make install

2、添加拨号方案

在文件/etc/asterisk/extension.conf中加入以下代码:

[DLPN_MeetingWithOutRecord]
exten =>_63XX,1,Answer()
exten =>_63XX,n,MeetMe(${EXTEN},Mw,1234)
exten =>_63XX,n,Hangup()

三、AMI调用测试(Python):

复制代码
View Code
#! /usr/bin/python

import socket

def strLogin(usr,pwd):
        msg = "Action: login\r\n"
        msg += "Events: off\r\n"
        msg += "UserName: " + usr + "\r\n"
        msg += "Secret: " + pwd + "\r\n"        
        msg += "\r\n"
        return msg

def strCall(strNum,strCallid):
        msg = "Action: myOriginate\r\n"
        msg += "Channel: SIP/"+strNum+"\r\n"
        msg += "WaitTime: 1\r\n"
        msg += "CallerId: "+strCallid+"\r\n"
        msg += "Exten: "+strCallid+"\r\n"
        msg += "Context: DLPN_MeetingWithOutRecord\r\n"
        msg += "Priority: 1\r\n"
        msg += "\r\n"
        return msg

def strLogoff():
        return "Action: logoff\r\n\r\n"

def strHangUp(strNum):
        msg = "Action: Hangup\r\n"
        msg += "Channel: SIP/"+strNum
        return msg

def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((raw_input("IP : "), 5038))

        if not s :
                print "Connect fail!"
                return
        else : print "Connect success!"

        strNum = raw_input("Input number to dail:")
        strCallerId = raw_input("Input caller id :")
        msg = ""
        msg += strLogin(raw_input("username :"),raw_input("password"))
        msg += strCall(strNum,strCallerId)
        msg += strLogoff()

        s.send(msg)

        while True:
                data = s.recv(1024)
                if not data : break
                else :  print data

        s.close()

if __name__ == '__main__':
        main()
        #raw_input("Press Enter to continue")
复制代码

好,就这些了,希望对你有帮助。

posted on   Mike_Zhang  阅读(2508)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2012年6月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示