Chương trình 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

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à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);

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 */


Wait.WaitOne();

}

}

void ProcessReceivedData(object sender, SerialDataReceivedEventArgs e)

{

...

switch(cmd)

{

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

Case cmd1:
...


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

Wait.Set();

break;

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

Case cmd2:
...

Wait.Set();

break;
... 

}

}

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].

Post a Comment

Mới hơn Cũ hơn