我需要开发一个小实用程序来将一种格式的来电显示转换为另一种格式。我有支持来电显示的 US Robotics 56K USB 调制解调器,我的服务提供商 (BT) 也为我的线路启用了来电显示功能(手机上显示号码)。
我有上面提到的调制解调器,连接到同一条线路,但我不知道它给出的数字格式是什么,或者我如何才能仅在 C# 应用程序中获取电话号码。
在美国机器人网站上,没有关于调制解调器如何工作的开发人员指南。
我需要一些指导。
根据他们的手册,您可以使用AT 命令打开来电显示(默认情况下禁用)并检索来电:
+VCID - 来电显示 (CID)
此命令控制与下一个呼叫的来电线路 ID (ICLID) 数据格式的呼叫者 ID 服务相关的数据的报告和呈现。
+VCID=<pmode>
0 禁用来电显示报告。(默认。)
1 启用向 DTE 进行格式化演示的来电显示。调制解调器以对格式显示数据项。预期的对是日期、时间、姓名和呼叫者代码(电话号码),
2 启用向 DTE 显示未格式化的来电显示。
检索:
+VRID - 报告检索到的呼叫者 ID (CID)
此命令以传入呼叫线路 ID (ICLID) 数据格式报告与最后接收呼叫的呼叫者 ID 服务相关的数据。
+VRID=<pmode>
0 向 DTE 报告带有格式化显示的呼叫者 ID。调制解调器以对格式显示数据项。预期的对是日期、时间、姓名和呼叫者代码(电话号码),
1 向 DTE 报告带有未格式化显示的来电显示。
我不确定如何通过 USB 与调制解调器通信,在我的日子里,它都是串行端口(并且有 C# 的 COM 端口库),不知道 USB 调制解调器是否实现了虚拟 COM 端口以兼容终端软件。在从 C# 开始执行此操作之前,可以选择使用终端仿真器(Windows 曾经附带HyperTerminal,但那是很久以前的事了),然后尝试直接与调制解调器对话以了解是否以及如何进行通信作品。
我希望这会有所帮助。
我的 USB 调制解调器显示为 /dev/ttyACM0 设备。我已经能够在 Linux 和 Windows 中将它用作串行设备。
在 Linux 中,您可以使用 dmesg 命令并确定它连接到什么设备。例如,对于设备一,它显示为 /dev/ttyACM0 对于第二个设备,它将显示为 /dev/ttyACM1 ...
在 minicom 中,您可以通过键入“at +VCID=1”来设置来电显示,它应该以“OK”响应。
在windows中,你可以使用putty并将其设置为115200,n,8,1的串口。我也使用 VC# 与之通信。
在美国机器人网站上,没有关于调制解调器如何工作的开发人员指南。
您需要USR 56K USB 调制解调器用户指南。它是 AT 命令的安装指南和完整列表。USR5637 页面上没有链接。显然它是一个 OEM 手册。我在 Google 上搜索“USR5637 DLE 消息”时偶然发现了它。
对于 USR5637,请确保您的固件版本为 v1.2.23。该版本修复了来电显示错误(请参阅发行说明)。您可以使用以下方法验证固件版本ATI3
:
Debug: modem_write
Debug: Write 5: "ATI3\r"
Debug: modem_read
Debug: Read 37: "U.S. Robotics 56K FAX USB V1.2.23
OK"
对于 USR5637,您必须发出一个 AT 命令或三个 AT 命令,具体取决于模式。如果您处于命令模式,则需要一个命令。如果您处于语音模式,则需要三个命令。
命令模式的一个 AT 命令:
# set caller
AT+VCID=1
语音模式的三个 AT 命令:
# set service class to voice
AT+FCLASS=8
# disable call waiting
AT+PCW=0
# set caller
AT+VCID=1
USR5367 的边缘非常锋利。您可以通过读取S1
寄存器从调制解调器获取振铃计数。S1
Accura、Conexant、MultiTech 和 USR 调制解调器支持读取振铃次数。从调制解调器获取响铃计数可以简化您的状态机,因为您不需要跟踪变量或不活动超时。但是,在 USR 调制解调器上读取S1
是破坏性的,它会破坏 Caller ID 未经请求的消息。
因此,如果您阅读S1
USR 调制解调器上的响铃计数,就会发生这种情况:
modem> RING
program> count = read S1
modem> # NAME, NMBR, DATE, TIME are not sent
modem> RING
program> count = read S1
USR 的另一个优势是,设置+PCW=0
在手册中有记录,但没有明确说明必须为 Caller ID 设置。我花了几个星期来尝试它。
我与 USR 支持人员进行了为期两周的交谈,试图让来电显示在调制解调器上工作。他们从来没有告诉过我+FCLASS=8
或+PCW=0
。他们的反应是,+VCID=1
在终端程序中尝试 Windows。他们从来没有承认我在 Linux 和 OS X 上工作。他们从来没有告诉我阅读S1
是破坏性的。他们从来没有意识到微软停止在 Windows 7 中发布该终端程序。
当 USR5367 的来电显示功能正常且调制解调器处于语音模式时,调制解调器将与来电显示相关的消息与“数据链路逃逸” (DLE) 消息进行通信。DLE 消息用字符 0x10 表示。
RING
与 通信,<DLE>+R
来电显示信息与<DLE>+X
。所以 ring 用两个字节0x10 0x52
(后跟<CR><LF>
)发出信号。呼叫者 ID 信息用两个字节0x10 0x58 0x10
(后跟<CR><LF>
)表示。来电显示数据<DLE>+X
使用名称/值对,如NAME=PASADENA MD<CR><LF>
和NMBR=4104394421<CR><LF>
。完整的 CallerID 消息如下所示(取自电话推销员电话):
<DLE>+X<CR><LF>
NAME=PASADENA MD<CR>
NMBR=4104394421<CR>
DATE=1106<CR>
TIME=1425<CR><LF>
(并且<CR><LF>
在手册中被称为“预告片”,并用作由S3
和S4
寄存器参数指示的行尾)。
我还提取了适用于 Windows 的 USR5637 驱动程序(USR5637Voice64bit.exe)并尝试了以下初始化字符串usr5637_rv.inf
:
AT
AT&F1E0Q0V1&C1&D2S0=0
官方驱动程序的初始化字符串没有在调制解调器上启用来电显示。
你试过这个
[CallerID]
HKR,,CallerIDOutSide,,O
HKR,,CallerIDPrivate,,P
HKR,,VariableTerminator,,<cr><lf>
HKR,EnableCallerID,1,,”AT#CID=1<cr>”
HKR, Responses, “<cr>”, 1, 01, 00, 00,00,00,00, 00,00,00,00
;00
HKR, Responses, “<lf>”, 1, 01, 00, 00,00,00,00, 00,00,00,00
;00
HKR,Responses,”<cr><lf>DATE = “,1,93,00,00,00,00,00,00,00,00,00
HKR,Responses,”MESG = “,1,97,00,00,00,00,00,00,00,00,00
HKR,Responses,”NAME = “,1,96,00,00,00,00,00,00,00,00,00
HKR,Responses,”NMBR = “,1,95,00,00,00,00,00,00,00,00,00
HKR,Responses,”TIME = “,1,94,00,00,00,00,00,00,00,00,00
对于 Number 你必须使用NMBR,对于名称NAME等等。