实例428 语音卡电话呼叫系统

实例说明
随着科学技术的不断发展,语音卡被广泛地应用于商业软件中。本例实现了利用语音卡实现电话呼叫的功能。实例运行结果如图13.12所示。
技术要点
本例采用东进公司开发的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);
参数说明如下。
l     wChnlNo:标识通道号。
返回值:如果为1,对于外线表示有振铃信息;对于内线,表示提机。如果为0,对于外线,表示无振铃信息;对于内线,表示挂机。
(9)OffHook函数
该函数用于外线提机。对于内线,不起作用。语法如下:
[DllImport("Tc08a32.dll", CharSet = CharSet.Auto)]
public static extern void OffHook(short wChnlNo);
参数说明如下。
l     wChnlNo:标识外线通道。
(10)HangUp函数
该函数用于外线挂机。对于内线,不起作用。语法如下:
[DllImport("Tc08a32.dll", CharSet = CharSet.Auto)]
public static extern void HangUp(short wChnlNo);
参数说明如下。
l     wChnlNo:标识外线通道。
(11)Sig_Init函数
该函数用于完成信号音检测的初始化工作。语法如下:
[DllImport("NewSig.dll", CharSet = CharSet.Auto)]
public static extern void Sig_Init(int Times);
参数说明如下。
l     wPara:缺省值为0,不起作用。
(12)Sig_CheckBusy函数
清空忙音检测的缓冲区以及内部计数。当检测对方挂机的忙音后,必须调用本函数。语法如下:
[DllImport("NewSig.DLL", CharSet = CharSet.Auto)]
public static extern void Sig_ResetCheck(short wChlNo);
参数说明如下。
l     wChNo:标识通道号。
l     返回值:为1表示检测到忙音;为0,表示没有检测到忙音。
(13)Sig_ResetCheck函数
该函数用于清空忙音检测的缓冲区以及内部计数。当检测对方挂机的忙音后,必须调用本函数。语法如下:
[DllImport("NewSig.DLL", CharSet = CharSet.Auto)]
public static extern void Sig_ResetCheck(short wChlNo);
参数说明如下。
l     wChNo:标识通道号。
(14)Sig_StartDial函数
该函数用于拨打电话号码。开始某通道的呼出过程。该函数只是设置通道的呼出缓冲区,真正的呼出过程需要循环调用Sig_CheckDial函数来逐步完成。语法如下:
[DllImport("NewSig.dll", CharSet = CharSet.Auto)]
public static extern int Sig_StartDial(short wChNo, [MarshalAs(UnmanagedType.LPArray)] byte[] DialNum, [MarshalAs(UnmanagedType.LPArray)] byte[] PreDialNum, short wMode);
参数说明如下。
l     wChNo:标识通道号。
l     DialNum:标识呼出号码。
l     PreDialNum:标识前导号码。
l     wMode:呼出检测的模式。
(15)Sig_CheckDial函数
该函数用于检测呼出结果。
在调用函数Sig_StartDial启动拨号过程后,就可以循环调用Sig_CheckDial函数维持拨号过程,并检测呼出的结果,直至得到结果为止。
拨号的一般过程如下。
1.如果参数PreDialNum不为空,则延迟1秒后拨出PreDialNum,如果参数PreDialNum为空,则直接进入步骤3。
2.检测PreDialNum是否已发完。如已发完转至步骤3。
3.检测是否有拨号音,如拨号音长度达到配置项DialToneAfterOffHook的数值,则发送DialNum码串,并转至步骤4。如在此步骤已等待配置项NoDialToneAfterOffHook定义的时间长度仍未检测到拨号音,则返回0x10。
4.检测DialNum码串是否发完,如已发完则延迟StartDelay配置项的时间长度后进入步骤5。
5.如果从进入此步骤起已经过配置项RingLen定义的时间长度,拨号音仍未停止则返回0x10;如果在此步骤已等待配置项NoRingLen定义的时间长度仍未检测到回铃音则返回0x10;如果检测到占线忙音数达到配置项BusySigCount定义的数字,则返回0x21;如果检测到对方摘机,则返回0x14;如果进入此步骤已经过配置项Ringback_NoAnswerTime定义的时间长度,并且已检测到回铃音,则返回0x13;其他情况返回0x10。
注意:在进行呼出结果检测之前必须调用函数StartSigCheck启动信号音采集过程,并且在进行呼出结果检测时,要循环调用FeedSigFunc函数维持信号音采集过程。
语法如下:
[DllImport("NewSig.dll", CharSet = CharSet.Auto)]
public static extern int Sig_CheckDial(short wChNo);
参数说明如下。
l     wChNo:标识通道号。
l     返回值包括以下几种情况。
l     16(0x10):尚未得出结果。
l     15(0x0F):没有拨号音。
l     33(0x21):检测到对方占线的忙音。
l     20(0x14):对方摘机,可以进行通话。
l     19(0x13):振铃若干次,无人接听电话。
l     21(0x15):没有信号音。
注意:关于语音卡其他函数语法请参见光盘中的本实例文件D161A.CS,该文件给出大部分语音卡的函数语法。
实现过程
(1)新建一个项目,命名为Ex13_11,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,用于执行电话拨号和电话挂机,添加一个DataGridView控件,显示语音卡各通道及通道状态,添加Timer组件实现电话的呼出过程,添加一个TextBox控件,用于输入呼出电话号码。
(3)主要程序代码。
在窗体装载事件中,主要进行初始化语音卡驱动程序,并且检测通道总数及状态,为每一条通道分配语音缓冲区。代码如下:
private void Form1_Load(object sender, EventArgs e)
{
//初始化驱动程序
long load = DJ160API.LoadDRV();
//检测通道总数,并为每个通道分配语音缓冲区
short wuseCh = DJ160API.CheckValidCh();
short wFileBufLen = 16 * 1024;
long card = DJ160API.EnableCard(wuseCh, wFileBufLen);
//设置表格通道的行数
dataGridView1.RowCount = wuseCh;
//检测每个通道类型
short chanelTpye = 0; //定义通道类型变量
string strType = "";
for (short i = 0; i < wuseCh; i++)
{
chanelTpye = DJ160API.CheckChType(i);
dataGridView1[0, i].Value = i;
switch (chanelTpye)
{
case 0:
strType = "内线";
break;
case 1:
strType = "外线";
break;
case 2:
strType = "悬空";
break;
}
dataGridView1[1, i].Value = strType;
dataGridView1[2, i].Value = "空闲";
}
}
在DataGridView控件中选择一个外线空闲通道,单击【拨号】按钮,进行电话拨号,并且将拨号过程中的状态显示在相应的DataGirdView表格中。代码如下:
private void button1_Click(object sender, EventArgs e)
{
short wuseCh = DJ160API.CheckValidCh();
short wFileBufLen = 16 * 1024;
long card = DJ160API.EnableCard(wuseCh, wFileBufLen);
DJ160API.Sig_Init(chanel);
//检查(外线)是否有振铃信号或(内线)是否有提机
bool ring = DJ160API.RingDetect(chanel);
//外线提机
DJ160API.OffHook(chanel);
byte[] ss =new byte[textBox1.Text.Length];
byte[] s ={ 0 };
for (int i = 0; i < textBox1.Text.Length; i++)
{
ss[i] = Convert.ToByte(textBox1.Text.Substring(i, 1));
}
DJ160API.Sig_StartDial(chanel, ss, s, 0);
timer1.Enabled = true;
dataGridView1[2, chanel].Value = "拨号中...";
dataGridView1[3, chanel].Value = textBox1.Text;
}
单击【挂机】按钮,实现电话挂机功能。代码如下:
private void button2_Click(object sender, EventArgs e)
{
DJ160API.HangUp(chanel);
DJ160API.Sig_ResetCheck(chanel);
DJ160API.StartSigCheck(chanel);
timer1.Enabled = false;
dataGridView1[2, chanel].Value = "空闲";
dataGridView1[3, chanel].Value = "";
}
Sig_StartDial函数用于拨打电话号码。开始某通道的呼出过程。该函数只是设置通道的呼出缓冲区,真正的呼出过程需循环调用Sig_CheckDial函数来逐步完成。代码如下:
private void timer1_Tick(object sender, EventArgs e)
{
DJ160API.Sig_CheckDial(chanel);
}
单击DataGridView控件的相应行记录相应的通道号,代码如下:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
chanel = (short)e.RowIndex;
}
举一反三
根据本实例,读者可以开发以下程序。
实现电话自助服务系统。
实现电话自动报警系统。

