如何在 c#.net 中制作来电显示

How to make caller id in c#.net


我知道这是已回答的问题,但我想知道所需的硬件以及如何设置。

我正在尝试构建一个外卖送货系统,用户拨打电话,他们的 phone 号码会被 WINFORM 捕获。

我用谷歌搜索了一下,它说我需要使用 TAPI API。很好,但是我需要将任何东西连接到 PC 还是只使用 TAPI 就可以了?

This Link 在 VB.net 中进行了解释。我正在 c#.net 中寻找它。 我还浏览了 here.

提供的链接

但它没有任何地方解释设置。所以请帮忙。

第一件事

  • 查看您的硬件是否支持来电显示
  • 添加串行端口控件,将其设置为调制解调器所在的任何通信端口并观察来电显示号码,然后做出反应

要查看您的调制解调器是否支持来电显示,请打开串行端口终端(我喜欢 putty)并将其设置为调制解调器的 com 端口,然后调用附加到该调制解调器的 phone 号码,您应该看到类似 RING 5555555555 的内容(其中 5555555555 是呼叫您的 phone 号码)

您可能需要为该调制解调器打开来电显示(如果是)

1) 打开"Phone And Modem Options"控制面板

2) 单击 "Modems" 选项卡

3) Select 列表中的调制解调器(如果尚未选择)

4) 点击"Properties"按钮

5) 单击 "Advanced" 选项卡

6) 在 "Extra initialization commands" 编辑框中输入“#CID=1” 注意:将“#CID=1”替换为在调制解调器上启用来电显示的命令 不要包含命令的 "AT" 部分 不包括引号 7) 点击确定

8) 点击确定

9) 重启电脑

这是一些在 C# 中与串行端口交互的代码(如果您需要)

public SerialPort sp;
string dataReceived = string.Empty;
private delegate void SetTextDeleg(string text);

private void FormLoad()
{
 sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
 this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
 sp.Open();
}

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
 try
 {
      Thread.Sleep(500);
       string x = sp.ReadLine(); // will read to the first carriage return
       this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { x });
  }
  catch
  { }
}  

private void si_DataReceived(string data)
{
  dataReceived = data.Trim();

  // Do whatever with the data that is coming in.
}

另外,我刚刚在亚马逊上搜索了 "Caller ID Modem",似乎有很多 10 到 20 美元(美国)的产品支持这种确切的用途。我会推荐 Trendnet TFM-561U

如果您使用 phone 和传真调制解调器,只需将您的电话phone 线路插入调制解调器即可。

接下来在您的 windows 表单上拖放一个 SerialPort 控件并对其进行初始化。

    this.serialPort1.PortName = "COM3"; 
    this.serialPort1.BaudRate = 9600;
    this.serialPort1.DataBits = 8;
    this.serialPort1.RtsEnable = true;
    this.serialPort1.DataReceived += serialPort1_DataReceived;
    this.serialPort1.Open();      

将以下命令传递给调制解调器以激活来电显示

    this.serialPort1.WriteLine("AT#cid=1" + System.Environment.NewLine);

处理其DataReceived事件并显示接收到的数据

     void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
          richTextBox1.Text += this.serialPort1.ReadLine();          
     }

输出:

RING               //On 1st Ring
DATE = xxxxx       //On 2nd Ring
TIME = xxxx
NMBR = xxxxxxxxx

RING               //On 3rd Ring    
RING               //On 4th Ring

P.S。如果 telephone 线路发送 DTMF 音作为来电显示,那么您需要 DTMF 到 FSK 转换器来检测号码,否则您将收到振铃而不是号码。