Asterisk与Java:Park操作无法返回停车槽问题咨询
解决Asterisk-Java执行Park操作后获取停车槽的问题
我完全懂你的困扰——默认返回的ManagerResponse确实只告诉你操作成功了,不会带出停车槽的具体编号。要拿到这个关键信息,你得换个思路:去监听Asterisk主动推送的ParkedCall事件,而不是只盯着动作的响应结果。
具体实现步骤
注册ParkedCall事件监听器
asterisk-java库专门提供了ParkedCallEvent类,用来捕获电话被成功停放后的槽位数据。你需要给你的ManagerConnection注册一个事件监听器,来监听这个事件的触发。用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
相关产品推荐
相关产品推荐

