联想射雕的MODEM来电显示的问题

roc_fu 2003-10-09 03:14:40
最近作一个来电显示的程序,用联想射雕的MODEM,向Modem发送AT指令都可以,也可以接受MODEM返回的OK或ERROR,问题是拨号进来的时候,串口收不到任何消息,连RING都收不到,用的TurboPower的异步通讯控件,开始怀疑是控件的问题,所以换了MS的COM控件,仍然不行,最后我用超级终端来测试,拨号进来的时候也是没有任何消息,连RING都没有,好像拨号和终端一点关系都没有一样!
但是有个哥们用"喂,小丽呀"那个程序就读到了来电显示,哪位用过这个Modem的兄弟,知道是怎么回事?
...全文
172 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mconnm 2010-05-31
  • 打赏
  • 举报
回复
方寸电话录音盒专为需要电话录音、收来电号码和拨出号码的软件开发者设计,可以方便地得到来电号码,拨出号码,摘挂机状态,震铃状态,电话录音。我公司提供的来电显示二次开发动态库,并且提供示例程序演示怎样取电话来电号码,拨出号码,摘挂机状态,震铃状态,以及怎么进行电话录音。

该硬件系统适合很多行业,比如电话办公系统、值班系统、送水系统、花店送花、文秘办公系统、小区电话报警等等。当有顾客打电话订购或咨询时,第一次记录电话和地址后,再次来电时会自动弹出来电人地址及曾经记录保存过的其它信息,这样避免了每次询问记录客户地址等,能提高工作效率,有能给客户留下简洁高效的印象。
联系人: 陈先生
网 址: http://www.mconnm.com
qq:374219104
mconnm 2010-05-31
  • 打赏
  • 举报
回复
方寸电话录音盒专为需要电话录音、收来电号码和拨出号码的软件开发者设计,可以方便地得到来电号码,拨出号码,摘挂机状态,震铃状态,电话录音。我公司提供的来电显示二次开发动态库,并且提供示例程序演示怎样取电话来电号码,拨出号码,摘挂机状态,震铃状态,以及怎么进行电话录音。

该硬件系统适合很多行业,比如电话办公系统、值班系统、送水系统、花店送花、文秘办公系统、小区电话报警等等。当有顾客打电话订购或咨询时,第一次记录电话和地址后,再次来电时会自动弹出来电人地址及曾经记录保存过的其它信息,这样避免了每次询问记录客户地址等,能提高工作效率,有能给客户留下简洁高效的印象。
联系人: 陈先生
网 址: http://www.mconnm.com
qq:374219104
lhz888 2003-10-23
  • 打赏
  • 举报
回复
要在MS超级终端测试过行才好开发,要不然你连环境都没建好,跟本不知问题出在哪,所以
强烈要求猫和驱程序都是好的,如果不行,哪........只有重装了(我就是这样的^_^),
lhz888 2003-10-23
  • 打赏
  • 举报
回复
兄弟,我也在做来电显示及呼入呼出录入的开发,我写的一个测试来电显示,不过我是用TAPI写的,现在还没成功,就是来电显示捉不到,晕~~!!!其他还好,还可以RING一下!!!
--------------------------------------------------------------------------------
以下是一些资料或者对你有用:
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到应用程序,应用程序应在此时释放会话资源以等待下一次来电处理。
--------------------------------------------------------------------------------
如果要代码也可以给(就是还没搞好,怕见笑^_^)
roc_fu 2003-10-23
  • 打赏
  • 举报
回复
驱动程序绝对原装,也有EnableCallerID 项,我对Modem的AT指令Modem也能正常返回OK或Error,只是电话播入的时候,没有返回,连RING也没有
ujjcel 2003-10-22
  • 打赏
  • 举报
回复
关注
lhz888 2003-10-22
  • 打赏
  • 举报
回复
是不是驱动没装好,要不然在MS的超级终端就可以显示来电显示,你装的是不是原装的驱动程序??
-----------------------------------------------------
在驱动程序安装以后,AT命令就被写到注册表里去了。不同的操作系统,注册表的结构也有所不同。在win9x中,在LOCAL_MACHINE\system\CurrentControlSet\services\class\modem下,每一个猫对应一个子目录,比如第一个猫是0000目录,第二个是0001.打开目录,可以看到许多子目录和数据项,每个子目录对应着一个动作,比如拨号,应答等,目录里面则是具体的AT命令。数据项中描述了猫的一些属性,比如Model项就是猫的驱动描述,matchingDeviceID对应的是PCI\xxxx,在LOCAL_MACHINE\system\CurrentControlSet\services\enum下可以找到这个项,在里面可以找到和串口有关的信息,比如猫对应的串口号等。
在xp中,LOCAL_MACHINE\system\CurrentControlSet\services\modem下可以找到0,1...项代表各路猫。打开其中的一项,其值是PCI\XXXX的格式。在LOCAL_MACHINE\system\ControlSet001\enum\中可以找到与该值相应的项。打开它的子项,其中有一项是Driver,在LOCAL_MACHINE\system\ControlSet001\control\class中可以找到项名为Deriver的值的项,该项下面有许多项,比如Answer,VoiceAnswer,StartPlay,StartRecord,EnableCallerID,Hangup等等,打开其中的一项,可以发现里面的内容是猫执行某项操作的时候需要用到的AT命令。比如Rockwell芯片的猫的EnableCallerID里面的内容通常是

