• Thứ Sáu, 02/06/2006 10:34 (GMT+7)

    Quản lý điện thoại di động bằng C#

    Điện thoại di động (ĐTDĐ) còn được biết tới như một modem không dây hay GSM Modem. Nếu như modem là thiết bị truyền nhận dữ liệu qua dây (wire) thì ĐTDĐ là thiết bị truyền nhận dữ liệu qua sóng vô tuyến (wireless). Cũng như modem, chúng ta hoàn toàn có thể điều khiển được ĐTDĐ qua tập lệnh AT do Viện Tiêu Chuẩn Viễn Thông Châu Âu (European Telecommunication Standards Institute - ETSI) đưa ra.

    Dưới đây là một số tài liệu về tập lệnh thao tác với ĐTDĐ được sử dụng trong quá trình viết ứng dụng:

    [1]. GSM 07.05, ver 5.5.0 - Use of Data Terminal Equipment - Data Circuit Terminating Equipment (DTE - DCE) interface for Short Message Service (SMS) and Cell Broadcast Service (CBS).

    [2]. GSM 03.40, ver 5.3.0 - Technical realization of the Short Message Service (SMS) Point-to-Point (PP).

    [3]. GSM 03.38, ver 5.3.0 - Alphabets and language-specific information.

    [4]. GSM 07.07, ver 5.0.0 - AT command set for GSM Mobile Equipment (ME).

    Trong đó, tài liệu [1] mô tả về các kiểu định dạng của tin nhắn (text, binary) và các lệnh AT thao tác với tin nhắn; tài liệu [2], [3] mô tả về cấu trúc và kiểu mã hoá của tin nhắn (binary); tài liệu [4] mô tả tập lệnh thao tác với ĐTDĐ.

    Khởi đầu

     

    Hình 1: Cáp dữ liệu của điện thoại C55

    Thiết bị được sử dụng ở đây là điện thoại Siemens C55, giao tiếp với máy tính qua cáp nối tiếp RS232, chương trình thử nghiệm là HyperTerminal (có sẵn trong Windows).

    Mọi thông tin về điện thoại (tên sản phẩm, số IMEI, bộ nhớ, sổ điện thoại...) đều được lưu trữ trong máy; các thông tin khác như nội dung tin nhắn, dung lượng SIM được lưu trữ trên SIM. Các thông tin này đều có thể truy xuất được qua tập lệnh AT. Hình 2 cho thấy việc truy xuất thông tin của điện thoại Siemens C55 bằng chương trình HyperTerminal.

    Nhập cuộc

    Như vậy chỉ bằng việc gửi lệnh AT thích hợp đến điện thoại, bạn có thể truy xuất được thông tin bạn mong muốn. Dưới đây trình bày cách viết một chương trình quản lý ĐTDĐ qua cổng COM bằng ngôn ngữ C# trên nền .NET 2.0. Kể từ phiên bản .NET Framework 2.0, Microsoft đã cung cấp thêm lớp SerialPort cho phép người lập trình có thể giao tiếp với các thiết bị ngoại vi qua cổng COM. Việc sử dụng thư viện này khá đơn giản.

    using System.IO.Ports;

    void Form1_Load(object sender, EventArgs e)

    {

    /* Khởi tạo cổng COM1 với */

    /* tốc độ 9600 bps, 0 bit chẵn lẻ, 8 bit dữ liệu, 1 bit dừng */

    SerialPort ComPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

    /* Gửi lệnh AT tới điện thoại */

    ComPort.Write("AT+CGSN\r");

    /* Khởi tạo sự kiện xử lý dữ liệu nhận được từ điện thoại */

    ComPort.DataReceived += new SerialDataReceivedEventHandler(ProcessReceivedData);

    }

     

               Hình 2: Sử dụng HyperTerminal để truy xuất thông tin ĐTDĐ

    /* Hàm xử lý dữ liệu nhận được từ điện thoại */

    void ProcessReceivedData(object sender, SerialDataReceivedEventArgs e)

    {

    String ReceivedData = ComPort.ReadLine();
    ...

    }

    Một điểm quan trọng trong quá trình lập trình với cổng COM là làm sao để đồng bộ hoá được việc nhận và gửi dữ liệu giữa máy tính và thiết bị ngoại vi. Nếu bạn gửi nhiều lệnh AT tới điện thoại cùng một lúc trong khi chưa kịp xử lý thông tin trả về trước đó thì sẽ dẫn tới việc "tràn bộ đệm".

    Để giải quyết vấn đề này, bạn sử dụng lớp AutoResetEvent cho phép tạm dừng một tiến trình cho đến khi nhận được thông báo tiếp tục.

    AutoResetEvent Wait = new AutoResetEvent(false);

                                   Hình 3: Sơ đồ gửi lệnh và xử lý dữ liệu

     

    Dưới đây là sơ đồ xử lý tuần tự từng lệnh AT gửi đến cổng COM: Sau khi gửi lệnh cmd1, chương trình sẽ tạm dừng (bằng hàm WaitOne()) trước khi gửi lệnh cmd2 cho đến khi nhận được thông báo đã xử lý xong dữ liệu (bằng lệnh hàm Set()).

    using System.Threading;

    void Form1_Load(object sender, EventArgs e)

    {

    ...

    AutoResetEvent Wait = new AutoResetEvent(false);

    for (int i = 0; i < 3; i++ )

    {

    /* Gửi lệnh AT tới điện thoại */

    ComPort.Write(cmd[i]);

    /* Chờ cho tới khi xử lý xong dữ liệu */

     

                      Hình 4: Cửa sổ chính chương trình

    Wait.WaitOne();

    }

    }

    void ProcessReceivedData(object sender, SerialDataReceivedEventArgs e)

    {

    ...

    switch(cmd)

    {

    /* Xử lý lệnh cmd1 */

    Case cmd1:
    ...

     

                           Hình 5: Cửa sổ Phonebook

    /* Thiết lập thông báo */

    Wait.Set();

    break;

    /* Xử lý lệnh cmd2 */

    Case cmd2:
    ...

    Wait.Set();

    break;
    ...

    }

    }

                                      Hình 6: Cửa sổ Messages

     

    Các tin nhắn được lưu trong ĐTDĐ dưới 2 định dạng: text và binary (PDU mode). Định dạng binary là mặc định trong tất cả các máy điện thoại, ngoài ra trong một số máy còn hỗ trợ thêm định dạng text. Bạn có thể kiểm tra xem máy của mình hỗ trợ những định dạng nào bằng lệnh AT sau:

    AT+CMGF=?

    Nếu kết quả trả về là (0) thì máy hỗ trợ định dạng binary, (0-1) thì máy hỗ trợ 2 định dạng binary và text.

    Tùy vào việc máy hỗ trợ những định dạng tin nhắn nào mà bạn có thể lập trình để đọc và gửi tin nhắn một cách thích hợp. Đối với máy chỉ hỗ trợ tin nhắn dạng binary, bạn nên tham khảo tài liệu [2] để biết thêm thông tin về cấu trúc của tin nhắn. Đối với tin nhắn dạng text, bạn có thể tham khảo tài liệu [1].

    Kết quả

    Hình 4, 5 và 6 là một số hình ảnh của chương trình quản lý điện thoại được viết bằng ngôn ngữ C# dựa trên các phân tích đã đề cập ở trên.

    Như vậy, bằng tập lệnh AT bạn hoàn toàn có thể làm chủ được chiếc ĐTDĐ xinh xắn của mình như lưu lại số điện thoại, tin nhắn hay thậm chí viết các ứng dụng nhằm hỗ trợ cho việc quản lý và cảnh báo từ xa bằng SMS.

    Bạn có thể tải về tài liệu và chương trình demo tại website www.hitekgroup.net.

     

    MỘT SỐ LỆNH AT ĐƯỢC DÙNG TRONG CHƯƠNG TRÌNH

     
        STT     Câu lệnh     Chức năng    
        1     AT+CGMI     Xác định thông tin về nhà sản xuất    
        2     AT+CGMM     Xác định model của sản phẩm    
        3     AT+CGMR     Xác định phiên bản firmware    
        4     AT+CGSN     Xác định số IMEI của thiết bị    
        5     AT+CBC     Xác định thời lượng pin    
        6     AT+CSQ     Xác định độ mạnh của sóng    
        7     AT+CPBS     Lựa chọn bộ nhớ để lưu Phonebook    
        8     AT+CPBR     Đọc một phần tử trong Phonebook    
        9     AT+CPBF     Tìm kiếm một phần tử trong Phonebook    
        10     AT+CPBW     Ghi một phần tử vào Phonebook    
        11     AT+CMGF     Thiết lập định dạng của tin nhắn    
        12     AT+CPMS     Lựa chọn bộ nhớ để lưu tin nhắn    
        13     AT+CMGL     Liệt kê tin nhắn    
        14     AT+CMGR     Đọc một tin nhắn xác định    
        15     AT+CMGS     Gửi một tin nhắn    
        16     AT+CMGD     Xoá một tin nhắn xác định    
        Để biết chi tiết cấu trúc lệnh, tham khảo tài liệu [1] và [4].    

    Nguyễn Đức Thắng
    Email:
    thangnd@hitekgroup.net

    ID: A0605_142