上一年在公司做了一个小小的IVR项目.觉得这是一个和硬件驱动交互编程的不错例子.
共享一下.也讨论一下.
代码:(这个是调用系统驱动的DLL)
using
System;
using System.Text;
using DJVoiceCard.Lib;
namespace DJVoiceCard.DL
{
public class SysFunction
{
系统操作#region 系统操作
/**//// <summary>
/// 初始化系统
/// </summary>
/// <returns></returns>
public static bool SysInit(ref string sErr)
{
try
{
StringBuilder sSys_INC = new StringBuilder("");
StringBuilder sPrompt_INC = new StringBuilder("Prompt.ini");
int iSysInit = ISUP_Lib.DJISUP_InitSystem();
int iCardInit = DJFunction.DJSys_EnableCard(sSys_INC, sPrompt_INC);
bool iPromptInit = DJFunction.DJSys_EnableDtmfSend();
if (iSysInit == 1)
{
if (iCardInit == 0)
{
if (iPromptInit)
{
return true;
}
else
{
sErr = "未能加载声音文件" + iPromptInit.ToString();
return false;
}
}
else
{
sErr = iCardInit.ToString();
return false;
}
}
else
{
sErr = iSysInit.ToString();
return false;
}
}
catch (Exception ex)
{
sErr = ex.Message;
}
return false;
}
/**//// <summary>
/// 退出系统
/// </summary>
public static void SysExit()
{
DJFunction.DJSys_DisableCard();
ISUP_Lib.DJISUP_ExitSystem();
}
#endregion
中继通道操作#region 中继通道操作
/**//// <summary>
/// 获取中继通道总数
/// </summary>
/// <returns></returns>
public static int iTrkTotal()
{
return DJFunction.DJTrk_GetTotalTrunkNum();
}
/**//// <summary>
/// 信道状态;
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static int iRaleyStetes(byte PCM_NO, byte Relay_NO)
{
return ISUP_Lib.DJISUP_GetChnState(PCM_NO, Relay_NO);
}
/**//// <summary>
/// 循环刷新缓存;
/// </summary>
public static void Push_GerEvent()
{
try
{
ISUP_Lib.DJISUP_GetEvent();
DJFunction.DJSys_PushPlay();
}
catch(Exception Ex)
{
}
}
/**//// <summary>
/// 获得中继号
/// </summary>
/// <param name="iTrunkID"></param>
/// <returns></returns>
public static int iPCMID(int iTrunkID)
{
return DJFunction.DJTrk_GetPcmID(iTrunkID);
}
/**//// <summary>
/// 被叫号码
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static TC_INI_TYPE GetCallNum(int PCM_NO, int Relay_NO)
{
TC_INI_TYPE sReVal = new TC_INI_TYPE();
ISUP_Lib.DJISUP_GetCalleeNum((byte)PCM_NO, (byte)Relay_NO, ref sReVal);
return sReVal;
}
/**//// <summary>
/// 主叫号码
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static TC_INI_TYPE GetCallerNum(int PCM_NO, int Relay_NO)
{
TC_INI_TYPE sReVal = new TC_INI_TYPE();
ISUP_Lib.DJISUP_GetCallerNum((byte)PCM_NO, (byte)Relay_NO, ref sReVal);
return sReVal;
}
/**//// <summary>
/// 获取用户按键
/// </summary>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static StringBuilder GetUserKeyPress(int Relay_NO)
{
return ISUP_Lib.DJTrk_GetDtmfCode(Relay_NO);
}
/**//// <summary>
/// 设置中继信道的状态;
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="States"></param>
public static void SetRelayStates(int iTrunkID, int States)
{
ISUP_Lib.DJISUP_SetChnState(((byte)(iTrunkID / 30)), ((byte)(iTrunkID % 30)), (byte)States);
}
/**//// <summary>
/// 呼出
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, string CalleeNum, string CallerNum, ref string sErr)
{
StringBuilder Callee = new StringBuilder(CallerNum);
StringBuilder Caller = new StringBuilder(CalleeNum);
if (iTrunkID != -1)
{
bool bRel = ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, ref Callee, ref Caller);
//sErr = Callee.ToString() + "||" + Caller.ToString()+"||"+iTrunkID.ToString();
return bRel;
}
else
{
sErr = "NaN";
return false;
}
}
/**//// <summary>
/// string
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, string CalleeNum, string CallerNum)
{
char[] telNum = new char[120];
PR p = new PR();
p.TelarrChar = telNum;
telNum = CalleeNum.ToCharArray();
byte[] _telNum = new byte[120];
_telNum = Encoding.ASCII.GetBytes(telNum);
char[] CallNum = new char[120];
CallNum = CallerNum.ToCharArray();
byte[] _CallNum = new byte[120];
p.CallarrChar = CallNum;
_CallNum = Encoding.ASCII.GetBytes(CallerNum);
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, ref CalleeNum, ref CallerNum);
}
else
{
return false;
}
}
/**//// <summary>
/// byte][
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, byte[] CalleeNum, byte[] CallerNum)
{
unsafe
{
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, CalleeNum, CallerNum);
}
else
{
return false;
}
}
}
/**//// <summary>
/// char *
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="calleeNum"></param>
/// <param name="callerNum"></param>
/// <returns></returns>
public static unsafe bool bCallOut(int iTrunkID, StringBuilder calleeNum, StringBuilder callerNum)
{
unsafe
{
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, calleeNum, callerNum);
}
else
{
return false;
}
}
}
using System.Text;
using DJVoiceCard.Lib;
namespace DJVoiceCard.DL
{
public class SysFunction
{
系统操作#region 系统操作
/**//// <summary>
/// 初始化系统
/// </summary>
/// <returns></returns>
public static bool SysInit(ref string sErr)
{
try
{
StringBuilder sSys_INC = new StringBuilder("");
StringBuilder sPrompt_INC = new StringBuilder("Prompt.ini");
int iSysInit = ISUP_Lib.DJISUP_InitSystem();
int iCardInit = DJFunction.DJSys_EnableCard(sSys_INC, sPrompt_INC);
bool iPromptInit = DJFunction.DJSys_EnableDtmfSend();
if (iSysInit == 1)
{
if (iCardInit == 0)
{
if (iPromptInit)
{
return true;
}
else
{
sErr = "未能加载声音文件" + iPromptInit.ToString();
return false;
}
}
else
{
sErr = iCardInit.ToString();
return false;
}
}
else
{
sErr = iSysInit.ToString();
return false;
}
}
catch (Exception ex)
{
sErr = ex.Message;
}
return false;
}
/**//// <summary>
/// 退出系统
/// </summary>
public static void SysExit()
{
DJFunction.DJSys_DisableCard();
ISUP_Lib.DJISUP_ExitSystem();
}
#endregion
中继通道操作#region 中继通道操作
/**//// <summary>
/// 获取中继通道总数
/// </summary>
/// <returns></returns>
public static int iTrkTotal()
{
return DJFunction.DJTrk_GetTotalTrunkNum();
}
/**//// <summary>
/// 信道状态;
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static int iRaleyStetes(byte PCM_NO, byte Relay_NO)
{
return ISUP_Lib.DJISUP_GetChnState(PCM_NO, Relay_NO);
}
/**//// <summary>
/// 循环刷新缓存;
/// </summary>
public static void Push_GerEvent()
{
try
{
ISUP_Lib.DJISUP_GetEvent();
DJFunction.DJSys_PushPlay();
}
catch(Exception Ex)
{
}
}
/**//// <summary>
/// 获得中继号
/// </summary>
/// <param name="iTrunkID"></param>
/// <returns></returns>
public static int iPCMID(int iTrunkID)
{
return DJFunction.DJTrk_GetPcmID(iTrunkID);
}
/**//// <summary>
/// 被叫号码
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static TC_INI_TYPE GetCallNum(int PCM_NO, int Relay_NO)
{
TC_INI_TYPE sReVal = new TC_INI_TYPE();
ISUP_Lib.DJISUP_GetCalleeNum((byte)PCM_NO, (byte)Relay_NO, ref sReVal);
return sReVal;
}
/**//// <summary>
/// 主叫号码
/// </summary>
/// <param name="PCM_NO"></param>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static TC_INI_TYPE GetCallerNum(int PCM_NO, int Relay_NO)
{
TC_INI_TYPE sReVal = new TC_INI_TYPE();
ISUP_Lib.DJISUP_GetCallerNum((byte)PCM_NO, (byte)Relay_NO, ref sReVal);
return sReVal;
}
/**//// <summary>
/// 获取用户按键
/// </summary>
/// <param name="Relay_NO"></param>
/// <returns></returns>
public static StringBuilder GetUserKeyPress(int Relay_NO)
{
return ISUP_Lib.DJTrk_GetDtmfCode(Relay_NO);
}
/**//// <summary>
/// 设置中继信道的状态;
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="States"></param>
public static void SetRelayStates(int iTrunkID, int States)
{
ISUP_Lib.DJISUP_SetChnState(((byte)(iTrunkID / 30)), ((byte)(iTrunkID % 30)), (byte)States);
}
/**//// <summary>
/// 呼出
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, string CalleeNum, string CallerNum, ref string sErr)
{
StringBuilder Callee = new StringBuilder(CallerNum);
StringBuilder Caller = new StringBuilder(CalleeNum);
if (iTrunkID != -1)
{
bool bRel = ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, ref Callee, ref Caller);
//sErr = Callee.ToString() + "||" + Caller.ToString()+"||"+iTrunkID.ToString();
return bRel;
}
else
{
sErr = "NaN";
return false;
}
}
/**//// <summary>
/// string
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, string CalleeNum, string CallerNum)
{
char[] telNum = new char[120];
PR p = new PR();
p.TelarrChar = telNum;
telNum = CalleeNum.ToCharArray();
byte[] _telNum = new byte[120];
_telNum = Encoding.ASCII.GetBytes(telNum);
char[] CallNum = new char[120];
CallNum = CallerNum.ToCharArray();
byte[] _CallNum = new byte[120];
p.CallarrChar = CallNum;
_CallNum = Encoding.ASCII.GetBytes(CallerNum);
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, ref CalleeNum, ref CallerNum);
}
else
{
return false;
}
}
/**//// <summary>
/// byte][
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="CalleeNum"></param>
/// <param name="CallerNum"></param>
/// <returns></returns>
public static bool bCallOut(int iTrunkID, byte[] CalleeNum, byte[] CallerNum)
{
unsafe
{
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, CalleeNum, CallerNum);
}
else
{
return false;
}
}
}
/**//// <summary>
/// char *
/// </summary>
/// <param name="iTrunkID"></param>
/// <param name="calleeNum"></param>
/// <param name="callerNum"></param>
/// <returns></returns>
public static unsafe bool bCallOut(int iTrunkID, StringBuilder calleeNum, StringBuilder callerNum)
{
unsafe
{
if (iTrunkID != -1)
{
return ISUP_Lib.DJISUP_Callout(iTrunkID / 30, iTrunkID % 30, calleeNum, callerNum);
}
else
{
return false;
}
}
}