điện thoại để cĩ thể nhận được các mã DTMF và truyền tiếng nĩi tới người gọi. Với yêu cầu này, mọi phiên bản TAPI cho ứng dụng 32-bit đều hỗ trợ nên em chọn phiên bản đầu tiên là TAPI 1.4 . Phiên bản này được thiết kế theo kiến trúc ngơn ngữ C++ nên khi lập trình trong Visual Basic sẽ khĩ khăn hơn. Tuy nhiên, ứng dụng TAPI 1.4 sẽ cĩ thể chạy trên mọi phiên bản Windows 32-bit và khơng địi hỏi cấu hình cao, trong khi ứng dụng TAPI 3 chỉ chạy trên Windows 2000/XP.
Để sử dụng các hàm của TAPI, các hàm này phải được khai báo trước trong một module giống như các hàm API khác của Windows. Sau đây là các bước để tạo một kết nối với cuộc gọi tới :
I. Khởi tạo đường truyền (line) :
Mọi hoạt động giao tiếp giữa điện thoại và máy tính muốn diễn ra thì trước hết cần phải khởi tạo đường truyền giữa máy tính và điện thoại. Ở đây, modem sẽ là thiết bị trung gian giữa máy tính và điện thoại. Vì thế, đường truyền mà ta cần quan tâm chính là modem. Một máy tính cĩ thể cĩ gắn nhiều hơn một modem. Vì vậy, trước hết ta cần phải sử dụng hàm lineInitialize() để lấy về tổng số đường truyền (line) mà nĩ phát hiện cĩ trong máy.
Cũng từ đây, ta sẽ chỉ định hàm nào sẽ tiếp nhận các sự kiện được sinh ra bởi các hoạt động của TAPI (ví dụ như khi chuơng reo, khi cĩ mã DTMF được gửi tới, vv...). Hàm này được gọi là lineCallBack() , do ta tự định nghĩa. Sau đĩ, ta sẽ lấy địa chỉ của hàm này và đưa vào hàm lineInitialize() như là một tham số của hàm lineInitialize()
Sau khi đã khởi tạo thành cơng, lineInitialize() sẽ trả về một handle của TAPI đã nạp vào bộ nhớ. Handle này sẽ được sử dụng trong suốt quá trình hoạt động của hệ thống.
II. Kiểm tra đường truyền (line) hợp lệ :
Vì mục đích của ta là lấy được các modem hiện cĩ nên ta cần phải kiểm tra những line nào thích hợp. Sau khi cĩ được tổng số các line, ta duyệt qua từng line để tìm line thích hợp bằng cách kết hợp gọi 2 hàm
lineNegotiateAPIVersion() và lineGetDevCaps().
Ứng với mỗi line, hàm lineNegotiateAPIVersion() sẽ trả về con số phiên bản (version) API mà tương thích với phiên bản của TAPI hiện đang sử dụng. Với con số phiên bản lấy được, hàm lineGetDevCaps() sẽ kiểm tra và trả về những chức năng được hỗ trợ trên line này. Từ đây, ta sẽ chọn được các line thích hợp chính là các modem hiện cĩ.
III. Mở line :
Để bắt đầu cho sự bắt tay làm việc giữa máy tính và điện thoại, sau khi đã chọn được line thích hợp, ta mở line đĩ bằng hàm lineOpen(). Nếu mở thành cơng. nĩ sẽ trả về một handle của line được mở. Với handle này, ta sẽ điều khiển mọi hoạt động diễn ra trên line này.
IV. Đăng ký các sự kiện cho TAPI :
Mọi sự kiện liên quan đến TAPI (ví dụ chuơng reo, phát/nhận các mã DTMF, ... ) được gửi đến hàm lineCallBack() đều phải được đăng ký sau khi mở line. Để đăng ký, ta gọi hàm lineSetStatusMessages() và đưa vào giá trị mơ tả các sự kiện mà ta cần. Giá trị này thực chất là một dãy các 32 bit liên tiếp, mỗi bit tương ứng với một sự kiện của TAPI.
V. Kết nối với cuộc gọi đến :
Khi cĩ tín hiệu gọi tới (chuơng reo), thơng điệp
LINEDEVSTATE_RINGING sẽ được gửi tới trong hàm lineCallBack() cùng với
một handle của cuộc gọi đĩ. Nếu số tiếng chuơng reo bằng với một con số mà ta quy định trước đĩ thì ta sẽ gọi hàm lineAnswer() với handle vừa nhận được để kết nối với cuộc gọi đến. Cơng việc này tương đương với việc nhấc máy điện thoại lên để trả lời người gọi tới. Vì vậy, kể từ lúc này, ta cĩ thể gửi và nhận các mã DTMF hoặc gửi đi một chuỗi âm thanh nào đĩ và người gọi cĩ thể nghe được.
VI. Thu nhận các mã DTMF :
Một khi đã kết nối thành cơng với cuộc gọi đến, ta gọi hàm
lineMonitorDigits() để giám sát và thu nhận các mã DTMF được gửi tới. Cĩ thể nĩi đây là phần trung tâm của hệ thống, vì hệ thống sẽ tiếp nhận yêu cầu của người gọi thơng qua các mã DTMF này.
Khi người gọi nhấn các phím trên điện thoại thì thơng điệp
LINE_MONITORDIGITS sẽ được gửi tới hàm lineCallBack() cùng với các mã DTMF tương ứng như sau :
Phím Mã DTMF (Hex) 0 30 1 31 2 32 3 33 4 34 5 35 6 36 7 37 8 38 9 39 * 2A # 23
VII. Kết thúc cuộc gọi :
Khi người gọi chọn yêu cầu “kết cầu thúc cuộc gọi” từ menu hoặc người gọi gác máy bất kỳ lúc nào, ta phải gọi hàm lineDrop() để hủy cuộc gọi hiện tại
đang kết nối và hàm lineDeallocateCall() để giải phĩng cuộc gọi khỏi bộ nhớ. Bây giờ hệ thống sẽ trở về trạng thái chờ đợi cuộc gọi khác đến.
VIII. Đĩng line hiện tại :
Nếu muốn chọn modem khác để hoạt động, hoặc kết thúc hoạt động của hệ thống, ta cần gọi hàm lineClose() để đĩng line hiện tại đang được mở. Đây là điều nên làm vì nĩ sẽ hồn trả tài nguyên về cho máy.
IX. Kết thúc TAPI :
Sau khi khởi tạo các line bằng hàm lineInitialize(), một số tài nguyên hệ thống sẽ bị chiếm dụng suốt phiên làm việc của TAPI. Khi thốt chương trình, ta gọi hàm lineShutdown() để kết thúc phiên làm việc đĩ, đồng thời giải phĩng các tài nguyên hệ thống.
Chương 3
THIẾT KẾ VÀ TRUY XUẤT CƠ SỞ DỮ LIỆU