C#实现IVR(基于东进的语音卡)-1

上一年在公司做了一个小小的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 % 30ref 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 % 30ref 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;
                }

            }

        }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近,正在忙基于三汇语音卡的呼叫中心的项目,真的好迷糊啊!公司在呼叫中心这方面的研发是空白,所有的资料都得从零开始收集,分析,上网查找一些前辈们的技术资料,在这里备个份,好好学习一下! --------------------------------------------------------------------------------------------------------------------- 随着语音技术的不断发展,语音卡在通信行业应用非常广泛。本节通过几个典型实例介绍语音卡程序的开发。 说明-1 实例428 语音卡电话呼叫系统 实例说明 随着科学技术的不断发展,语音卡被广泛地应用于商业软件中。本例实现了利用语音卡实现电话呼叫的功能。实例运行结果如图13.12所示。 说明-2 技术要点 本例采用东进公司开发的8路模拟语音卡,该卡采用灵活的模式化设计,可按需配置外线、内线两种模块。该语音卡实现坐席、会议、FSK数据收发、语音合成等多种功能,并提供SDK开发工具包。 在安装完驱动程序后,相应的动态链接库(NewSig.dll和Tc08a32.dll文件)会复制到Windows的系统目录下。在语音卡的开发过程中,主要通过调用NewSig.dll和Tc08a32.dll实现相应的功能。下面介绍这两个动态库中的主要使用函数。 (1)LoadDRV函数 该函数用于加载动态链接库。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long LoadDRV(); 返回值:返回值为0表示成功;?1表示打开设备驱动程序错误。?2表示在读取TC08A-V.INI文件时发生错误;?3表示INI文件的设置与实际的硬件不一致时发生错误。 (2)FreeDRV函数 该函数用于关闭驱动程序。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long EnableCard(short wusedCh, short wFileBufLen); (3)EnableCard函数 该函数用于初始化语音卡硬件,并为每个通道分配语音缓冲区。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long EnableCard(short wusedCh, short wFileBufLen); 参数说明如下。 l wUsedCh:标识通道数量。 l WFileBufLen:标识分配的缓冲区大小。 (4)CheckValidCh函数 该函数检测在当前机器内可用的通道总数。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckValidCh(); l 返回值:通道总数量。 (5)CheckChType函数 该函数用于测试某个通道的类型。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckChType(short wChnlNo); 参数说明如下。 l wChnlNo:标识通道号。 l 返回值:为0表示内线;为1表示外线;为2表示悬空。 (6)PUSH_PLAY函数 该函数用于维持文件录放音的持续进行,需在处理函数的大循环中调用。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void PUSH_PLAY(); (7)SetBusyPara函数 该函数用于设置要检测的挂机忙音的参数。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void SetBusyPara(short BusyLen); 参数说明: l BusyLen:标识忙音的时间长度,单位为毫秒。 (8)RingDetect函数 该函数用于测试外线是否振铃或内线是否提机。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool RingDetect(short wChnlNo); 参数说明如下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值