`

Asterisk通道工具类

阅读更多

 

/**
 * 
 * Asterisk通道工具类
 * 
 * 
 * @author sunflower
 * 
 *         时间:2010-7-26 下午01:11:41
 * 
 *         Email:zhangxuehuaemail # gmail 点 com
 * 
 */
public class ChanUtil {
	private ChanUtil() {
	}

	
	public static final String CHAN_LOCAL = "LOCAL";
	public static final String CHAN_DAHDI = "DAHDI";
	public static final String CHAN_ZAP = "ZAP";
	public static final String CHAN_SIP = "SIP";
	public static final String CHAN_IAX2 = "IAX2";

	private static final Map<String, Integer> CHANNEL_TYPES = new HashMap<String, Integer>(
			5);
	static {
		CHANNEL_TYPES.put(CHAN_LOCAL, 0);// 0
		CHANNEL_TYPES.put(CHAN_DAHDI, 1);// 1
		CHANNEL_TYPES.put(CHAN_ZAP, 1 << 1);// 2
		CHANNEL_TYPES.put(CHAN_SIP, 1 << 2);// 4
		CHANNEL_TYPES.put(CHAN_IAX2, 1 <<3);// 8
	}

	/**
	 * 判断通道类型是否被支持
	 * 
	 * @param channelType
	 *            需要鉴定的通道类型
	 * @return 是true,否false
	 */
	public static final boolean contansChanType(String channelType) {
		return CHANNEL_TYPES.containsKey(StringUtils.upperCase(channelType));
	}

	/**
	 * 是否是本地通道
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return 是true,否false
	 */
	public static final boolean isLocalChan(String channel) {
		return StringUtils.startsWithIgnoreCase(channel, CHAN_LOCAL);
	}

	/**
	 * 是否是dahdi通道
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return 是true,否false
	 */
	public static final boolean isDahdiChan(String channel) {
		return StringUtils.startsWithIgnoreCase(channel, CHAN_DAHDI);
	}

	/**
	 * 是否是zap通道
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return 是true,否false
	 */
	public static final boolean isZapChan(String channel) {
		return StringUtils.startsWithIgnoreCase(channel, CHAN_ZAP);
	}

	/**
	 * 是否是sip通道
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return 是true,否false
	 */
	public static final boolean isSipChan(String channel) {
		return StringUtils.startsWithIgnoreCase(channel, CHAN_SIP);
	}

	/**
	 * 是否是IAX2通道
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return 是true,否false
	 */
	public static final boolean isIax2Chan(String channel) {
		return StringUtils.startsWithIgnoreCase(channel, CHAN_IAX2);
	}

	/**
	 * 窄化通道,获得简单通道字符串 例如:
	 *<ul>
	 * <li>DAHDI/2-1处理后DAHDI/2</li>
	 * <li>SIP/102-d2dg3232ds处理后SIP/102</li>
	 * <li>Local/FMPR-100@from-internal-7a11,1处理后Local/FMPR-100</li>
	 * </ul>
	 * 
	 * @param channel
	 * @return
	 */
	public static String narrowChan(String realChannel) {
		if (StringUtils.isEmpty(realChannel)) {
			return "";
		}
		if (StringUtils.contains(realChannel, "@")) { // 处理local通道
			return StringUtils.substringBefore(realChannel, "@");

		} else if (StringUtils.contains(realChannel, "-")) {

			return StringUtils.substringBefore(realChannel, "-");

		} else {
			return realChannel;

		}
	}

	/**
	 * 判断通道是否是FMPR通道
	 * <p>
	 * 该通道在Fellow
	 * me通道出现,Elastix1.3++,Local/FMPR-100@from-internal-7a11,1中100为实际被叫号码
	 * 而Local/FMGL-101@from-internal-7a11,1中101是100的fellow me
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return true or false
	 */
	public static boolean isFMPRChan(String channel) {
		return StringUtils.containsIgnoreCase(channel, "Local/FMPR");
	}

	/**
	 * 判断通道是否是FMGL通道
	 * <p>
	 * 该通道在Fellow
	 * me通道出现,Elastix1.3++,Local/FMPR-100@from-internal-7a11,1中100为实际被叫号码
	 * 而Local/FMGL-101@from-internal-7a11,1中101是100的fellow me
	 * 
	 * @param channel
	 *            需要鉴定的通道
	 * @return true or false
	 */
	public static boolean isFMGLChan(String channel) {
		return StringUtils.containsIgnoreCase(channel, "Local/FMGL");
	}

	/**
	 * 解析实际通道获取号码
	 * <p>
	 * 支持的通道样式
	 * <ul>
	 * <li>Local/100@from-internal-68d2,2</li>
	 * <li>Local/FMPR-100@from-internal-7a11,1</li>
	 * <li>SIP/101-b7604d00</li>
	 * </ul>
	 * 
	 * 
	 * @param channel
	 *            实际通道
	 * @return 支持的通道返回号码字符串,否返回UNKNOWN
	 */
	public static String getExtenFromChannel(String realChannel) {
		if (StringUtils.isEmpty(realChannel)) {
			return "";
		}
		// 解析内部通道
		if (StringUtils.contains(realChannel, "@")) {

			if (isFMGLChan(realChannel) || isFMPRChan(realChannel)) {

				return StringUtils.substringBetween(realChannel, "-", "@");

			}
			// Local/100@from-internal-7a11,1
			else {

				return StringUtils.substringBetween(realChannel, "/", "@");

			}

		}
		// 解析sip通道 例如SIP/100-0a208990
		else if (isSipChan(realChannel)) {

			return StringUtils.substringBetween(realChannel, "/", "-");

		}
		// 不支持的通道格式返回未知
		else {
			return "UNKNOWN";
		}
	}

	public static class AstState {
		/* from include/asterisk/channel.h */

		/**
		 * Channel is down and available.
		 */
		public static final int AST_STATE_DOWN = 0;

		/**
		 * Channel is down, but reserved.
		 */
		public static final int AST_STATE_RSRVD = 1;

		/**
		 * Channel is off hook.
		 */
		public static final int AST_STATE_OFFHOOK = 2;

		/**
		 * Digits (or equivalent) have been dialed.
		 */
		public static final int AST_STATE_DIALING = 3;

		/**
		 * Line is ringing.
		 */
		public static final int AST_STATE_RING = 4;

		/**
		 * Remote end is ringing.
		 */
		public static final int AST_STATE_RINGING = 5;

		/**
		 * Line is up.
		 */
		public static final int AST_STATE_UP = 6;

		/**
		 * Line is busy.
		 */
		public static final int AST_STATE_BUSY = 7;

		/**
		 * Digits (or equivalent) have been dialed while offhook.
		 */
		public static final int AST_STATE_DIALING_OFFHOOK = 8;
	}
}
1
0
分享到:
评论

相关推荐

    Asterisk AMI 接口代码

    Asterisk AMI(Asterisk Manager Interface)接口是Asterisk PBX系统提供的一种用于远程管理和监控的强大工具。这个接口允许开发者通过编程方式与Asterisk进行交互,执行诸如控制呼叫、获取状态、监听通话等多种操作...

    通过asterisk-java操作asterisk

    5. **使用通道(Channels)和拨号计划(Dialplan)**:Asterisk-java提供了对通道和拨号计划的操作,你可以查询现有的通道状态,修改拨号计划,甚至在运行时动态改变Asterisk的行为。 6. **实时监控**:通过...

    Asterisk Manager API(AMI) 中文文档

    Asterisk Manager Interface (AMI) 是一款强大的工具,它允许开发者通过TCP/IP协议与Asterisk PBX系统进行交互,实现远程管理和监控功能。本文档旨在为用户提供关于AMI的基本概念、协议细节、以及如何通过AMI来执行...

    Asterisk 简单的AGI Demo

    `BaseAgiScript` 是一个基础类,通常由 Asterisk 的 Java 库提供,它封装了一些基本的 AGI 功能,如接收请求、发送响应等。 ##### 3.2 方法实现 ```java public void service(AgiRequest request, AgiChannel ...

    asterisk-java-0.3.1-javadoc.rar_Asterisk AMI j_asterisk_asteris

    Asterisk Java是针对Asterisk AMI的Java库,允许开发者通过Java代码与Asterisk服务器进行交互,实现诸如创建呼叫、监控通道、更改拨号计划等功能。"asterisk-java-0.3.1-javadoc.rar" 是这个库的Java文档压缩包,...

    asterisk pdf

    这部分内容详细介绍了如何安装和配置这类干线,以便Asterisk系统能够通过传统的电话线路进行通信。 ##### 2. PSTN终结(Termination) PSTN终结是指将Asterisk系统的呼叫发送到PSTN网络上的过程。这通常涉及到与...

    asterisk-java-2.0.3jar包及示例.rar

    1. **Asterisk-Java API**:这是核心库,提供了各种类和接口,如ManagerConnection用于建立与Asterisk服务器的连接,ManagerEvent用于处理Asterisk事件,Channel接口代表电话通道,Call代表通话对象等。这些API使得...

    Asterisk.NET.1.6.3.1.zip

    1. **API接口**:Asterisk.NET提供了丰富的类和方法,如ManagerConnection用于建立与Asterisk服务器的连接,ManagerEvent用于处理从服务器接收的各种事件,Channel类则用于管理通话通道。 2. **事件处理**:通过...

    具备对讲功能的矿用广播终端系统

    矿用广播终端系统是一种应用于煤矿领域的重要通信工具,主要负责生产指挥调度、安全避险和应急救援等任务。为了满足煤矿工作中的多种需求,现代矿用广播终端系统需要具备实时广播、对讲以及高品质音乐播放等多种功能...

    日语IT用语(计算机专业日语)

    在面向对象编程中,类是对象的模板,定义了一组共享属性和方法的对象集合。 ### 35. クリア(する)- clear 清除是删除或重置数据的操作,常用于清理内存或初始化变量。 ### 36. クリック - click 点击是用户与...

Global site tag (gtag.js) - Google Analytics