You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asterisk与Java:Park操作无法返回停车槽问题咨询

解决Asterisk-Java执行Park操作后获取停车槽的问题

我完全懂你的困扰——默认返回的ManagerResponse确实只告诉你操作成功了,不会带出停车槽的具体编号。要拿到这个关键信息,你得换个思路:去监听Asterisk主动推送的ParkedCall事件,而不是只盯着动作的响应结果。

具体实现步骤

  1. 注册ParkedCall事件监听器
    asterisk-java库专门提供了ParkedCallEvent类,用来捕获电话被成功停放后的槽位数据。你需要给你的ManagerConnection注册一个事件监听器,来监听这个事件的触发。

  2. 用ActionId关联操作(可选但推荐)
    如果你的系统同时处理多个Park操作,最好给每个ParkAction设置唯一的actionId,这样在事件回调里就能精准匹配到对应的操作,避免不同停车请求的信息混淆。

代码示例

import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.action.ParkAction;
import org.asteriskjava.manager.event.ParkedCallEvent;
import org.asteriskjava.manager.listener.ManagerEventListener;

public class ParkingSlotDemo {
    public static void main(String[] args) throws Exception {
        // 初始化AMI连接
        ManagerConnectionFactory factory = new ManagerConnectionFactory(
            "你的Elastix服务器IP", "AMI用户名", "AMI密码");
        ManagerConnection connection = factory.createManagerConnection();

        // 注册事件监听器,捕获停车槽信息
        connection.addEventListener(new ManagerEventListener() {
            @Override
            public void onManagerEvent(org.asteriskjava.manager.event.ManagerEvent event) {
                if (event instanceof ParkedCallEvent) {
                    ParkedCallEvent parkedEvent = (ParkedCallEvent) event;
                    // 提取关键信息:停车槽编号、来电号码
                    String parkingSlot = parkedEvent.getParkingSpace();
                    String callerNum = parkedEvent.getCallerIdNum();
                    System.out.printf("来电%s已被停放在槽位%s%n", callerNum, parkingSlot);
                    
                    // 如果设置了ActionId,这里可以做匹配校验
                    // String actionId = parkedEvent.getActionId();
                    // if ("park-action-001".equals(actionId)) { ... }
                }
            }
        });

        // 登录AMI
        connection.login();

        // 创建并执行Park动作
        ParkAction parkAction = new ParkAction();
        parkAction.setChannel("需要停放的通道号"); // 格式示例:SIP/101-00000005
        parkAction.setActionId("park-action-001"); // 设置唯一标识
        connection.sendAction(parkAction);

        // 保持连接监听事件(实际项目中可根据业务逻辑用异步/线程处理)
        Thread.sleep(6000);
        connection.logoff();
    }
}

注意事项

  • AMI权限配置:你的AMI用户需要有足够的权限接收系统事件,建议在manager.conf里给用户配置read=all,或者至少包含system权限,否则可能收不到ParkedCallEvent。
  • 事件触发时机:ParkedCallEvent会在电话成功停放后立即推送,所以一定要确保监听器在执行Park动作前就完成注册。
  • 版本兼容性:不同Elastix版本对应的Asterisk版本可能有差异,如果ParkedCallEvent的字段有变化,可以打印事件的所有属性来确认,或者参考对应版本的asterisk-java文档。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:19:43