无法从 FREESWITCH 捕获节点 js 脚本中的CHANNEL_ANSWER事件

Unable to catch the CHANNEL_ANSWER event In node js script from the FREESWITCH

提问人:aIi.i 提问时间:11/7/2023 最后编辑:aIi.i 更新时间:11/9/2023 访问量:20

问:

我希望每个人都没事。我有一个关于freeswitch的问题。

我在 freeswitch 和努力将我的节点 js 脚本连接到 freeswitch 服务器方面的经验非常少。我已成功连接到 freeswitch 服务器,并且已成功生成出站呼叫。

我想在我的节点 js 脚本中捕获事件CHANNEL_ANSWER以执行与调用流相关的进一步任务,但只有在调用完成、拒绝或由于超时而自行终止时CHANNEL_EXECUTE_COMPLETE我才会收到事件。我还检查了fs_cli日志,但CHANNEL_ANSWER不是由 freeswitch 服务器生成的。我希望在第二个方接听电话时获取该事件。

我的问题是: 我们可以在 node js 脚本中获取 CHANNEL_ANSWER 或呼叫应答事件吗?

我收到了CHANNEL_EXECUTE_COMPLETE,但在接听电话时我没有收到任何事件。以下是日志:

2023-11-07 10:18:56.896930 [调试] sofia.c:7084 通道 sofia/external/+1122334455 进入状态 [就绪][200] 2023-11-07 10:18:56.896930 [通知] sofia.c:8159 频道 [sofia/external/+1122334455] 已得到答复 2023-11-07 10:18:56.896930 [调试] switch_channel.c:3773 (sofia/external/+1122334455) 调用状态更改 早期 -> 活动 2023-11-07 10:18:56.976870 [DEBUG] switch_rtp.c:7271 确认正确的音频 ip/端口。 2023-11-07 10:19:05.996866 [通知] sofia.c:1012 挂断 sofia/external/+1122334455 [CS_EXECUTE] [NORMAL_CLEARING]

JavaScript 节点 .js 事件 自由切换 融合PBX

评论


答:

0赞 Shucoder 11/9/2023 #1

我以前没有做过任何电码,但它看起来很酷。所以我深入研究了文档(注意:不是 100% 的准确性或精确性),我可以在这里看到 ln181 https://github.com/englercj/node-esl/blob/master/examples/channels/lib/api.js 我们有:

CHANNEL_CALLSTATE
CHANNEL_STATE

那么,当 id 及其缓冲区存在时,这可能是您进一步工作的好地方吗?

同样在 ln210 上,我相信从它的名字来看,它可能意味着频道在执行时处于应答状态。所以在这里也像 ln213 所示,如果缓冲区存在,则意味着通道为 true 并在缓冲区内,您可以在此处执行进一步的工作。CHANNEL_EXECUTE_COMPLETE

最后,在 ln229 上,我们有函数,在 ln232 上,我们用以下行更新 answerstate 行:Api.prototype._updateState

 buff.rows[id].answerstate = e.getHeader('Answer-State');

我相信在这个答案状态中可以显示您的答案,并且根据它是什么,您可能想在这里做进一步的工作,或者不做进一步的工作,例如

Api.prototype._updateState = function(buff, e, id) {
    buff.rows[id].state = e.getHeader('Channel-State');
    buff.rows[id].callstate = e.getHeader('Channel-Call-State');
    buff.rows[id].answerstate = e.getHeader('Answer-State');

    if(buff.rows[id].answerstate == true) {
       //console.log(buff.rows[id].answerstate);
       //do further work here
    }

    buff.rows[id].hit_dialplan = e.getHeader('Channel-HIT-Dialplan');
};

这是我能提供的最大帮助,直到我看到您的所有代码以及您遵循的 api 和文档版本。

我还要确定状态变量CHANNEL_ANSWER是否仍然存在?如果没有,则它已弃用,可能需要自定义解决方案。