[转]c# 语音卡控制--语音卡电话呼叫系统相关推荐

  1. 局域网语音对讲系统_SOC1900申瓯电话录音系统 南京电话录音设备销售中心

    申瓯SOC1900系列电话录音系统是SOC1800录音系统的升级型,比SOC1800新增单机路数增大到64路,电话接口RJ11改为RJ45网口(一个RJ45可以接4部电话录音),硬盘接口改进用户可以自 ...

  2. 呼叫中心电话录音系统不只是实现通话录音

    电话录音系统应当实现以下功能: 实时录音的功能:电话录音系统录音采用了压控.声控.键控三种录音方式,实时对监控电话进行录音. 监听功能:电话录音系统实现了实时监听的功能,通过语音卡和音箱,随时监听任何 ...

  3. 企业级:基于语音卡呼叫中心系统 CTI语音服务器,电话排队系统,电话转接系统,电话录音系统

    <CTI通讯接口软件D081A>用  户  手  册 语音服务器软件源代码+用户手册+数据结构+开发文档 有需要的给我留言! 我的QQ  7732 4199  本系统基本上可以适用于 有语 ...

  4. 移动新魔百盒M411A_905L3_5621_语音免拆_卡刷固件包

    移动新魔百盒M411A_905L3_5621_语音免拆_卡刷固件包 图片参照固件包 特点: 1.适用于卡刷: 2.开放原厂固件屏蔽的市场安装和u盘安装apk: 3.修改dns,三网通用: 4.大量精简 ...

  5. M401H_山东移动_SM0_SD46_国科6323芯片_安卓4_AI语音_免拆卡刷固件包

    M401H_山东移动_SM0_SD46_国科6323芯片_安卓4_AI语音_免拆卡刷固件包 固件特点: 1.修改dns,三网通用: 2.开放原厂固件屏蔽的市场安装和u盘安装apk: 3.无开机广告,无 ...

  6. 物联网卡是什么,是流量卡还是语音卡

    近几年,物联网技术应用在市场上迅速费发展起来,很多领域和行业都应用到了物联网技术,社会智能化和信息化的发展有更进了一步,而物联网技术应用我们最熟悉的就是物联网卡,大家对物联网卡可能非常熟悉,但是说道物 ...

  7. 分享一个C#使用AT指令控制语音猫的例子

    阅读全文:http://www.cckan.net/forum.php?mod=viewthread&tid=61 先来说说 最近公司让开发一个语音猫充值的软件,就是拨打10086(虚拟)进行 ...

  8. API卡_物联网卡为何更适用于儿童电话手表

    儿童智能手表一出来,就广受家长们的喜爱.主要是家长忙于工作,不能给孩子过多的时间陪伴.当不在孩子身边的时候,难免会担心孩子安全.谁不想给孩子增加额外的安全?它的主要功能是定位和通信.但儿童的手机手表应 ...

  9. 物联网卡是可以拨打电话的智能卡吗

    近年来,随着物联网技术的不断发展,物联网卡也开始大量涌现,所成为万物互联的载体,也成为智能厂家所追逐的焦点,在咨询过程中,也有不少朋友问小编,物联网卡能不能开通语音功能,可以拨打电话吗?答案当然是否定 ...

  10. 局域网语音对讲系统_高速公路隧道电话广播一体调度系统解决方案

    昆仑科技隧道紧急电话广播一体调度系统技术方案 一. 系统行业概述 随着我国高速公路及隧道建设的速度和规模突飞猛进,如何提高高速公路运营管理水平.建立和完善高速公路的基本配套设施.加强交通管理和法律意识 ...

