本文介绍下如何实现Modem的来电显示的功能。Modem的来电显示是在我最早的送水管理软件中实现的,大概是05年完成的,由于Modem的成本比较低(普通的在100元之内),而来电显示功能在送水管理软件中比较需要,因此是一项性价比比较好的功能。
随着时间的推移,Modem的生产越来越少,而支持来电显示模块的Modem就更少一些了,取而代之是功能比较专一的来电显示盒横行天下,一般USB来电显示盒都可以支持2路、4路、8路等等,但是USB来电显示盒较贵,Modem由于性价比比较好,市场上依然还继续出现。本篇主要介绍如何实现Modem的来电显示,下篇将继续介绍基于USB的来电显示盒的接口开发。目前在我的送水软件中,为了兼顾两者的好处,一般是集成了两个硬件的功能,随便选一个硬件都可以使用来电显示功能。
看看Modem来电显示的应用场景,在送水软件中,链接一台电话(Modem只能连接一台电话),当有客户的电话接入的时候,软件会提示用户的信息,并进入下订单的界面,如下所示。
这样非常方便业务员的信息输入,同时还可以调出更多客户的相关信息,如客户的账号信息,购买记录作为默认这次订单的操作等,达到优质服务的目的。如下这个改进版的送水软件的来电显示功能就提供了客户财务信息,默认上次的购买记录等信息。
Modem的来电显示功能需要下面所需的前提条件。
一、 实现来电显示的系统最小需求。
1. 你的固定电话已经向电信局申请开通了来电显示功能,若没有申请,即使MODEM支持也是不行的。
2. 安装了MODEM的专用驱动软件( 注意不要使用Windows如XP自带的驱动程序)。
3. MODEM支持来电显示。不管是内置MODEM,外置MODEM,只要它支持来电显示即可。
下面介绍如何在C#中实现来电显示模块的功能。
Modem的来电显示需要一个和串口打交道的控件Apax Control,它是一个ActiveX的控件,原则上可以应用在任何语言中,本文只介绍在C#中的应用。
首先需要注册ActiveX控件,然后在开发IDE中引用控件,把控件拖动到界面上,如下所示。
然后生成目录会多出几个文件,如下所示。
在代码中,我们可以再Form_Load方法中初始化控件的一些属性。如下代码所示。
然后我们就只需要关注axApax1_OnRing和axApax1_OnTapiCallerID处理函数了,如下代码所示
最后关闭程序的时候要释放资源,否则会出现COM错误的,代码如下所示。
随着时间的推移,Modem的生产越来越少,而支持来电显示模块的Modem就更少一些了,取而代之是功能比较专一的来电显示盒横行天下,一般USB来电显示盒都可以支持2路、4路、8路等等,但是USB来电显示盒较贵,Modem由于性价比比较好,市场上依然还继续出现。本篇主要介绍如何实现Modem的来电显示,下篇将继续介绍基于USB的来电显示盒的接口开发。目前在我的送水软件中,为了兼顾两者的好处,一般是集成了两个硬件的功能,随便选一个硬件都可以使用来电显示功能。
看看Modem来电显示的应用场景,在送水软件中,链接一台电话(Modem只能连接一台电话),当有客户的电话接入的时候,软件会提示用户的信息,并进入下订单的界面,如下所示。
这样非常方便业务员的信息输入,同时还可以调出更多客户的相关信息,如客户的账号信息,购买记录作为默认这次订单的操作等,达到优质服务的目的。如下这个改进版的送水软件的来电显示功能就提供了客户财务信息,默认上次的购买记录等信息。
Modem的来电显示功能需要下面所需的前提条件。
一、 实现来电显示的系统最小需求。
1. 你的固定电话已经向电信局申请开通了来电显示功能,若没有申请,即使MODEM支持也是不行的。
2. 安装了MODEM的专用驱动软件( 注意不要使用Windows如XP自带的驱动程序)。
3. MODEM支持来电显示。不管是内置MODEM,外置MODEM,只要它支持来电显示即可。
二、怎么判断MODEM是不是支持来电显示?
1. 打开超级终端,随便输入一个连接名称,比如TEST。
2. 按确定后,下个窗口中,看到你的MODEM,不要输入电话号码。再下一步。
3. 在这个窗口中按取消。
4. 这样一个可以输入的空白窗口就有了。
输入:AT回车
如果出现OK,说明MODEM支持AT指令,不然,其他也不用试了。
然后输入下面的命令(每条前面加上AT),只要一条反应有OK,就说明MODEM本身芯片支持来电显示。
#CID=1
%CCID=1
+VCID=1
#CC1
*ID1
三、Modem 驱动安装的问题
如果您的操作系统是Windows 2K/XP,当安装MODEM驱动程序的时候,会自动安装操作系统自带的MODEM驱动,而此驱动程序只能支持数据传送(即只能用来拨号上网,而没有传真和语音功能)。所以您必须升级MODEM的驱动程序,并且在升级的时候手工指定到跟随MODEM的光盘中的驱动程序(而不让系统自己搜索)。并且在升级完之后重新启动系统。
下面介绍如何在C#中实现来电显示模块的功能。
Modem的来电显示需要一个和串口打交道的控件Apax Control,它是一个ActiveX的控件,原则上可以应用在任何语言中,本文只介绍在C#中的应用。
首先需要注册ActiveX控件,然后在开发IDE中引用控件,把控件拖动到界面上,如下所示。
然后生成目录会多出几个文件,如下所示。
在代码中,我们可以再Form_Load方法中初始化控件的一些属性。如下代码所示。
Code
// 设置来电显示控件的属性
this.axApax1.EnableVoice = true;
this.axApax1.Visible = false;
this.axApax1.TapiStatusDisplay = false;
this.axApax1.TapiAnswer();
this.axApax1.OnRing += new EventHandler(axApax1_OnRing);
this.axApax1.OnTapiCallerID += new IApaxEvents_OnTapiCallerIDEventHandler(axApax1_OnTapiCallerID);
// 设置来电显示控件的属性
this.axApax1.EnableVoice = true;
this.axApax1.Visible = false;
this.axApax1.TapiStatusDisplay = false;
this.axApax1.TapiAnswer();
this.axApax1.OnRing += new EventHandler(axApax1_OnRing);
this.axApax1.OnTapiCallerID += new IApaxEvents_OnTapiCallerIDEventHandler(axApax1_OnTapiCallerID);
然后我们就只需要关注axApax1_OnRing和axApax1_OnTapiCallerID处理函数了,如下代码所示
Code
/// <summary>
/// 来电响铃后的处理事件
/// </summary>
private void axApax1_OnRing(object sender, EventArgs e)
{
//由于此函数会触发3次,故使用axApax1_OnTapiCallerID事件进行处理。
}
/// <summary>
/// 来电响铃后的处理事件
/// </summary>
private void axApax1_OnTapiCallerID(object sender, IApaxEvents_OnTapiCallerIDEvent e)
{
ComingCallUtil.PlaySound();
string oldCaption = this.Text;
this.Text = "最近一个客户来电号码:" + this.axApax1.CallerID;
string phoneNumber = this.axApax1.CallerID;
this.axApax1.Close();
this.axApax1.TapiAnswer();
Portal.gc.CustomerComingCall(phoneNumber);
this.Text = oldCaption;
}
/// <summary>
/// 来电响铃后的处理事件
/// </summary>
private void axApax1_OnRing(object sender, EventArgs e)
{
//由于此函数会触发3次,故使用axApax1_OnTapiCallerID事件进行处理。
}
/// <summary>
/// 来电响铃后的处理事件
/// </summary>
private void axApax1_OnTapiCallerID(object sender, IApaxEvents_OnTapiCallerIDEvent e)
{
ComingCallUtil.PlaySound();
string oldCaption = this.Text;
this.Text = "最近一个客户来电号码:" + this.axApax1.CallerID;
string phoneNumber = this.axApax1.CallerID;
this.axApax1.Close();
this.axApax1.TapiAnswer();
Portal.gc.CustomerComingCall(phoneNumber);
this.Text = oldCaption;
}
最后关闭程序的时候要释放资源,否则会出现COM错误的,代码如下所示。
Code
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose(bool disposing)
{
if (this.axApax1 != null)
{
this.axApax1.Dispose(); //必须执行,否则出错
}
Portal.gc.Dispose(); //伍华聪
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose(bool disposing)
{
if (this.axApax1 != null)
{
this.axApax1.Dispose(); //必须执行,否则出错
}
Portal.gc.Dispose(); //伍华聪
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}