当前位置: 首页 > article >正文

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');
});

运行结果


http://www.kler.cn/a/555591.html

相关文章:

  • 基于Spring Boot的售楼管理系统设计与实现(LW+源码+讲解)
  • Unity学习part4
  • LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别
  • faiss库和huggingface_hub库使用产生的错误
  • 【Python爬虫(30)】构建高效爬虫数据管理体系:从抓取到协作
  • java项目之学术成果管理系统源码(ssm+前端+mysql)
  • 视频HDR技术详解,你的电脑怎么播放HDR视频?
  • Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统
  • 英伟达(NVIDIA)芯片全解析:专业分类、应用场景与真实案例
  • 力扣hot100——轮转数组
  • vulfocus/dvwa
  • Linux中使用Docker安装DIFY搭建本地支持库和Agent
  • 16Linux运维网络基础(02网络层次结构)
  • 文心一言大模型的“三级跳”:从收费到免费再到开源,一场AI生态的重构实验
  • Linux上Scapy完全指南:从入门到实战攻防
  • HTML5+CSS多层级ol标签序号样式问题
  • 基于 Java(SpringBoot) +MySQL+ LayUI 开发的物流管理系统
  • 清华大学102页PPT 《deepseek从入门到精通》
  • Java虚拟机(JVM)深度解析
  • 快速入门——SpringBoot 文件上传和拦截器