用MODEM+TAPI实现来电显示的方法
前言:MODEM 与 TAPI
Windows电话API被称为TAPI。Microsoft公司的TAPI提供单方连接。TAPI的目的是为Window平台提供"个人电话",它包含在Windows95系统中。
一般用户在购买MODEM时,都会得到一个MODEM的驱动CD。由于计算机与MODEM之间的通信方式均通过串口进行,外置MODEM是通过串口线连接计算机与MODEM,内置的MODEM的驱动通过虚拟的一个串口实现通信。而计算机与MODEM之间的通信,则完全通过程序控制串口发送AT命令数据到MODEM。TAPI则扮演了应用程序与串口之间的联系角色,保证了软件开发的一致性。用户只需关注TAPI,而不需关注不同的MODEM的不同的AT命令集。对于特定的MODEM,若知道AT命令集的完整解释,所有的通过TAPI的操作,也完全可以直接通过控制串口来实现。
实现来电显示的方法,如同上面所述可以直接自己解释AT命令集或通过TAPI实现,由于直接通过AT命令集进行处理相对来说较为复杂,本文仅针对TAPI解释。
一、 实现来电显示的系统最小需求。
1. 你的固定电话已经向电信局申请开通了来电显示功能,若没有申请,即使MODEM支持也是白搭。
2. 安装了MODEM的驱动软件。
3. MODEM支持来电显示。关于确定MODEM是否支持来电显示的方法,下面将有介绍。
4. 没有软件也是不行的了,所以你还得下载我的来电显示器,下载的地址:
HTTP://WWW.NJZTL.COM/cid/TAPICID.HTML
二、 确定MODEM是否支持来电显示的方法。
方法1:
若已经安装好MODEM驱动软件(即MODEM AT命令集的解释表),就可以用REGEDIT.EXE在系统注册表中查找到MODEM的配置表:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Modem\0000
其中0000为WINDOWS给MODEM编的号,不同的MODEM在这里可能为0001,0002等,以下缺省当作0000。当然你可以查看 0000\Model 是否为你所使用的MODEM。
查阅 0000\VoiceProfile的值,例如:27 00 08 00 ,在TAPI 参考(MSDN Library Visual Studio 6.0\DDK Documentation\Design and Implementation Guide\Windows 95 Modem Registry Reference\Voice Modem Registry Settings\VoiceProfile)中的解释为,若第一字节的高位为1 ,即表示MODEM不支持来电显示。
方法2:
查阅 0000\EnableCallerID\1的值,该值指示TAPI激活来电显示的AT命令,若注册表不存在该项目,那你的MODEM则肯定不支持来电显示。
一般来说激活来电显示的AT命令为at#cid=1<cr>或at+vcid=1<cr>(<cr>代表回车键chr(13),<lf>代表换行符chr(10),以下类同),由于激活来电显示的命令不是一个普通的AT命令,MODEM一般不保存在缺省配置(即at&w0,at&w1)中,故若你想直接通过控制串口来实现来电显示,每次运行软件时或检测到MODEM重新开机时均需要发此命令到MODEM。
若使用TAPI来实现来电显示,在执行 lineOpen 函数后,系统会自动初始化MODEM,并发送激活来电显示的AT命令。
方法3:
一般来说在满足了方法1、方法2的条件的情况下,也并不表明你的MODEM就支持来电显示,但至少离成功已经不远了,若在此时使用我的软件仍然不能实现来电显示,那么你就必需好好研究下面我说的方法。
统计起来,来电显示在注册表中的相关项目包括:
主键 值 说明
0000\CallerIDOutside "O"
0000\CallerIDPrivate "P"
0000\VoiceProfile 27 00 08 00
0000\EnableCallerID\1 AT+VCID=1<cr>
0000\Responses\<cr><lf>DATE = 93 00 00 00 00 00 00 00 00 00 来电显示的日期
0000\Responses\TIME = 94 00 00 00 00 00 00 00 00 00 来电显示的时间
0000\Responses\NMBR = 95 00 00 00 00 00 00 00 00 00 来电显示的号码
0000\Responses\NAME = 96 00 00 00 00 00 00 00 00 00 来电显示的名称
有关Responses的完整解释请查阅最新的MSDN,或到Microsoft的网站上查找,至少在我的TAPI 参考(MSDN Library Visual Studio 6.0\DDK Documentation\Design and Implementation Guide\Windows 95 Modem Registry Reference\Data Modem Registry Entries\Responses)中的解释就不正确。
若要最终确定你的MODEM是否支持来电显示,请用WINDOWS的超级终端软件,进入超级终端后选择要测试的MODEM,执行命令AT+VCID=1<cr>。而后拨打电话,等待并查看返回的信息,若在一到两个振铃信号之后仍然没有返回信息,很不幸你的MODEM不支持来电显示。一般来说来电显示的信息为:
DATE = 0522 "来电日期 MMDD
TIME = 1632 "来电时间 HHMM
NMBR = 139519828 "来电号码
换成标准的表示法即为:
<cr><lf>DATE = 0522<cr><lf>TIME = 1632<cr><lf>NMBR = 13951982895<cr><lf>
请注意在此(<cr><lf>DATE =)(TIME =)(NMBR =)应与其在注册表中的名称相互对应。
例如:若对应于值95 00 00 00 00 00 00 00 00 00的名称为(NMBR=),而实际应为(NMBR =),则TAPI将不能解释出来电显示,此时你应当修改对应于值95 00 00 00 00 00 00 00 00 00的名称为(NMBR =),同理注册表中(<cr><lf>DATE =)(TIME =)也应确保与返回的信息相同,在实际中就发现有的MODEM存在此类问题,修改过注册表后就一切正常。
三、 MODEM+TAPI实现来电显示的过程。
1、 使用lineInitializeEx初始化TAPI。
2、 用lineOpen打开TAPI线路,其中权限为LINECALLPRIVILEGE_OWNER,媒体模式为LINEMEDIAMODE_DATAMODEM。
3、 当振铃时,TAPI传送LINECALLSTATE_OFFERING消息到应用程序,应用程序同时获得一个会话句柄。
4、 当交换机发送来电信号到MODEM时,MODEM负责对来电信号的解释并传送信息到TAPI,TAPI解释收到的数据,并传送LINECALLINFOSTATE_CALLERID消息到应用程序,应用程序调用 lineGetCallInfo获得返回的来电信息。
5.当线路空闲或用户结束会话时,TAPI传送 LINECALLSTATE_IDLE 或 LINECALLSTATE_DISCONNECTED到应用程序,应用程序应在此时释放会话资源以等待下一次来电处理。
四、 关与实现来电显示的源程序
本程序采用VB6编写,需要的文件都包含在压缩包cid.zip中
cid.vbp 工程文件
frmMain.frm 主画面文件
VBTapi.bas TAPI的定义及过程
TAPILine.cls 包装好的TAPI类
Cwait.cls 包装好的延时类
cid.exe 已编译好的来电显示程序
cid.mdb 用于保存来电信息的数据库
软件需求:
1、需要的VB支持文件 MSVBVM60.DLL(未包含在安装程序中,98及以上机器有)。
2、数据库环境为ADO 2.1(未包含在安装程序中,98及以上机器有)。
本来电显示器已经经过我较全面的测试,可以针对任何内置与外置型的MODEM。