freesiwtch启用esl,nodejs调用api
1.确认配置
conf/autoload_configs/event_socket.conf.xml
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<param name="nat-map" value="false"/>
<param name="listen-ip" value="::"/>
<param name="listen-port" value="8021"/>
<param name="password" value="ClueCon"/>
<param name="apply-inbound-acl" value="my_custom_acl"/>
<!--<param name="stop-on-bind-error" value="true"/>-->
</settings>
</configuration>
如果不是运行在127.0.0.1需启动apply-inbound-acl访问控制列表授权
2.添加拨打计划(根据实际需要配置,跟连接esl无关)
conf/dialplan/default.xml
<extension name="xxx">
<condition field="destination_number" expression="^10087$">
<action application="park" data=""/>
</condition>
</extension>
park这个配置表示挂起,什么事情都不做,留给程序去实现逻辑
3.nodejs连接esl
git:https://github.com/englercj/node-esl/tree/master
安装库
npm install modesl
index.js
#!/usr/bin/env node
var esl = require('modesl'),
//open a connection
conn = new esl.Connection('xx.xx.xx.xx', 8021, 'ClueCon', function () {
//send the status api command
console.log(1);
conn.api('status', function (res) {
//log result body and exit
console.log(2);
console.log(res.getBody());
// process.exit(0);
});
});
conn.on('esl::connect', function () {
console.log('Connection Ready');
});
conn.on('esl::event::auth::success', function () {
console.log('esl::event::auth::success');
});
conn.on('esl::event::auth::fail', function () {
console.log('esl::event::auth::fail');
});
conn.on('esl::event::CHANNEL_DATAl', function () {
console.log('esl::event::CHANNEL_DATA');
});
conn.on('esl::ready', function () {
console.log('Connection Ready');
});
conn.on('esl::event::**', function (event) {
console.log('ESL Event:', event.getHeader('Event-Name'));
var p = event.getHeader('Caller-Destination-Number');
var a = event.getHeader('Answer-State');
if (p === '10087' && a === 'ringing') {
const uuid = event.getHeader('Unique-ID');
console.log(`Call initiated with UUID: ${uuid}`);
if (uuid.startsWith('-ERR')) {
console.error('Failed to originate call:', uuid);
return;
}
// 应答呼叫
conn.bgapi(`uuid_answer ${uuid}`, (res) => {
console.log('Call answered:', res.getBody());
// 播放音频文件
conn.api(`uuid_broadcast ${uuid} playback!user_busy::/usr/share/freeswitch/sounds/xxx.wav both`, (res) => {
console.log('Playback completed:', res.getBody());
/* 挂断呼叫
conn.api(`uuid_kill ${uuid}`, (res) => {
console.log('Call hung up:', res.getBody());
});*/
});
});
}
});
conn.on('esl::error', function (err) {
console.log('esl::errorr:', err);
});
conn.on('error', function (err) {
console.log('Connection Error:', err);
});
conn.on('esl::end', function () {
console.log('Connection Closed');
});