asterisk事件监控
asterisk有一个很好的东东,就是Event,会主动通知客户端服务器发生了什么……不过前提是你得先连上服务器。
好,不废话了,下面开工。
首先声明下环境:CentOS 6
一、安装并配置asterisk
1、下载asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.8.7.1.tar.gz
2、解压并安装
tar zxvf asterisk-1.8.7.1.tar.gz
cd asterisk-1.8.7.1
./configure && make && make install && make samples
涉及的命令:
yum install libxml2-devel
yum install ncurses-devel
3、开启AMI管理
编辑manager.conf文件,将general中的enabled置为yes
添加管理员:
[admin]
secret = 123456
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,user,config,command,reporting,originate
二、编写Asterisk事件监控程序
原理:通过login action连上Asterisk的5038端口,监听此端口并把消息输出。
下面是C++实现的代码:
1 /* 2 File : asteriskEventCat.cpp 3 Author : Mike 4 E-Mail : Mike_Zhang@live.com 5 */ 6 7 #include <iostream> 8 #include <string> 9 #include <fstream>10 #include <boost/asio.hpp>11 #define BLOCK_SIZE 10*102412 13 using namespace std;14 using namespace boost::asio;15 16 string strLogin(string userName,string pswwd)17 {18 string msg="";19 msg = "Action: login\r\n";20 msg += "UserName: " + userName + "\r\n";21 msg += "Secret: " + pswwd + "\r\n";22 msg += "\r\n"; 23 return msg;24 }25 26 int main()27 {28 io_service iosv;29 ip::tcp::socket s(iosv);30 string svrIp = "";31 cout<<"Input server ip : ";32 cin>>svrIp;33 ip::tcp::endpoint ep(ip::address_v4::from_string(svrIp.c_str()),5038);34 35 boost::system::error_code ec; 36 s.connect(ep,ec); 37 if(ec)38 {39 cout << boost::system::system_error(ec).what() << endl; 40 return -1; 41 } 42 else43 {44 cout<<"Connect success!"<<endl;45 }46 47 string msg="";48 49 string userName,password;50 cout<<"User : ";51 cin>>userName;52 cout<<"Password : ";53 cin>>password;54 55 msg += strLogin(userName.c_str(),password.c_str());56 // msg += strLogin("admin","admin");57 size_t len = s.write_some(buffer(msg.c_str()), ec);58 if(len <= 0)59 {60 cout<<"Send message fail!"<<endl;61 return -1;62 }63 64 std::ofstream fout("EventCat.txt");65 while(true)66 {67 char buf[BLOCK_SIZE] = {0};68 len=s.read_some(buffer(buf), ec); 69 if(len<=0)70 break;71 cout.write(buf, len); 72 fout<<buf;73 fout.flush();74 } 75 76 return 0;77 }
三、进行事件监控
首先要保证你的防火墙让你过5038端口,嫌配置麻烦的话把防火墙关闭就行了,下面是运行效果:
我这人比较懒,虽是所谓的C/C++程序员,可是总嫌C++写的代码多,经常用python做模型,
下面是我之前写的,这里也顺便粘出来一起总结,仅供参考,欢迎拍砖。
Python代码:
''' File : asteriskEventCat.py Author : Mike E-Mail : Mike_Zhang@live.com ''' import socketbufLen = 1024 * 10 def strLogin(userName,passwd): msg = 'Action: login\r\n' msg += 'UserName: '+userName+'\r\n' msg += 'Secret: '+passwd+'\r\n' msg += '\r\n' return msg def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((raw_input("Input ip : "), 5038)) ifnot s : print"Connect fail!" return s.send(strLogin(raw_input("Input user name :"),raw_input("Input password :"))) whileTrue: data = s.recv(bufLen) iflen(data) <=0 : continue print data if __name__ == '__main__': main() raw_input("Press Enter to continue")
现在在学习go语言,捎带下,也方便我以后Ctrl + C:
/* File : asteriskEventCat.go Author : Mike E-Mail : Mike_Zhang@live.com */ package mainimport ( "net" "bufio" "os" )var bufLen = 1024 * 10 var lineLen = 2 // windows : "\r\n" 2 ; linux : "\n" 1func main() { reader := bufio.NewReader(os.Stdin) print("Input ip : ") ; svrIp, _ := reader.ReadBytes('\n') print("Input userName : ") ; usrName, _ := reader.ReadBytes('\n') print("Input passwd : ") ; pwd, _ := reader.ReadBytes('\n') conn,err := net.Dial("tcp",string(svrIp[0:len(svrIp)-lineLen])+":5038") defer conn.Close() if err != nil { println("Error : ",err.Error()) //In go 1 , use err.Error() ,not err.String() } conn.Write([]byte("Action: login\r\nUserName: "+ string(usrName[0:len(usrName)-lineLen])+"\r\nSecret: "+ string(pwd[0:len(pwd)-lineLen])+"\r\n\r\n")) for { p := make([]byte,bufLen) sz, _ := bufio.NewReader(conn).Read(p) println(string(p[0:sz])) } }
好,就这些了,希望对你有帮助。
asterisk事件监控相关推荐
- inotify 实时的Linux文件系统事件监控
标签:inotifywait 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cqfish.blog.51cto.com/6222 ...
- python线程监控配置文件_一日一技:Python多线程的事件监控
一日一技:Python多线程的事件监控 设想这样一个场景: 你创建了10个子线程,每个子线程分别爬一个网站,一开始所有子线程都是阻塞等待.一旦某个事件发生:例如有人在网页上点了一个按钮,或者某人在命令 ...
- inotify之文件系统事件监控使用入门
inotify是linux文件系统事件监控机制,功能强大,控制简单,可以实现很多有用的功能.如:当一个文件被访问.打开.关闭.移动.删除等等时做一些处理.此功能需要内核支持,从kernel 2.6.1 ...
- 2、Qt Project之鼠标事件监控
鼠标事件监控: 对于鼠标时间监控的相关操作,我们在简历工程的时候需要选择的是QWidget基类,不选择QMainWindow基类,如下所示: Base class:QWidget Step1:我们首先 ...
- 【新功能发布】事件监控升级-支持自动化处理云产品异常
背景 系统事件监控为用户提供各类云产品产生的系统事件的统一统计和查询入口,使得用户明确知晓云产品的使用状态,让云更透明. 事件监控详细介绍 ECS 事件介绍及应对建议 本月的新版本,支持在这些产品的系 ...
- WINDOWS键盘事件监控原理及应用 (转)
WINDOWS键盘事件监控原理及应用 (转)[@more@]windows键盘事件监控原理及应用 赵桂华 ·逸仙时空 WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种 ...
- kubernetes事件监控
1.什么是kubernetes事件 Kubernetes Events 是一种 Kubernetes 资源对象,记录了某个组件在某个时间做了某个动作,用于展示集群内发生的情况,当 Kubernetes ...
- Spring项目接入微信关注/取消关注事件监控(含代码demo,自动回复图文)
微信官方文档地址:关注/取消关注事件 | 微信开放文档 以上,文档提到:用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL,接下来我们就来看看这个URL怎么配置. [配置步骤]: ...
- inotify事件监控
一.原理: inotify事件监控,可以监控文件系统中添加,删除,修改,移动等各种事件,一旦发现数据彼此不同,会通知rsync同步推送数据.inotify + rsync可以时时同步 二.准备工作 1 ...
最新文章
- Sphinx+gitee+Read the Docs搭建在线文档系统
- linux运行脚本报错:/bin/bash^M: bad interpreter: No such file or directory(dos2unix )(/bin/sh^M)(回车符、换行符)
- VTK:模型之ContourTriangulator
- 关键词热度分析工具_阿里国际站外贸独立站关键词的收集
- [软技能] png-8和png-24有什么区别?
- android 遍历所有view,Android 算法:遍历ViewGroup找出所有子View
- 网络常用协议 SSH、SSL
- 前端50个精美登录注册模板(觉得好用帮我点个赞呗)
- 上海链家二手房交易数据分析
- 十、PWM脉宽调制信号的发生与控制
- HTML 音乐播放器界面
- 回溯算法-八皇后问题
- Oracle环境变量配置
- 自然语言处理(NLP)- 一个英文拼写纠错系统
- Graphics2D 在一张图片上添加一个带有透明背景的图片或绘制透明图片
- 普通话考试易错字、鼻音、HF发声
- Java面试-001
- asp.net模糊查询
- 重载函数是什么意思?
- Tableau基础-第三章(快速表计算)
热门文章
- 离散数学中偏序关系_离散数学中偏序关系的应用研究.docx
- jquery dwn 开发学习
- 【排错】故障处理思路客户端通过DHCP获取不到地址
- Jenkins 定时任务触发时间表达式 -Poll SCM
- GXY_CTF wp
- PAT-python-1096 大美数
- arcgis java 二次开发_arcgis二次开发_cad二次开发_java arcgis二次开发
- 【观察】后疫情时代,数据中心效率与成本的“平衡术”
- 手机您的浏览器不允许第三方_学会这几个设置,vivo手机浏览器比第三方APP更好用...
- flash电子书的书签功能