本文介紹下如何?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,只要它支援來電顯示即可。
二、怎麼判斷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);
然後我們就只需要關注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;
}
最後關閉程式的時候要釋放資源,否則會出現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);
}