Name Type Data

(Default) REG_SZ (value not set)

1 REG_SZ at+vcid=1

有时候猫的驱动程序安装不正确,里面就有可能缺少某些项,比如金网霸PF-X01(芯片Conexant 11242)在98下安装后就没有 EnableCallerID 项,这样在TAPI模式下,猫就没有来电显示功能了。要想解决这个问题,可以手工把这一项添加到注册表里面。

Behard 2003-10-16
  • 打赏
  • 举报
回复
我使用过联想的 Modem,应该是可以的(不过我好像使用的是I代产品)

首先是发送 AT\r 命令到 Modem,才会返回信息到串口的
long ReadTime( void )
{
union REGS r;
long milliseconds;

r.h.ah = 0x2c;
int86( 0x21, &r, &r );
milliseconds = (long) r.h.dl * 10; // dl : hundredths
milliseconds += (long) r.h.dh * 1000; // dh : seconds
milliseconds += (long) r.h.cl * 60000L; // cl : minutes
milliseconds += (long) r.h.ch * 3600000L; // ch : hours
return( milliseconds );
}

int Initialize ( void )
{
long timeout ;
char *rece_temp ;

timeout = ReadTime () + 2000L ;

comm_putc ( 'A' ) ;
comm_putc ( 'T' ) ;
comm_putc ( '\r' ) ;

while ( ReadTime () < timeout )
{
if ( bufferOK )
{
bufferOK = 0 ;
if ( ( rece_temp = strstr ( inter_buffer, "OK" )) != 0 )
{
return 1 ;
}
}
}
return 0 ;
}

int Dial ( void )
{
long timeout = ReadTime () + 60000L ;
char *rece_temp ;

inter_no = read_no = 0 ;
comm_putc ( 'A' ) ; //Can use SendCommand()
comm_putc ( 'T' ) ;
comm_putc ( 'D' ) ;
comm_putc ( 'T' ) ;
SendCommand ( telephone ) ;
comm_putc ( '\r' ) ;

while ( ReadTime () < timeout )
{
if ( bufferOK )
{
bufferOK = 0 ;
if ( ( rece_temp = strstr ( inter_buffer, "CONNECT" )) != 0 )
{
return 1 ;
}
if ( ( rece_temp = strstr ( inter_buffer, "NO CARRIER" )) != 0 )
{
return 0 ;
}
}
}
return 0 ;
}

int Answer ( void )
{
long timeout = ReadTime () + 60000L ;
char *rece_temp ;

inter_no = read_no = 0 ;
comm_putc ( 'A' ) ;
comm_putc ( 'T' ) ;
comm_putc ( 'A' ) ;
comm_putc ( '\r' ) ;

while ( ReadTime () < timeout )
{
if ( bufferOK )
{
bufferOK = 0 ;
if ( ( rece_temp = strstr ( inter_buffer, "CONNECT" )) != 0 )
{
return 1 ;
}
if ( ( rece_temp = strstr ( inter_buffer, "NO CARRIER" )) != 0 )
{
return 0 ;
}
}
}
return 0 ;
}

int Ring ( void )
{
char *rece_temp ;

if ( bufferOK )
{
bufferOK = 0 ;
if ( ( rece_temp = strstr ( inter_buffer, "RING" )) != 0 )
{
return 1 ;
}
}
else
return 0 ;
}

int Hangup ( void )
{
long timeout = ReadTime () + 1250 ;
char *rece_temp ;

while ( ReadTime() < timeout )
;
SendCommand ( "+++" ) ;

timeout = ReadTime() + 1250 ;

while ( ReadTime() < timeout )
;
timeout = ReadTime() + 10000L ;
SendCommand ( "ATH0\r" ) ;

while ( ReadTime () < timeout )
{
if ( bufferOK )
{
bufferOK = 0 ;
if ( ( rece_temp = strstr ( inter_buffer , "OK" )) != 0 )
{
return 1 ;
}
}
}

return 0 ;
}
naughtyboy 2003-10-15
  • 打赏
  • 举报
回复
AT命令俺不知道,不过以前做过一个报警程序
用的是APRO的TApdTApiDevice,里面有个CallerID属性,能够显示Incoming Number
SCUM 2003-10-15
  • 打赏
  • 举报
回复
联想射雕II才有来显芯片
roc_fu 2003-10-15
  • 打赏
  • 举报
回复
我用的就是联想射雕II 阿
bottom 2003-10-10
  • 打赏
  • 举报
回复
太难了,找联想 技术人员!
roc_fu 2003-10-09
  • 打赏
  • 举报
回复
还有,当我用我自己笔记本上的内猫时,拨号到Modem,只要输入ATA指令,Modem就握手了,但是对这个猫,ATA指令也没有用,握手灯开着,就是不连接
whitetiger8 2003-10-09
  • 打赏
  • 举报
回复
关注了
roc_fu 2003-10-09
  • 打赏
  • 举报
回复
执行遍了我能找到的AT命令集中的相关资料,就是不行,根本不报RING,而且,通过ats0=2设置自动应答也不行,返回的倒是OK,难道这个Modem的终端和拨号电路上就分开了?
耙子 2003-10-09
  • 打赏
  • 举报
回复
对Modem使用ATQ0V0初始化,让他显示Modem结果

自己参看Modem的AT命令集
佣工7001 2003-10-09
  • 打赏
  • 举报
回复
不懂阿,蹭分

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