最新文章

  1. 深度探索javascript的call和apply面向对象应用
  2. [tomcat7源码学习]结束Bootstrap进入Catalina
  3. PHP性能调优,PHP慢日志---PHP脚本执行效率性能检测之WebGrind的使用
  4. go 清空文件内容_玩转Go单元测试,你只需要掌握这5点
  5. C++学习笔记之——引用 内联函数
  6. D盘提示RAW文件如何找回
  7. 面向对象程序设计-C++ Default constructor Copy constructor Destructor Operator Overloading【第九次上课笔记】...
  8. C++中的内联函数和C中的宏定义的区别
  9. 自学UI设计,应当具备的基础技能(软件)
  10. IEEE ISO/IEC简介
  11. HarmonyOS 正式登陆华为手机,4月陆续升级!
  12. 百万 Android 用户受感染!
  13. this cluster currently has [1946]/[1000] maximum shards open
  14. atomicReference 的使用和AtomicStampedReference 解决ABA的问题
  15. BEGINNING SHAREPOINT#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础...
  16. 用户粘性︱如何提升用户忠诚度
  17. 2022-2028年中国数字示波器行业市场调查研究及投资策略研究报告
  18. 无条件呼叫前转接已启用
  19. python代码情话_python教你谈恋爱-之-土味情话5000条
  20. JAVA微信小程序在线教育视频学习小程序系统毕业设计 开题报告

热门文章

  1. 概率的意义:随机世界与大数法则
  2. 每秒浮点运算次数FLOPS
  3. Python代码制作“恐龙跳一跳“小游戏
  4. 引用限定符 reference qualifiers
  5. 提高共射放大电路增益不改变直流偏置的手段
  6. Win10电脑卡顿原因和解决方法
  7. 解决Win10/Win11输入法卡顿问题
  8. python输出数字三角形_Python|2020蓝桥杯之数字三角形
  9. apfs扩容_小米2020pro增强版 黑苹果 最新教程
  10. itextpdf 给pdf文档添加图片