Javascript 如何将星号ARI与socket.io一起使用&;Node.js
最近,我开始接触asterisk、Linux、node.js和最近的socket.io,以便最终为asterisk制作实时web应用程序 因此,作为一个受过教育的猜测,我已经能够看到Node.js就像是星号和套接字之间的中间人。但我不知道如何通过socket.io将信息从asterisk拉到网页上 我一直在研究socket.io,几天来一直在弄不清楚如何将它们链接起来,例如,我可以记录停滞期发生的事件,或者在电话会议中调出当前的电话,这是目前为止的任何事情,而且据我所知,ARI是相对较新的,所以我很难弄清楚这一点 我在下面链接了3个文件,让您了解我们一直在做什么,bridge-mixed.js基于asterisk ARI文档中给出的一个示例 我可以通过node.js运行该文件,拨我在extensions.conf文件中指定的扩展名,当第一个用户进入会议播放音乐时,一旦超过1个用户进入,就停止音乐 至于其他两个文件,它只是一个基本的socket.io应用程序,通过YouTube指南一步一步地了解它的工作原理 我只需要一个简单的例子,说明如何塑造它们或使它们协同工作,开始为asterisk制作实时web应用程序 即使我能够通过socket.io和Node.js将停滞期事件拉到网页上 希望你们能提供一些见解或指导,因为我现在真的很迷茫 bridge mixed.jsJavascript 如何将星号ARI与socket.io一起使用&;Node.js,javascript,jquery,node.js,socket.io,asterisk,Javascript,Jquery,Node.js,Socket.io,Asterisk,最近,我开始接触asterisk、Linux、node.js和最近的socket.io,以便最终为asterisk制作实时web应用程序 因此,作为一个受过教育的猜测,我已经能够看到Node.js就像是星号和套接字之间的中间人。但我不知道如何通过socket.io将信息从asterisk拉到网页上 我一直在研究socket.io,几天来一直在弄不清楚如何将它们链接起来,例如,我可以记录停滞期发生的事件,或者在电话会议中调出当前的电话,这是目前为止的任何事情,而且据我所知,ARI是相对较新的,所以
/*jshint node:true*/
'use strict';
var ari = require('ari-client');
var util = require('util');
var chanArr =[];
ari.connect('http://localhost:0001', 'asterisk', 'asterisk', clientLoaded);
// handler for client being loaded
function clientLoaded (err, client) {
if (err) {
throw err;
}
// find or create a holding bridge
var bridge = null;
client.bridges.list(function(err, bridges) {
if (err) {
throw err;
}
bridge = bridges.filter(function(candidate) {
return candidate.bridge_type === 'mixing';
})[0];
if (bridge) {
console.log(util.format('Using bridge %s', bridge.id));
} else {
client.bridges.create({type: 'mixing'}, function(err, newBridge) {
if (err) {
throw err;
}
bridge = newBridge;
console.log(util.format('Created bridge %s', bridge.id));
});
}
});
// handler for StasisStart event
function stasisStart(event, channel) {
console.log(util.format(
'Channel %s just entered our application, adding it to bridge %s',
channel.name,
bridge.id));
channel.answer(function(err) {
if (err) {
throw err;
}
bridge.addChannel({channel: channel.id}, function(err) {
chanArr.push(channel)
if (err) {
throw err;
}
//If else statement to start music for first user entering channel, music will stop once more than 1 enters the channel.
if(chanArr.length <= 1){
bridge.startMoh(function(err) {
if (err) {
throw err;
}
});
}else{
bridge.stopMoh(function(err) {
if (err) {
throw err;
}
});
}
});
});
}
// handler for StasisEnd event
function stasisEnd(event, channel) {
chanArr = null;
console.log(util.format(
'Channel %s just left our application', channel.name));
}
client.on('StasisStart', stasisStart);
client.on('StasisEnd', stasisEnd);
client.start('bridge-hold');
}
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
nicknames = [];
server.listen(0001);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.on('new user', function (data, callback) {
if (nicknames.indexOf(data) != -1) {
callback(false);
} else {
callback(true);
socket.nickname = data;
nicknames.push(socket.nickname);
updateNicknames();
}
});
function updateNicknames() {
io.sockets.emit('usernames', nicknames);
}
socket.on('send message', function (data) {
io.sockets.emit('new message', {
msg : data,
nick : socket.nickname
});
});
socket.on('disconnect', function (data) {
if (!socket.nickname)
return;
nicknames.splice(nicknames.indexOf(socket.nickname), 1);
updateNicknames();
});
});
index.html
<html>
<head>
<title> Chat with socket.io and node.js</title>
<style>
#chat{
height:500px;
}
#contentWrap{
display:none;
}
#chatWrap{
float:left;
border:1px #000 solid;
}
.error{
color:red;
}
.whisper{
color:gray;
font-style:italic;
}
</style>
</head>
<body>
<div id="nickWrap">
<p>Enter a Username</p>
<p id="nickError"></p>
<form id="setNick">
<input size="35" id="nickname"></input>
<input type="submit"></input>
</form>
</div>
<div id="contentWrap">
<div id="chatWrap">
<div id="chat"></div>
<form id="send-message">
<input size="35" id="message"></input>
<input type="submit"></input>
</form>
</div>
<div id="users"></div>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.6.js"></script>
<script>
jQuery(function($){
var socket = io.connect();
var $nickForm = $('#setNick');
var $nickError = $('#nickError');
var $nickBox = $('#nickname');
var $users = $('#users');
var $messageForm = $('#send-message');
var $messageBox = $('#message');
var $chat = $('#chat');
$nickForm.submit(function(e){
e.preventDefault();
socket.emit('new user', $nickBox.val(), function(data){
if(data){
$('#nickWrap').hide();
$('#contentWrap').show();
} else{
$nickError.html('That username is already taken! Try Again.');
}
});
$nickBox.val('');
});
socket.on('usernames', function(data){
var html ='';
for(i=0; i < data.length; i++){
html += data[i] + '<br/>'
}
$users.html(html);
});
$messageForm.submit(function(e){
e.preventDefault();
socket.emit('send message', $messageBox.val(), function(data){
$chat.append('<span class="error"><b>' + data + "</span><br/>");
});
$messageBox.val('');
});
socket.on('new message', function(data){
$chat.append('<span class="msg"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>");
});
socket.on('whisper', function(data){
$chat.append('<span class="whisper"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>");
});
});
</script>
</body>
</html>
与socket.io和node.js聊天
#聊天{
高度:500px;
}
#内容包装{
显示:无;
}
#聊天包{
浮动:左;
边框:1px#000实心;
}
.错误{
颜色:红色;
}
.耳语{
颜色:灰色;
字体:斜体;
}
输入用户名
jQuery(函数($){
var socket=io.connect();
var$nickForm=$(“#setNick”);
变量$nickeror=$('#nickeror');
var$nickBox=$(“#昵称”);
var$users=$(“#users”);
var$messageForm=$(“#发送消息”);
var$messageBox=$(“#message”);
var$chat=$(“#chat”);
$nickForm.submit(函数(e){
e、 预防默认值();
emit('new user',$nickBox.val(),函数(数据){
如果(数据){
$('nickWrap').hide();
$('#contentWrap').show();
}否则{
$nickeror.html('该用户名已被占用!请重试');
}
});
$nickBox.val(“”);
});
socket.on('usernames',函数(数据){
var html='';
对于(i=0;i
}
$users.html(html);
});
$messageForm.submit(函数(e){
e、 预防默认值();
emit('send message',$messageBox.val(),函数(数据){
$chat.append(“”+data+“
”);
});
$messageBox.val(“”);
});
socket.on('new message',函数(数据){
$chat.append(“”+data.nick+’:“+data.msg+”
);
});
socket.on(‘耳语’)功能(数据){
$chat.append(“”+data.nick+’:“+data.msg+”
);
});
});
因此,在经过一些尝试和错误之后,可以通过有效地合并bridge-mixed.js和app.js文件使它们协同工作。完成后,我可以开始通过ARI客户端访问星号端的信息,并开始通过socket.io将其传递给实时web应用程序作为星号前端
我目前发布的代码只是将当前的呼叫者名称附加到网页上,但这是一个基本的例子,它应该是一个很好的垫脚石,看看你可以用它做什么,因为那里的信息可以很容易地开始使用JQuery开始做所有好的事情……例如静音呼叫,桥接会议中的用户。这些是我目前正在做的事情,将来会更新
我希望这对某人有帮助
app.js(ARI客户端和Socket.io服务器端)
ARI函数和socket.io服务器端
var ari = require('ari-client');
var util = require('util');
var chanArr = [];
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
//ARI client
ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded);
function clientLoaded(err, client) {
if (err) {
throw err;
}
// find or create a holding bridges
var bridge = null;
client.bridges.list(function (err, bridges) {
if (err) {
throw err;
}
bridge = bridges.filter(function (candidate) {
return candidate.bridge_type === 'mixing';
})[0];
if (bridge) {
console.log(util.format('Using bridge %s', bridge.id));
} else {
client.bridges.create({
type : 'mixing'
}, function (err, newBridge) {
if (err) {
throw err;
}
bridge = newBridge;
console.log(util.format('Created bridge %s', bridge.id));
});
}
});
// handler for StasisStart event
function stasisStart(event, channel) {
console.log(util.format(
'Channel %s just entered our application, adding it to bridge %s',
channel.name,
bridge.id));
channel.answer(function (err) {
if (err) {
throw err;
}
bridge.addChannel({
channel : channel.id
}, function (err) {
var id = chanArr.push(channel.name)
console.log("User: " + channel.name);
if (err) {
throw err;
}
//If else statement to start music for first user entering channel, music will stop once more than 1 enters the channel.
if (chanArr.length <= 1) {
bridge.startMoh(function (err) {
if (err) {
throw err;
}
});
} else {
bridge.stopMoh(function (err) {
if (err) {
throw err;
}
});
}
});
});
}
// handler for StasisEnd event
function stasisEnd(event, channel) {
chanArr = null;
console.log(util.format(
'Channel %s just left our application', channel.name));
}
client.on('StasisStart', stasisStart);
client.on('StasisEnd', stasisEnd);
client.start('bridge-hold');
}
//Socket.io logic here
server.listen(3009, function () {
console.log('listening on *:3009');
});
app.use(express.static(__dirname + '/public'));
app.get('/', function (req, res) {
res.sendfile(__dirname + "/testPage.html");
});
io.sockets.on('connection', function () {
updateSip();
});
function updateSip() {
io.sockets.emit('sip', chanArr);
}
var-ari=require('ari-client');
var util=require('util');
var chanArr=[];
var express=require('express'),
app=express(),
server=require('http')。createServer(应用程序),
io=require('socket.io')。侦听(服务器);
//ARI客户端
ari.connect('http://localhost:8088“,”星号“,”星号“,”客户端加载);
已加载函数clientLoaded(错误,客户端){
如果(错误){
犯错误;
}
//找到或创建一个保持桥
var桥=null;
client.bridges.list(函数(err,bridges){
如果(错误){
犯错误;
}
桥=桥。过滤器(功能(候选){
return candidate.bridge_type==='mixed';
})[0];
国际单项体育联合会(桥){
日志(util.format('usingbridge%s',bridge.id');
<html>
<head>
<title> Chat with socket.io and node.js</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.0/css/bootstrap-toggle.min.css" rel="stylesheet">
<link href="/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-header">
<div class="navbar-brand">Asterisk ARI Test Application</div>
</div>
<div id="navbar" class="navbar-collapse collapse">
</div>
</nav>
<div class="main-bridge">
<div class="container">
<div class="jumbotron content-A">
<form class="test-ari">
<p class="lead">Enter the number you want to call.</p>
<div class="input-group input-group-lg">
<input type="tel" class="form-control" placeholder="Phone Number" aria-describedby="sizing-addon1" required="" />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">Call Back Now</button>
</span>
</div>
</form>
</div>
</div>
</div>
<div class="secondary-bridge" id="sip">
<h3 class="conf-head">Conference call</h3>
<div class="panel panel-default ">
<div class="panel-heading " >
<h3 class="panel-title"><div id="sip"></div></h3>
</div>
<div class="panel-body">
<input type="checkbox" data-on="Voice" data-off="Muted" checked data-toggle="toggle" data-onstyle="success" data-offstyle="danger">
<button class="btn btn-default kick" id="kick" data-toggle="modal" data-target="#myModal" type="submit">Kick</button>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Kick user</h4>
</div>
<div class="modal-body">
Are you you want to kick this user?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">No</button>
<button type="button" class="btn btn-primary">Yes</button>
</div>
</div>
</div>
</div>
<footer class="footer">
<p>© User 2015</p>
</footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.0/js/bootstrap-toggle.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.6.js"></script>
<script src="/js/test.js"></script>
</body>
</html>
jQuery(function ($) {
var socket = io.connect();
var $sip = $('#sip');
socket.on('sip', function (data) {
var sip = '';
for (i = 0; i < data.length; i++) {
sip += data[i] + '<br/>'
}
$sip.append('<h3 class="conf-head">Conference call</h3> \
<div class="panel panel-default ">\
<div class="panel-heading " >\
<h3 class="panel-title">' + sip + '</h3>\
</div>\
<div class="panel-body">\
<input type="checkbox" data-on="Voice" data-off="Muted" checked data-toggle="toggle" data-onstyle="success" data-offstyle="danger">\
<button class="btn btn-default kick" id="kick" data-toggle="modal" data-target="#myModal" type="submit">Kick</button>\
</div>\
</div>');
});
$('.kick').click(function () {
$('#myInput').focus()
});
});