运行环境 设备: win xp 32bit jdk 1.6 86X 子佩电话工具(应该有很多,用的是CC301)
EventCallback.java
package phone; import org.xvolks.jnative.JNative; import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.pointers.Pointer; import org.xvolks.jnative.util.Callback; ////////////////////////////////////////////////////////////////////////////////////////// ////事件发生回调原型 //uChannelID:通道ID //dwUserData:用户定制数据 //lType:事件类型ID 查看BRI_EVENT.lEventType Define //lHandle:句柄使用值 //lResult:事件相关数据 //lParam:保留数据,扩展使用 //szData:事件相关数据 //pDataEx:扩展使用附加数据 ///////////////////////////////////////////////////////////////////////////////////////// //typedef BRIINT32 (CALLBACK *PCallBack_Event)(BRIINT16 uChannelID,BRIUINT32 dwUserData,BRIINT32 lType,BRIINT32 lHandle,BRIINT32 lResult,BRIINT32 lParam,BRIPCHAR8 pData,BRIPCHAR8 pDataEx); public class EventCallback implements Callback/* 实现此接口 */{ private int myAddress = -1; public EventCallback() { } /** * Method callback java对应于dll中回调函数 * * @param values * an long[] 参数组和非整形数代表地址 * @return an int * @version 11/26/2013 */ public int callback(long[] values) { if (values == null) { System.out.println("callback ret " -1); return -1; } System.out.println("参数的个数" values.length); if (values.length == 8) {
String szData = "";
// String szDataEx = "";
int lType = (int)values[3];
long lResult = values[4];
try {
int iCh = (int)values[0];
Pointer _pointer = Pointer.createPointerToNativeMemory(
(int) values[6], 1024); /* 获取字符串通过指针 */
// Pointer _pointer1 = Pointer.createPointerToNativeMemory(
// (int) values[7], 1024);
szData = _pointer.getAsString() ;
// szDataEx = _pointer1.getAsString();
String str = "",strValue="";
strValue= "Handle="+values[3]+ "Result=" + lResult+ "Data=" + szData ;
switch(lType)
{
case BriSDKLib.BriEvent_PhoneHook:
{
//电话接通后根据对方阻抗大小,声音会变大变小,200就太大,中间幅度200就太大,一般电话机100可以
/* QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFVOL,50); QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFLEVEL,4); QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFNUM,9); QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFLOWINHIGH,20); QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFHIGHINLOW,20); */
//str.Format("通道%d: 电话机摘机,演示修改检测DTMF灵敏度,DTMFVOL=50/DTMFLEVEL=5/DTMFNUM=10,如果检测不到电话机拨号就修改该值更小",m_nChannelID+1);
if(BriSDKLib.QNV_General(iCh,BriSDKLib.QNV_GENERAL_ISDIALING,0, null) <= 0)
{
//QNV_SetDevCtrl(m_nChannelID,QNV_CTRL_DOHOOK,0);//没有正在拨号可以考虑自动软挂机,避免3方通话状态,话机里有背景音出现
}
str= "通道"+iCh+ ": 电话机摘机";
}break;
case BriSDKLib.BriEvent_PhoneHang:
{
// QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFVOL,5);
// QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFLEVEL,3);
// QNV_SetParam(pEvent->uChannelID,QNV_PARAM_DTMFNUM,6);
// str.Format("通道%d: 电话机挂机,演示修改检测DTMF灵敏度",m_nChannelID+1);
str= "通道" + iCh + ": 电话机挂机";
}break;
case BriSDKLib.BriEvent_CallIn:
str = "通道"+ iCh +": 来电响铃 " + strValue;
break;
case BriSDKLib.BriEvent_GetCallID:
{
long lSerial= BriSDKLib.QNV_DevInfo(iCh,BriSDKLib.QNV_DEVINFO_GETSERIAL);
str= "通道" + iCh +": 接收到来电号码 "+ szData;
}break;
case BriSDKLib.BriEvent_StopCallIn:
str = "通道"+ iCh +": 停止呼入,产生一个未接电话 "+ szData;break;
case BriSDKLib.BriEvent_DialEnd:
{
if(BriSDKLib.QNV_GetDevCtrl(iCh,BriSDKLib.QNV_CTRL_PHONE) > 0)
{
//QNV_SetDevCtrl(m_nChannelID,QNV_CTRL_DOHOOK,0);//电话机已经拿着可以考虑自动软挂机,避免3方通话状态,话机里有背景音出现
}
str = "通道:" + iCh +" 拨号结束 "+ strValue;
}break;
case BriSDKLib.BriEvent_PlayFileEnd:
str = "通道" + iCh + ": 播放文件结束 " + strValue;break;
case BriSDKLib.BriEvent_PlayMultiFileEnd:
str = "通道" + iCh +": 多文件连播结束 %s"+ strValue;break;
case BriSDKLib.BriEvent_RepeatPlayFile:
str = "通道"+iCh + ": 循环播放文件 %s"+ strValue;break;
case BriSDKLib.BriEvent_PlayStringEnd:
str= "通道" +iCh+ ": 播放字符结束 %s" + strValue;break;
case BriSDKLib.BriEvent_SendCallIDEnd:
str= "通道"+iCh+ ": 给话机震铃时发送号码结束 "+ strValue;break;
case BriSDKLib.BriEvent_Silence:
str= "通道" +iCh +": 通话中一定时间的静音 "+ strValue;break;
case BriSDKLib.BriEvent_GetDTMFChar:
str= "通道"+iCh+": 接收到按键 "+strValue;break;
case BriSDKLib.BriEvent_RemoteHook:
{
if(BriSDKLib.HOOK_POLARITY == lResult)
{
str= "通道"+ iCh + ": 远程摘机(反级检测) "+ strValue ;
}else
str = "通道 " + iCh + ":信号音检测远程摘机信号,仅做参考 "+ strValue;
}break;
case BriSDKLib.BriEvent_RemoteHang:
{
if(BriSDKLib.HOOK_POLARITY == lResult)
{
str= "通道" + iCh + ": 远程挂机(反级检测) "+ strValue;
}else
{
str= "通道" + iCh + ": 信号音检测远程挂机(忙音检测),仅做参考 "+ strValue;
}
}break;
case BriSDKLib.BriEvent_Busy:
str = "通道"+ iCh + ": 接收到忙音,线路可能已经断开 " + strValue;break;
case BriSDKLib.BriEvent_DialTone:
str= "通道" +iCh + ": 检测到拨号音 "+ strValue;break;
case BriSDKLib.BriEvent_DialToneEx:
str= "通道"+ iCh + ": 接通状态下检测到拨号音信号,如果是刚来电,可能是刚才的来电已经未接了,仅做参考 "+strValue;break;
case BriSDKLib.BriEvent_PhoneDial:
str= "通道" +iCh + ": 电话机拨号 "+ strValue;break;
case BriSDKLib.BriEvent_RingBack:
str= "通道" +iCh + ": 拨号后接收到回铃音 "+ strValue;break;
case BriSDKLib.BriEvent_MicIn:
str= "通道" +iCh + ": 麦克风插入 "+ strValue;break;
case BriSDKLib.BriEvent_MicOut:
str= "通道" +iCh + ": 麦克风拔出 "+ strValue;break;
case BriSDKLib.BriEvent_FlashEnd:
str= "通道" +iCh + ": 拍插簧完成 "+ strValue;break;
case BriSDKLib.BriEvent_RemoteSendFax:
str= "通道" +iCh + ": 对方准备发送传真 "+ strValue;break;
case BriSDKLib.BriEvent_FaxRecvFinished:
str= "通道" +iCh + ": 接收传真完成 "+ strValue;break;
case BriSDKLib.BriEvent_FaxRecvFailed:
str= "通道" +iCh + ": 接收传真失败 "+ strValue;break;
case BriSDKLib.BriEvent_FaxSendFinished:
str= "通道" +iCh + ": 发送传真完成 "+ strValue;break;
case BriSDKLib.BriEvent_FaxSendFailed:
str= "通道" +iCh + ": 发送传真失败 "+ strValue;break;
case BriSDKLib.BriEvent_RefuseEnd:
str= "通道" +iCh + ": 拒接来电完成 "+ strValue;break;
case BriSDKLib.BriEvent_RecvedFSK:
{
if(lResult == BriSDKLib.CALLIDMODE_FSK)
str= "通道" +iCh + ": 接收到来电号码信息FSK数据 "+ strValue;
else
str= "通道" +iCh + ": 接收到来电号码信息DTMF数据 "+ strValue;
}break;
case BriSDKLib.BriEvent_PSTNFree:
{
str= "通道" +iCh + ": PSTN线路已空闲 "+ strValue;
//WriteCallLog(m_nChannelID);
}break;
case BriSDKLib.BriEvent_CheckLine:
{
if( (lResult & BriSDKLib.CHECKLINE_MASK_DIALOUT)>0 )
{
str= "通道" +iCh + ":[ok]***线路拨号音正常,能正常软拨号***-----------------";
}else
{
str= "通道" +iCh + "[err]线路拨号音不正常,可能不能正常软拨号,检查LINE口线路";
}
if( (lResult & BriSDKLib.CHECKLINE_MASK_REV)>0 )
{
str= "通道" +iCh + "[ok]***线路LINE口/PHONE口未接反***----------------------";
}else
{
str= "通道" +iCh + "[err]线路LINE口/PHONE口可能接反了";
}
}break;
case BriSDKLib.BriEvent_DevErr:
{
str= "通道" +iCh + ": 设备发生错误 "+ strValue;
if(lResult == 3)// || (atol(pEvent->szData)&0xFF) == 6)//检测到移除获取多个失败
{
/* QNV_CloseDevice(ODT_CHANNEL,m_nChannelID); long lChNum=QNV_DevInfo(0,QNV_DEVINFO_GETCHANNELS); str.Format("当前通道数量:%d,考虑重新初始化所有设备",lChNum<0?0:lChNum); */
}
}break;
case BriSDKLib.BriEvent_PlugOut:
{
str= "通道" +iCh + ": 设备被拔掉 ";
}break;
case BriSDKLib.BriEvent_EnableHook:
{
str= "通道" +iCh + ": HOOK被控制 lResult= " + lResult;
}break;
case BriSDKLib.BriEvent_EnablePlay:
{
str= "通道" +iCh + ": 喇叭被控制 lResult= " + lResult;
}break;
case BriSDKLib.BriEvent_EnablePlayMux:
{
str= "通道" +iCh + ": 喇叭mux修改 lResult= " + lResult;
}break;
case BriSDKLib.BriEvent_DoStartDial:
{
if(lResult == BriSDKLib.CHECKDIALTONE_FAILED)
{
str= "通道" +iCh + ": 自动拨号失败,未检测到拨号音,请检查线路";
}else
{
str= "通道" +iCh + ": 开始拨号 data=" + szData;
}
}break;
case BriSDKLib.BriEvent_DevCtrl:
{
if(lResult == BriSDKLib.QNV_CTRL_PLAYTOLINE)
{
if(Integer.parseInt(szData) > 0)
{
str = "播放到线路状态 打开";
}else
{
str = "播放到线路状态 关闭";
}
}
}break;
default:
{
strValue= "通道:"+iCh +"其它忽略事件 eventid= "+lType + "Result=" + lResult+ "Data=" + szData ;
}break;
}
if(lType == BriSDKLib.BriEvent_RemoteSendFax && lResult == 1)
{
//BFU_FaxTooltip(m_nChannelID,"",TTIP_AUTORECV);
/* if(MessageBox("对方准备发送传真,是否接收?","传真提示",MB_YESNO|MB_ICONWARNING) == IDYES) { BFU_StartRecvFax(m_nChannelID,"",0); } */
}
System.out.println( str );
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return 1;
} else {
System.out.println("Bad number of arguments ! 8 expected "
+ values.length + " found");
System.out.println("callback ret " + 2);
return 2;
}
}
/** * java回调函数地址 */
public int getCallbackAddress() throws NativeException {
if(myAddress == -1) {
myAddress = JNative.createCallback(8, this);
}
return myAddress;
}
}
BriSDKLib.java
package phone;
/** * @author fans * @version 2013-9-11 * */
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlock;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.util.Callback;
class BriSDKLib {
public final static int NULL = 0;// c++
public final static int TRUE = 1;// 表示真值
public final static int FASLE = 0;// 表示假值
public final static int QNV_DLL_VER = 0x104;// 动态库版本
public static String QNV_DLL_VER_STR = "1.04";
public final static int QNV_FILETRANS_VER = 0x30301;
public static String QNV_CC_LICENSE = "quniccub_x";// CC开发的许可证
// 播放/录音回调时如果返回该值,系统将自动删除该回调模块,下次将不会被回调
public final static int CB_REMOVELIST = -1;
public static String MULTI_SEPA_CHAR = "|";// 多个文件播放列表分割符号
public final static int PROXYDIAL_SIGN = 0x40000000;// 代拨标记
public static String PROXYDIAL_SIGN_STRU = "P";// 代拨标记
public static String PROXYDIAL_SIGN_STRL = "p";// 代拨标记
public static String RING_BEGIN_SIGN_STR = "0";
public static String RING_END_SIGN_STR = "1";
public static String RING_BEGIN_SIGN_CH = "0";
public static String RING_END_SIGN_CH = "1";
public static String RINGBACK_TELDIAL_STR = "0";
public static String RINGBACK_PCDIAL_STR = "1";
public static String RINGBACK_PCDIAL_CH = "1";
public static String RINGBACK_TELDIAL_CH = "0";
public static String DIAL_DELAY_SECOND = ",";// 拨号时号码之间延迟1秒
public static String DIAL_DELAY_HSECOND = ".";// 拨号时号码之间延迟0.5秒
public static String DIAL_CHECK_CITYCODE = ":";// 拨号时该符号后自动过滤城市区号
public static String CC_PARAM_SPLIT = ",";// CC参数的分隔符号
// 自动创建录音文件时的默认目录名
public static String RECFILE_DIR = "recfile";
// 配置信息里的KEY
public static String INI_QNVICC = "qnvicc";
// 默认配置文件名
public static String INI_FILENAME = "cc301config.ini";
// VOIP代拨标记
public static String CC_VOIP_SIGN = "VOIP";
// 匿名登陆CC,密码跟号码为相同
public static String WEB_802ID = "800002000000000000";
public final static int MAX_USB_COUNT = 64;// 支持的最多USB芯片数
public final static int MAX_CHANNEL_COUNT = 128;// 支持的最多通道数
// 声卡控制有效通道ID号
// 0->255为USB设备通道号
public final static int SOUND_CHANNELID = 256;
// 远程通信通道,HTTP上传/下载
public final static int REMOTE_CHANNELID = 257;
// CC控制通道
public final static int CCCTRL_CHANNELID = 258;
// //socket 服务器端通道
public final static int SOCKET_SERVER_CHANNELID = 259;
// socket 终端通道
public final static int SOCKET_CLIENT_CHANNELID = 260;
public final static int MAX_CCMSG_LEN = 400;// 发送消息的最大长度
public final static int MAX_CCCMD_LEN = 400;// 发送命令的最大长度
public final static int DEFAULT_FLASH_ELAPSE = 600;// 默认拍插簧间隔时间(ms)
public final static int DEFAULT_FLASHFLASH_ELAPSE = 1000;// 默认拍插簧后间隔一定时间回调事件ms
public final static int DEFAULT_RING_ELAPSE = 1000;// 默认给内部话机/交换机震铃时间ms响 1秒
public final static int DEFAULT_RINGSILENCE_ELAPSE = 4000;// 默认给内部话机/交换机震铃后停止ms
// 4秒
public final static int DEFAULT_RING_TIMEOUT = 12;// 默认给内线震铃超时次数,每次1秒响4秒停,总共时间就为N*5
public final static int DEFAULT_REFUSE_ELAPSE = 500;// 拒接时默认使用间隔(ms)
public final static int DEFAULT_DIAL_SPEED = 75;// 默认拨号速度ms
public final static int DEFAULT_DIAL_SILENCE = 75;// 默认号码之间静音时间ms
public final static int DEFAULT_CHECKDIALTONE_TIMEOUT = 3000;// 检测拨号音超时就强制呼叫ms
public final static int DEFAULT_CALLINTIMEOUT = 5500;// 来电响铃超时ms
// 设备类型
public final static int DEVTYPE_UNKNOW = -1;// 未知设备
// cc301系列
public final static int DEVTYPE_T1 = 0x1009;
public final static int DEVTYPE_T2 = 0x1000;
public final static int DEVTYPE_T3 = 0x1008;
public final static int DEVTYPE_T4 = 0x1005;
public final static int DEVTYPE_T5 = 0x1002;
public final static int DEVTYPE_T6 = 0x1004;
public final static int DEVTYPE_IR1 = 0x8100;
public final static int DEVTYPE_ID1 = 0x8102;
public final static int DEVTYPE_IA1 = 0x8111;
public final static int DEVTYPE_IA2 = 0x8112;
public final static int DEVTYPE_IA3 = 0x8113;
public final static int DEVTYPE_IA4 = 0x8114;
public final static int DEVTYPE_IA4_F = 0x8115;
public final static int DEVTYPE_IB1 = 0x8121;
public final static int DEVTYPE_IB2 = 0x8122;
public final static int DEVTYPE_IB3 = 0x8123;
public final static int DEVTYPE_IB4 = 0x8124;
public final static int DEVTYPE_IP1 = 0x8131;
public final static int DEVTYPE_IP1_F = 0x8132;
public final static int DEVTYPE_IC2_R = 0x8200;
public final static int DEVTYPE_IC2_LP = 0x8203;
public final static int DEVTYPE_IC2_LPQ = 0x8207;
public final static int DEVTYPE_IC2_LPF = 0x8211;
// 4路设备
public final static int DEVTYPE_IC4_R = 0x8400;
public final static int DEVTYPE_IC4_LP = 0x8403;
public final static int DEVTYPE_IC4_LPQ = 0x8407;
public final static int DEVTYPE_IC4_LPF = 0x8411;
// 7路设备
public final static int DEVTYPE_IC7_R = 0x8700;
public final static int DEVTYPE_IC7_LP = 0x8703;
public final static int DEVTYPE_IC7_LPQ = 0x8707;
public final static int DEVTYPE_IC7_LPF = 0x8711;
// 玻瑞器
public final static int DEVTYPE_A1 = 0x1100000;
public final static int DEVTYPE_A2 = 0x1200000;
public final static int DEVTYPE_A3 = 0x1300000;
public final static int DEVTYPE_A4 = 0x1400000;
public final static int DEVTYPE_B1 = 0x2100000;
public final static int DEVTYPE_B2 = 0x2200000;
public final static int DEVTYPE_B3 = 0x2300000;
public final static int DEVTYPE_B4 = 0x2400000;
public final static int DEVTYPE_C4_L = 0x3100000;
public final static int DEVTYPE_C4_P = 0x3200000;
public final static int DEVTYPE_C4_LP = 0x3300000;
public final static int DEVTYPE_C4_LPQ = 0x3400000;
public final static int DEVTYPE_C7_L = 0x3500000;
public final static int DEVTYPE_C7_P = 0x3600000;
public final static int DEVTYPE_C7_LP = 0x3700000;
public final static int DEVTYPE_C7_LPQ = 0x3800000;
public final static int DEVTYPE_R1 = 0x4100000;
public final static int DEVTYPE_C_PR = 0x4200000;
// --------------------------------------------------------------
// 设备功能模块
// 是否具有内置喇叭功能
// 可以PC播放语音到喇叭/通话时线路声音到喇叭
public final static int DEVMODULE_DOPLAY = 0x1;
// 是否具有可接入外线获取来电号码(FSK/DTMF双制式)/通话录音功能
// 可以来电弹屏/通话录音/通话时获取对方按键(DTMF)
public final static int DEVMODULE_CALLID = 0x2;
// 是否具有可接入话机进行PSTN通话功能
// 可以使用电话机进行PSTN通话/获取话机拨出的号码
public final static int DEVMODULE_PHONE = 0x4;
// 是否具有继电器切换断开/接通话机功能
// 断开话机后可以:来电时话机不响铃/使用话机MIC独立采集录音配合DEVFUNC_RING模块给话机模拟来电震铃
public final static int DEVMODULE_SWITCH = 0x8;
// PC播放语音给话机听筒,具有 DEVMODULE_SWITCH模块,switch后播放语音到话机听筒
public final static int DEVMODULE_PLAY2TEL = 0x10;
// 是否具有话机摘机后拨号/放音给线路的功能
// 可以使用PC自动摘机进行拨号/通话时可以给对方播放语音/来电留言/外拨通知/来电IVR(语音答录)
public final static int DEVMODULE_HOOK = 0x20;
// 是否具有插入MIC/耳机功能
// 可以用MIC/耳机进行PSTN通话/使用MIC独立录音/PC播放语音给耳机
public final static int DEVMODULE_MICSPK = 0x40;
// 是否具有让接在phone口的设备(电话机,交换机等)模拟震铃功能
// 可以任意时刻让phone口的设备模拟来电震铃.如:在来电IVR(语音答录)之后进入工服务时给内部话机或交换机模拟震铃
public final static int DEVMODULE_RING = 0x80;
// 是否具有接收/发送传真功能
// 可以发送图片,文档到对方的传真机/可以接收保存对方传真机发送过来的图片
public final static int DEVMODULE_FAX = 0x100;
// 具有级性反转检测对方摘机的功能
// 如果PSTN线路在当地电信部门同时开通该级性反转检测服务,就可以在外拨时精确检测到对方摘机/挂机
// 如果没有该功能,只有拨打的号码具有标准回铃才才能检测到对方摘机,对手机彩铃,IP等不具有标准回铃线路的不能检测对方摘机/挂机
public final static int DEVMODULE_POLARITY = 0x800;
// ----------------------------------------------------------------
// 打开设备类型
public final static int ODT_LBRIDGE = 0x0;// 玻瑞器
public final static int ODT_SOUND = 0x1;// 声卡
public final static int ODT_CC = 0x2;// CC模块
public final static int ODT_SOCKET_CLIENT = 0x4;// SOCKET终端模块
public final static int ODT_SOCKET_SERVER = 0x8;// SOCKET服务器模块
public final static int ODT_ALL = 0xFF;// 全部
public final static int ODT_CHANNEL = 0x100;// 关闭指定通道
//
// -----------------------------------------------------
// linein线路选择
public final static int LINEIN_ID_1 = 0x0;// 默认正常状态录音,采集来电号码等
public final static int LINEIN_ID_2 = 0x1;// 电话机断开后话柄录音
public final static int LINEIN_ID_3 = 0x2;// hook line
// 软摘机后录音,录音数据可以提高对方的音量,降低本地音量
public final static int LINEIN_ID_LOOP = 0x3;// 内部环路测试,设备测试使用,建议用户不需要使用
// -----------------------------------------------------
public final static int ADCIN_ID_MIC = 0x0;// mic录音
public final static int ADCIN_ID_LINE = 0x1;// 电话线录音
// adc
public final static int DOPLAY_CHANNEL1_ADC = 0x0;
public final static int DOPLAY_CHANNEL0_ADC = 0x1;
public final static int DOPLAY_CHANNEL0_DAC = 0x2;
public final static int DOPLAY_CHANNEL1_DAC = 0x3;
// ------------
public final static int SOFT_FLASH = 0x1;// 使用软件调用拍插完成
public final static int TEL_FLASH = 0x2;// 使用话机拍插完成
public final static int HOOK_VOICE = 0x0;// 语音检测的摘挂机信号
public final static int HOOK_POLARITY = 0x1;// 反级检测的摘挂机信号
// ------------
// 拒接时使用模式
public final static int REFUSE_ASYN = 0x0;// 异步模式,调用后函数立即返回,但并不表示拒接完成,拒接完成后将接收到一个拒接完成的事件
public final static int REFUSE_SYN = 0x1;// 同步模式,调用后该函数被堵塞,等待拒接完成返回,系统不再有拒接完成的事件
// 拍插簧类型
public final static int FT_NULL = 0x0;
public final static int FT_TEL = 0x1;// 话机拍插簧
public final static int FT_PC = 0x2;// 软拍插簧
public final static int FT_ALL = 0x3;
// -------------------------------
// 拨号类型
public final static int DTT_DIAL = 0x0;// 拨号
public final static int DTT_SEND = 0x1;// 二次发码/震铃发送CALLID
// -------------------------------
// 来电号码模式
public final static int CALLIDMODE_NULL = 0x0;// 未知
public final static