Tiết kiệm điện có thể được lựa chọn ở các cấp độ khác nhau như vô hiệu hóa giao
diện AT hoặc kích hoạt lại giao diện AT cho phép người sử dụng có thể truy cập
thường xuyên các lệnh AT.
- GSM IDLE
Khi kích hoạt chế độ này, sau khi đăng ký với mạng GSM, module có thể được
phân trang từ các trạm BTS và sẵn sàng để gửi và nhận tín hiệu.
- GSM TALK
Kết nối giữa hai thuê bao được tiến hành. Công suất tiêu thụ phụ thuộc vào các
thiết lập mạng như DTX on/off, FR/EFR/HR, anten.
- GPRS IDLE
Module đã sẵn sàng để chuyển dữ liệu GPRS, nhưng không có dữ liệu hiện đang
được gửi hoặc nhận được. Công suất tiêu thụ phụ thuộc vào các thiết lập mạng và cấu
hình GPRS.
- Quá trình truyền dữ liệu GPRS được tiến hành. Công suất tiêu thụ phụ thuộc vào
các thiết lập mạng (ví dụ như kiểm soát mức năng lượng), đường xuống đường lên
/ dữ liệu giá và cấu hình GPRS
142 trang |
Chia sẻ: huongthu9 | Lượt xem: 543 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình trên điện thoại di động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
if(it==tf){
92
st.setText(tf.getString());
}
}
}
TextField là một Item mà ItemStateListener là Listener dành riêng cho các Item, vì vậy
khi TextField có bất cứ tương tác gì từ phía người dùng, nó đều được đón nhận từ
ItemStateListener. Kết quả, bạn sẽ thấy là bất cứ điều gì xảy ra với nội dung trong ô văn
bản của TextField sẽ đều được lặp lại ở phần Text của StringItem.
b) List
List không giống các thành phần đã giới thiệu ở trên, List không phải là một Item, do
đó ta chỉ có thể dùng bộ lắng nghe CommandListener với List. Vậy dùng
CommandListener với List như thế nào?, chúng ta sẽ cùng xét ví dụ dưới đây với một List
không tường minh:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.io.IOException;
public class vd extends MIDlet implements CommandListener{
Display dis;
List li;
Command c1;
public vd(){
93
dis=Display.getDisplay(this);
li=new List("list",List.IMPLICIT);
li.append("muc1",null);
li.append("muc2",null);
li.append("muc3",null);
li.append("muc4",null);
li.append("muc5",null);
c1=new Command("exit",Command.EXIT,1);
li.addCommand(c1);
li.setCommandListener(this);
}
public void startApp() {
dis.setCurrent(li);
}
public void pauseApp(){ }
public void destroyApp(boolean b){ }
public void commandAction(Command c,Displayable db){
boolean b[]=new boolean[li.size()];
int i;
94
if(c==c1){
destroyApp(true);
notifyDestroyed();
}
else
if(c==li.SELECT_COMMAND){
switch(li.getSelectedIndex()){
case 0: System.out.println("muc 1");break;
case 1: System.out.println("muc 2");break;
case 2: System.out.println("muc 3");break;
case 3: System.out.println("muc 4");break;
case 4: System.out.println("muc 5");break;
}
}
}
}
Ví dụ này cũng không có gì đặc biệt, chúng ta chỉ đơn giản là đưa ra màn hình output
của netbeans tên của thành phần trong List được lựa chọn. Để làm được việc đó, trong
phương thức cài đè commandAction ta phải kiểm tra xem có phải List đã gây ra sự kiện
không:
95
if(c==li.SELECT_COMMAND)
Vì là Listener của các Command nên ở đây ta phải dùng thuộc tính tĩnh
SELECT_COMMAND với kiểu trả về là một Command của List để kiểm tra thành phần
nào của List được chọn. Sau đó ta chỉ cần hiển thị tên của thành phần đó lên là được:
switch(li.getSelectedIndex()){
case 0: System.out.println("muc 1");break;
case 1: System.out.println("muc 2");break;
case 2: System.out.println("muc 3");break;
case 3: System.out.println("muc 4");break;
case 4: System.out.println("muc 5");break;
}
Trong đó hàm getSelectedIndex() sẽ trả về chỉ số của thành phần List đã được người
dùng chọn lựa.
96
Hình :Ví dụ xử lý sự kiện với List
2.2.5 Kết nối internet với J2ME
A. Khung kết nối chung GCF
CLDC cung cấp cho chúng ta một khung tổng quát để thiết lập kết nối mạng, đó là
GCF. Ý tưởng của nó là: định nghĩa một cách trừu tượng các hoạt động mạng và nhập
xuất file để dùng chung cho một số lượng lớn các thiết bị, giống như một bộ khung nền
vậy. Ở mức độ CLDC, J2me chỉ định nghĩa và tạo kết nối, giao thức thực sự và các
phương thức trao đổi dữ liệu của giao thức đó được trao cho tầng Profiles.
Với GCF, để kết nối chúng ta sử dụng một lớp có khả năng mở mọi loại kết nối
bao gồm: file, http, datagram, Tên của lớp này là Connector. Như vậy nếu sử dụng
97
Connector để mở kết nối, chúng ta chỉ cần gọi một phương thức open cố định dạng như
sau:
Connector.Open(“protocol:address; parameter”)
Cơ chế mà GCF dùng để mở nhiều loại giao tiếp chỉ bằng một phương thức chung
duy nhất này đã chứng minh tính uyển chuyển của GCF. Cơ chế này hoạt động như sau:
1. Trong thời gian thực thi, mỗi khi có yêu cầu mở một giao thức, Connector sẽ
tìm đến lớp tương ứng cài đặt giao thức ấy. Quá trình tìm kiếm này được thực
hiện thông qua phương thức Class.forName(). Ví dụ như để yêu cầu mở kết nối
HTTP trong J2ME, yêu cầu đó sẽ được viết như sau:
Class.forName(“com.sun.midp.io.j2me.http.Protocol”);
2. Khi tìm thấy lớp tương ứng, Class.forName() sẽ trả về một đối tượng có cài đặt
giao diện Connection (trong đó lớp Connector và giao diện Connection đã
được định nghĩa sẵn trong CLDC). Sau khi kết nối thành công, mọi công việc
giao tiếp, trao đổi dữ liệu sẽ đều được thực hiện với đối tượng cài đặt giao diện
Connection này.
Ta cần nhớ rằng: cài đặt thật sự của các giao thức đều nằm ở mức profiles. Trong
MIDP 1.0, HttpConnection hỗ trợ một tập con HTTP phiên bản 1.0. Do đó khi lớp này
mở rộng ContentConnection, nó đã được cung cấp sẵn hơn 20 phương thức chuyên biệt
để giao tiếp thông qua giao thức HTTP.
Ví dụ, để tạo một kết nối HTTP ta sẽ làm như sau:
//Tạo chuỗi kết nối
String url = "";
// HttpConnection là một đối tượng thuộc MIDP
// lớp cài đặt thực sự giao thức HTTP
98
HttpConnection http=null;
//Dùng đối tượng Connector để mở kết nối, phương thức open của đối
//tượng này trả về một đối tượng Connection.
//Ép kiểu đối tượng Connection thành HttpConnection
HttpConnection http = (HttpConnection) Connector.open(url);
B. Các giao thức được hỗ trợ trong GCF
Như ta đã biết, các thiết bị di động nói chung và điện thoại di động nói riêng có
khả năng kết nối rất lớn, bởi vì nó được người sử dụng dùng để trao đổi với thế giới bên
ngoài tại bất cứ nơi đâu và bất cứ lúc nào. Những khả năng kết nối ấy không chỉ là khả
năng thoại hay SMS mà còn là kết nối không dây. Do đó, Để J2me có thể hỗ trợ một số
lượng lớn các thiết bị di động khác nhau với nhiều khả năng kết nối và yêu cầu nhập xuất
khác nhau GCF đã được thiết kế. GCF định nghĩa kỹ thuật kết nối chung nhất có thể cho
mọi loại thiết bị, được dùng chung bởi cả hai loại cấu hình là CDC và CLDC, vì vậy GCF
hỗ trợ rất nhiều loại giao thức, nhiều kiểu kết nối khác nhau, ví dụ: Giao thức HTTP,
FTP, UDP, Datagram, Socket... Nhưng đối với điện thoại di động, đối với hiện trạng
MIDP, giao thức luôn luôn được hỗ trợ là giao thức HTTP, vì vậy trong giáo trình này
chúng ta sẽ học cách tạo kết nối HTTP với J2me.
Để bắt đầu, chúng ta sẽ cùng xem GCF cung cấp cho ta những công cụ gì để tiến
hành kết nối và trao đổi dữ liệu thông qua đối tượng Connection, đối tượng mà chúng ta
đã được làm quen ở mục trên.
99
Hình 2.42:Phân cấp lớp Connection
Sau đây là mô tả các giao diện kết nối được định nghĩa trong CLDC:
· Giao diệnStreamConnectionNotifier: được dùng khi đợi một kết nối phía server
được thiết lập. Phương thức acceptAndOpen() bị chặn cho đến khi client thiết
lập kết nối.
· Giao diện InputConnection dùng để thực hiện một luồng nhập tuần tự dữ liệu
chỉ đọc.
· Giao diện OutputConnection dùng để thực hiện một luồng xuất dữ liệu chỉ viết.
· Giao diện StreamConnection là kết hợp của cả hai giao diện InputConnection
và OutputConnection. Nó dùng cho các thiết bị di động có truyền thông hai
chiều.
· Giao diện ContentConnection kế thừa giao diện StreamConnection và thêm vào
các phương thức getType(), getEncoding(), và getLength(). Nó cung cấp cơ sở
cho giao diện HttpConnection của MIDP.
100
· Giao diện HttpConnection được định nghĩa trong MIDP và kế thừa giao diện
ContentConnection của CLDC. Giao diện này cung cấp các phương thức thiết
lập một kết nối HTTP.
Việc sử dụng những đối tượng này như thế nào, trong trường hợp nào để tiến hành
giao tiếp và trao đổi dữ liệu chúng ta sẽ được học trong các ví dụ cụ thể dưới đây.
C. Hỗ trợ giao thức HTTP trong MIDP
Đối với công nghệ J2ME, cần phải quan tâm đến sự hạn chế của cả kết nối mạng
và tài nguyên của thiết bị, không giống như môi trường thông thường của máy tính cá
nhân với kết nối mạng cố định. Điều này có nghĩa là nhà phát triển nên lường trước được
các khoảng thời gian trễ dài trên băng thông hạn chế. Hơn nữa, bất kỳ trong tình huống
nào cũng không nên cho rằng thiết bị di động luôn luôn có kết nối. Về tài nguyên, ta phải
đối mặt với vấn đề khả năng tính toán hạn chế cùng với khả năng lưu trữ tương đối của
thiết bị. Do đó, trước khi phát triển một ứng dụng phân tán cho client di động, ta cần phải
xem xét kỹ các yếu tố trước khi chọn giao thức, bởi vì quyết định này có thể có ảnh
hưởng lớn đến hiệu suất của ứng dụng.
HTTP là một giao thức liên lạc client/server lý tưởng cho ứng dụng Java di động.
Đối với mỗi đặc tả, thiết bị tương thích MIDP 1.0 phải hỗ trợ HTTP. Các giao thức khác
như TCP hay UDP là tùy chọn. Bởi vì không phải tất cả thiết bị MIDP đều hỗ trợ truyền
thông socket hay datagram, do đó triển khai HTTP trên thiết bị di động cho phép tối ưu
khả năng chuyển đổi giữa các thiết bị từ các nhà sản xuất khác nhau.
Một lợi điểm khác nữa là giao thức HTTP được hưởng truy xuất không lỗi
(trouble-free access) thông qua tường lửa. Bởi vì server và client di động hầu như được
tách biệt bằng firewall, HTTP không cần phải cấu hình thêm. Mặc dù vậy, ta cũng nên
quan tâm đến các rủi ro bảo mật có thể có khi mở kết nối HTTP ra thế giới bên ngoài.
Java cung cấp API lập trình mạng, hỗ trợ giao thức HTTP 1.1. Ta dễ dàng tạo ra các
request GET, POST, và HEAD trong ứng dụng Java.
· Sơ lược về giao thức HTTP
101
HTTP là giao thức truyền siêu văn bản và là giao thức tầng ứng dụng cho web. Nó
hoạt động theo mô hình Client/Server.
Web Server
Request
Response
Hình 3.2:
Mô hình Client - Server
· Client: Yêu cầu, nhận, hiển thị các đối tượng Web.
· Server: Web server gửi các đối tượng trả lời cho các yêu cầu từ phía Client.
HTTP là giao thức phi trạng thái, trong đó Server không lưu lại các yêu cầu của
client. Điều này có nghĩa là: sau mỗi lần yêu cầu được gửi lên Server và Server kết xuất
kết quả trả về cho Client thì kết nối sẽ hoàn toàn bị ngắt, để tiếp tục yêu cầu Server trả lời
cho các yêu cầu khác, Client lại phải tiến hành kết nối lại từ đầu.
HTTP sử dụng giao thức TCP của tầng giao vận. Các bước tiến hành từ khi Client
kết nối tới Server sau đó gửi và nhận kết quả từ Server gửi về như sau:
· Client khởi tạo kết nối TCP với Server
· Server chấp nhận kết nối TCP từ Client
· các thông điệp HTTP được trao đổi giữa browser và web server.
102
· đóng kết nối TCP
Có hai kiểu thông điệp HTTP là yêu cầu (Request) và trả lời (Response). Các
thông điệp được định dạng kiểu mã ASCII.
Cả HTTP và HTTPS đều gửi request và response. Máy Client gửi request, còn
Server sẽ trả về response.
- Client Request
Client request bao gồm 3 phần sau:
· Request method
· Header
· Body
Request method định nghĩa cách mà dữ liệu sẽ được gửi đến Server. Có 3 phương
thức được cung cấp sẵn là GET, POST, HEADER. Khi sử dụng Get, dữ liệu cần request
sẽ nằm trong URL. Với Post dữ liệu gửi từ client sẽ được phân thành các stream riêng
biệt. Trong khi đó, Header sẽ không gửi dữ liệu yêu cầu lên server, thay vào đó header
chỉ request những meta information về server. GET và POST là hai phương thức request
khá giống nhau, tuy nhiên do GET gửi dữ liệu thông qua URL nên sẽ bị giới hạn, còn
POST sử dụng những stream riêng biệt nên sẽ khắc phục được hạn chế này.
Ví dụ về việc mở HTTP Connection thông qua GET
String url = "";
HttpConnection http = null;
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.GET);
103
Những Header field sẽ cho phép ta truyền các tham số từ Client đến Server. Các
header field thường dùng là If-Modified-Since, Accept, and User Agent. Bạn có thể đặt
các field này thông qua phương thức setRequestProperty(). Dưới đây là ví dụ dùng
setRequestProperty(), chỉ có những dữ liệu thay đổi sau ngày 1 tháng 1 năm 2005 mới
được gửi về từ server:
String url = "";
HttpConnection http = null;
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.GET);
// Đặt header field
http.setRequestProperty("If-Modified-Since", "Sat, 1 Jan 2005 12:00:00 GMT");
Body chứa nội dung mà bạn muốn gửi lên server. Ví dụ về sử dụng POST và gửi
dữ liệu từ client thông qua stream:
String url = “”;
tmp = "test data here";
OutputStream ostrm = null;
HttpConnection http = null;
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.POST);
// Gửi dữ liệu
104
ostrm = http.openOutputStream();
byte bytes[] = tmp.getBytes();
for(int i = 0; i < bytes.length; i++) {
os.write(bytes[i]);
}
os.flush();
Sau khi nhận được và xử lý yêu cầu từ phía client, server sẽ đóng gói và gửi về
phía client.
- Server Response
Cũng như client request, server cũng gồm 3 phần sau:
· Status line
· Header
· Body
Status line sẽ thông báo cho client kết quả của request mà client gửi cho server.
HTTP phân loại status line thành các nhóm sau đây:
· 1. xx Thông tin
· 2. xx Thành công
· 3. xx Chuyển hướng
· 4. xx Máy khách Client lỗi
· 5. xx Máy chủ Server lỗi
Status line bao gồm version của HTTP trên server, status code, và đoạn text đại
diện cho status code.
105
Ví dụ: "HTTP/1.1 200 OK" "HTTP/1.1 400 Bad Request" "HTTP/1.1 500 Internal
Server Error" 102
Không giống như header của client, server có thể gửi data thông qua header. Sau
đây là những phương thức dùng để lấy thông tin Header mà server gửi về:
· String getHeaderField(int n), lấy giá trị header field thông qua chỉ số
· String getHeaderField(String name), lấy giá trị header field thông qua tên
· String getHeaderFieldKey(int n), lấy header field key thông qua chỉ số
Server có thể trả về nhiều Header field. Trong trường hợp này, phương thức đầu
tiên sẽ cho lấy header field thông qua index của nó. Còn phương thức thứ hai lấy nội
dung header field dựa vào tên của header field. Còn nếu muốn biết tên (key) của header
field, có thể dùng phương thức thứ 3 ở trên.
Sau đây là ví dụ về 3 phương thức trên, trong trường hợp server gửi về chuỗi
"content-type=text/plain":
Phương thức Giá trị
http.getHeaderField(0) "text-plain"
http.getHeaderField("content-type") "text-plain"
http.getHeaderFieldKey(0) "content-type"
Body: Cũng giống như Client, Server gửi hầu hết những thông tin trong phần body
cho Client. Client dùng input stream để đọc kết quả trả về từ Server:
//con là một đối tượng HttpConnection
InputStream in=con.openInputStream();
106
int length=(int)con.getLength();
byte data[];
if(length!=-1){
data=new byte[length];
in.read(data);
}
else
{
ByteArrayOutputStream br=new ByteArrayOutputStream();
int ch;
while((ch=in.read())!=-1)
br.write(ch);
data=br.toByteArray();
br.close();
}
· Các hàm API HttpConnection
3.3.2.1. Một vài hàm thường dùng trong HttpConnection
Phương thức Mô tả
long getDate() Lấy về ngày tháng từ Header
107
long getExpiration() Lấy về thời gian hết hạn
String getFile() Lấy tên file từ địa chỉ URL
int getHeaderField(int n) Lấy về giá trị trường header bằng chỉ
số
String getHeaderField(String name) Lấy về giá trị trường header bằng tên
long getHeaderFieldDate(String name, long def) Lấy về trường ngày tháng theo tên
int getHeaderFieldInt(String name, int def) Lấy về trường int theo tên
String getHeaderFieldKey(int n) Lấy về khóa của trường sử dụng chỉ
số
String getHost() Lấy về tên host từ địa chỉ URL
long getLastModified() Lấy về giá trị trường last-modified
String getPort() Lấy về cổng từ địa chỉ URL
String getProtocol() Lấy về giao thức từ địa chỉ URL
String getQuery() Lấy về chuỗi truy vấn (chỉ dùng với
GET)
String getRef() Lấy về phần tham chiếu của địa chỉ
URL
String getRequestMethod() Lấy về phương thức hiện thời đang
sử dụng (GET, POST hay HEAD)
String getRequestProperty(String key) Lấy về cấu hình hiện thời của request
108
property
int getResponseCode() Lấy về mã phản hồi (numeric value)
String getResponseMessage() Lấy về thông điệp phản hồi (text
value)
String getURL() Lấy về toàn bộ địa chỉ URL
void setRequestMethod(String method) Đặt phương thức truyền thông (GET,
POST or HEAD)
void setRequestProperty(String key, String value) Đặt thuộc tính yêu cầu (header
information)
3.3.3.2.Ví dụ về kết nối Internet với J2me
Bạn biết rằng khi bạn kết nối đến các địa chỉ website như ""
thì trên trình duyệt bạn sẽ nhận được kết quả trả về là các đối tượng web, như hình ảnh,
nút nhấn, links... Tuy nhiên, một chương trình J2me không phải là trình duyệt, nó không
hiểu được các mã HTML, đối với nó mọi thứ mà Server của website đó gửi về đều là các
byte dữ liệu nhị phân, bạn có thể chuyển đổi nó về các đối tượng như chuỗi ký tự, số,
hình ảnh... để sử dụng, điều này còn phụ thuộc vào việc server gửi về những dữ liệu gì, có
chuyển đổi về các kiểu dữ liệu bạn mong muốn hay không?.
Để làm rõ hơn vấn đề này, chúng ta sẽ cùng nhau đi xây dựng một chương trình
J2me đơn giản, trong đó chương trình sẽ cung cấp cho người dùng một TextField để
người dùng nhập địa chỉ kết nối. Sau khi người dùng nhập song địa chỉ và nhấn nút
"connect" trên màn hình, chương trình sẽ tiến hành kết nối và nhận kết quả trả về từ phía
server, chuyển kết quả nhận được đó thành dạng chuỗi và hiển thị lên màn hình:
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
109
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
public class vd extends MIDlet implements Runnable,
CommandListener{
HttpConnection con;
InputStream in;
OutputStream out;
Thread th;
Form fr;
Display dis;
TextField t1;
StringItem it;
Command c1;
String url;
public vd(){
th=new Thread(this);
dis=Display.getDisplay(this);
fr=new Form("vdform");
t1=new TextField("Địa chỉ URL:","",50,TextField.URL);
it=new StringItem("kết quả kết nối:","");
fr.append(t1);
fr.append(it);
c1=new Command("connect",Command.OK,1);
fr.addCommand(c1);
fr.setCommandListener(this);
}
public void startApp() {
dis.setCurrent(fr);
110
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void connect(){
try{
con=(HttpConnection)Connector.open(url);
con.setRequestMethod(HttpConnection.GET);
con.setRequestProperty("User-Agent","Profile/MIDP-2.0
Configuration/CLDC-1.1");
con.setRequestProperty("Content-Language", "en-US");
con.setRequestProperty("Content-Type", "application/x-www-
form-urlencoded");
}
catch(Exception e){
System.out.println("kết nối lỗi:"+e.getMessage());
}
}
public void in(){
String str="nothing";
try{
in=con.openInputStream();
int length=(int)con.getLength();
byte server[];
if(length!=-1){
server=new byte[length];
in.read(server);
111
str=new String(server);
}
else
{
ByteArrayOutputStream br=new
ByteArrayOutputStream();
int ch;
while((ch=in.read())!=-1)
br.write(ch);
str=new String(br.toByteArray());
br.close();
}
it.setText(str);
}
catch(Exception e){
}
}
public synchronized void run(){
this.connect();
this.in();
}
public void commandAction(Command c, Displayable d){
url=t1.getString();
th=new Thread(this);
th.start();
}
}
112
Hình:
Ví dụ kết nối Internet với J2me
Giả sử như chúng ta kết nối đến địa chỉ "", bạn sẽ ngạc nhiên
khi thấy rằng kết quả trả về không phải là biểu tượng google và các thành phần quen
thuộc khác của trang web này, mà là một chuỗi các ký tự khá rườm rà, đó chính là mã
HTML mà máy chủ của trang web google.com.vn đã trả về cho chương trình của bạn.
Qua ví dụ này chúng ta sẽ học được cách viết một chương trình kết nối Internet với
J2me với ba thao tác cơ bản:
· Tạo kết nối đến server
· Gửi thông tin lên server
113
· Nhận và xử lý thông tin trả lời từ server
Mã để tạo ra một kết nối đến máy chủ Server từ xa cần chỉ rõ địa chỉ URL và một
vài thông tin header quan trọng cho yêu cầu request từ máy khách, như sử dụng kiểu kết
nối nào, dùng ngôn ngữ gì...:
con=(HttpConnection)Connector.open(url);
con.setRequestMethod(HttpConnection.GET);
con.setRequestProperty("User-Agent","Profile/MIDP-2.0
Configuration/CLDC-1.1");
con.setRequestProperty("Content-Language", "en-US");
con.setRequestProperty("Content-Type", "application/x-www-
form-urlencoded");
Sau đó, để nhận thông tin trả về từ máy chủ ta cần phải mở một luồng InputStream
và đọc dữ liệu từ máy chủ Server trả về vào trong một mảng byte. Trong ví dụ này, chúng
ta chưa có nhu cầu gửi hoặc nhận lệnh HTTP:
//Tạo InputStream connection
in=con.openInputStream();
int length=(int)con.getLength();
byte server[];
if(length!=-1){
server=new byte[length];
in.read(server);
str=new String(server);
}
else
{
ByteArrayOutputStream br=new
ByteArrayOutputStream();
int ch;
114
while((ch=in.read())!=-1)
br.write(ch);
str=new String(br.toByteArray());
br.close();
}
Khi ContentConnection và InputStream đã được thiết lập, chúng ta thử tham chiếu
đến chiều dài length của dữ liệu được gửi về từ Server. Nếu length có thể xác định, chúng
ta đọc kết quả vào trong mảng server chỉ bằng một lệnh:
in.read(server);
Nếu length không có sẵn, chúng ta cần phải đọc từng ký tự một. Java cung cấp một
công cụ tiện lợi và hiệu quả giúp bạn điều khiển công việc này. Sử dụng
ByteArrayOutputStream, các byte được đọc vào trong một mảng byte nội, Java sẽ điều
khiển và tự thay đổi kích thước của mảng cho phù hợp. Khi Java đọc xong, chúng ta đơn
giản chuyển nội dung stream vào trong mảng byte của chương trình:
ByteArrayOutputStream br=new ByteArrayOutputStream();
int ch;
while((ch=in.read())!=-1)
br.write(ch);
str=new String(br.toByteArray());
br.close();
Cuối cùng chúng ta chuyển đổi kết quả trả về thành dạng chuỗi và in ra màn hình
điện thoại nhờ đối tượng ImageItem:
str=new String(server);//nếu tham chiếu được length
str=new String(br.toByteArray());//nếu không tham chiếu được length
it.setText(str);//hiển thị kết quả lên màn hình điện thoại
Dưới đây là một ví dụ tương tự, tuy nhiên, thay vì kết nối đến một địa chỉ trang
web nào đó và nhận về mã HTML, chúng ta sẽ dùng chương trình J2me kết nối đến một
địa chỉ cho phép download một ảnh định dạng PNG cỡ nhỏ (nhỏ hơn 48*48 pixel, lớn
115
hơn có thể vượt quá khả năng hiển thị của thiết bị). Sau khi download được ảnh về ta sẽ
hiển thị ảnh đó lên màn hình điện thoại, dưới đây là mã nguồn:
Hình :
Ví dụ kết nối Intenet với J2me
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
116
public class vd extends MIDlet implements Runnable,
CommandListener{
HttpConnection con;
InputStream in;
OutputStream out;
Thread th;
Form fr;
Display dis;
TextField t1;
StringItem it;
Command c1;
String url;
Image im;
public vd(){
th=new Thread(this);
dis=Display.getDisplay(this);
fr=new Form("vdform");
t1=new TextField("Địa chỉ URL:","",50,TextField.URL);
t1.setString("");
it=new StringItem("kết quả kết nối:","");
fr.append(t1);
fr.append(it);
c1=new Command("connect",Command.OK,1);
fr.addCommand(c1);
fr.setCommandListener(this);
}
public void startApp() {
117
dis.setCurrent(fr);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void connect(){
try{
con=(HttpConnection)Connector.open(url);
con.setRequestMethod(HttpConnection.GET);
con.setRequestProperty("User-Agent","Profile/MIDP-2.0
Configuration/CLDC-1.1");
con.setRequestProperty("Content-Language", "en-US");
con.setRequestProperty("Content-Type", "application/x-
www-
form-urlencoded");
}
catch(Exception e){
System.out.println("kết nối lỗi:"+e.getMessage());
}
}
public void in(){
String str="nothing";
im=null;
try{
in=con.openInputStream();
int length=(int)con.getLength();
byte server[];
118
if(length!=-1){
server=new byte[length];
in.read(server);
}
else
{
ByteArrayOutputStream br=new
ByteArrayOutputStream();
int ch;
while((ch=in.read())!=-1)
br.write(ch);
server=br.toByteArray();
br.close();
}
im=Image.createImage(server,0,server.length);
ImageItem ii=new
ImageItem(null,im,ImageItem.LAYOUT_DEFAULT,null);
if(fr.size()!=0)
fr.set(0, ii);
else
fr.append(ii);
}
catch(Exception e){
}
}
public synchronized void run(){
this.connect();
this.in();
119
}
public void commandAction(Command c, Displayable d){
url=t1.getString();
th=new Thread(this);
th.start();
}
}
Đoạn mã này không có nhiều khác biệt với đoạn mã trên, Thay vì chuyển đổi kết
xuất từ server trả về thành dạng chuỗi, ta lại chuyển đổi kết quả trả về từ server thành
dạng ảnh và hiển thị lên màn hình:
im=Image.createImage(server,0,server.length);
ImageItem ii=new
ImageItem(null,im,ImageItem.LAYOUT_DEFAULT,null);
if(fr.size()!=0)
fr.set(0, ii);
else
fr.append(ii);
Trong đoạn mã trên đối tượng "server" là đối tượng mảng byte dùng để chứa kết
quả trả về từ server. Bạn chú ý, có thể links download ảnh này sẽ không còn tồn tại sau
một khoảng thời gian nhất định nào đó, bạn nên thay link này bằng một link khác, chú ý,
kiểu ảnh được J2me hỗ trợ là PNG.
120
CHƯƠNG 4: ĐIỀU KHIỂN KẾT NỐI GIỮA ĐIỆN THOẠI VÀ MẠNG VIỄN
THÔNG VỚI TẬP LỆNH AT
4.1. Giới thiệu chung về tập lệnh AT (GSM 07.07)
Đầu những năm 1980, công ty Hayes đã bắt đầu sản xuất loại thiết bị Smartmodem
với tốc độ 1200. Sau đó không lâu công ty này đã nhanh chóng phát hành ra thị trường
loại Smartmodem với tốc độ 2400 baud/bps trong khi loại Smartmodem 1200 lại đang
được thịnh hành trên thị trường. Khi đó Hayes không có thời gian để thay đổi lại thiết kế
giữ hai loại Smartmodem 1200 và 2400. Chính vì thế mà các nhà thiết kế của Hayes đã
tạo ra một chuẩn modem tồn tại cho đến ngày nay.
Cả hại loại Smartmodem 1200 và 2400 đều được coi là các loại modem thông minh
thời đó, nó cho phép con người có thể gọi tới các số điện thoại khác từ điện thoại mà nó
được gắn trên đó, khi người nghe từ modem bên kia có thể nhấn nút để chấp nhận hoặc từ
chối cuộc gọi. Quy trình quay số chung giữa các modem được sử dụng như trong mạng
điện thoại công cộng POTS/PSTN (Plain Old Telephone Service/Public Switched
Telephone Network) được giới thiệu vào những năm 1980.
Các Smartmodem 1200 và 2400 đã không nhận biết được tín hiệu bận rộn hoặc phát
hiện ra âm thanh quay số cũng như hàng chục các tính năng khác hiện nay dùng trong
modem sản xuất cuối những năm 1980.
Những gì đã làm cho Smartmodem 1200 và 2400 là duy nhất tại thời điểm đó là một
nhà sản xuất cung cấp hai mô hình tốc độ khác nhau của modem POTS/PSTN mà chúng
chấp nhận các lệnh lập trình, được gọi là tập lệnh AT (ATtention). Tuy nhiên không phải
bất kỳ phần mềm nào dùng trên các Smartmodem 1200 cũng sẽ làm việc trên
Smartmodem 2400.
Một số nhà sản xuất modem đột nhiên nhận ra lợi thế của mô hình modem mới hỗ trợ
các lệnh tương tự như các mô hình trước đây. Một số nhà sản xuất thường xuyên phát
triển các lệnh hoàn toàn khác nhau phù hợp với thiết kế modem mà họ sản xuất ra.
Hãng Hayes kịp thời đã kiện các công ty này bằng cách sử dụng từ "Hayes" trong các
tài liệu sản phẩm và bao bì của họ. Từ đó các nhà sản xuất khác bắt đầu gọi modem của
121
họ là sử dụng tập lệnh AT tương thích và tiếp tục để bắt chước các thiết lập lệnh của
Hayes. Tới năm 1986, hầu hết các modem đều hỗ trợ tập lệnh AT.
Ngày nay hầu hết các modem chuyên dụng và các điện thoại di động hỗ trợ công nghệ
GSM đều sử dụng tập lệnh AT cơ bản hoặc tập lệnh AT mở rộng để truyền thông trong
mạng.
4.1. Các lệnh AT kiểm tra cấu hình
Các lệnh AT để kiểm tra cấu hình bao gồm các lệnh để kiểm tra cấu hình hệ thống,
cấu hình cliens. Cung cấp các thông tin nhận thực từ cliens đến server..
4.1.1. AT+CGMI nhận dạng nhà sản xuất
Ý nghĩa
Cho phép kiểm tra nhà sản xuất modem GSM đang được sử dụng.
Cú pháp
AT+ CGMI
Giải thích
- AT là một từ khóa bắt đầu của bất cứ câu lệnh nào thuộc tập lệnh AT ( AT
command).
- CGMI là yêu cần xác thực nhà sản xuất mà cliens gửi đến server.
- Sau khi nhận được yêu cầu, server sẽ kiểm tra nếu đúng thì nó sẽ trả về nhà sản
xuất của mình hay là chuẩn làm việc của nó theo nhà sản xuất nào.
Thường thì đối với chuẩn GSM 07.07 kết quả trả về đối với câu lênh CGMI sẽ là
một chuỗi là tên nhà sản xuất như :” Ubinetics Ltd”.
2. AT+ CGMM kiểm tra model hệ thống
Ý nghĩa
Cho phép người lập trình kiểm tra model làm việc của modem GSM.
Cú pháp
AT+CGMM
Giải thích
122
Khi modem nhận được một cú pháp lệnh đúng như thế này nó sẽ gửi trả về một chuỗi
ký tự là tên của các model.
Có một số model thông dụng như:GDC200,GC201,GA100.
3. AT+CGMR xác thực nhà sản xuất.
Ý nghĩa
Xác thực thông tin chính xác về nhà sản xuất. Kết quả nhận được la chi tiết hơn so
với AT+CGMI.
Cú pháp
AT+ CGMR
Giải thích
Modem sẽ trả về một cách chính xác nhất nhà sản xuất của mình. Việc xác nhận lại
đôi khi vẫn thường hay sử dụng khi mà kết quả trả về từ “AT CGMI” chưa được rõ dàng
và chính xác.
Kết quả trả về với câu lệnh này sẽ là một “revision” chính xác về nhà sản xuất của
modem ở dạng chuỗi ký tự.
4. AT+CGSN kiểm tra serial modem
Ý nghĩa
Cho phép lấy được số serial của từng modem giúp ích cho việc nhận thực modem.
Cú pháp
AT+CGSN
Giải thích
Sau khi lệnh thực hiện thành công modem sẽ trả về chính xác số serial của mình dưới
dạng chuỗi ký tự. Số serial của modem trả về thường có dạng :
02-GDC200-xxxxxxx
02-GC201-xxxxxxx
02-GA100-xxxxxxx
Trong đó xxx sẽ là serial của modem, phi trước sẽ là model mà nó sử dụng.
5. AT+CSCS thiết lập ký tự thiết bị đầu cuối.
123
Ý nghĩa
Lựa chọn bộ ký tự được hỗ trợ bởi modem, chuyển dổi ký tự giữa modem và thiết bị
đầu cuối.
Có một số kiểu, chuẩn ký tự được sử dụng như : GSM alphabet( GSM), international
reference alphabet ( IRA), hay kiểu HEX.
Cú pháp
- Kiểm tra danh sách bộ ký tự được modem hỗ trợ
AT+CSCS=?
Nếu modem nhận được câu lênh đúng thì nó sẽ trả về danh sách các kiểu ký tự mà nó
hỗ trợ theo dạng “ CSCS: “
- Kiểm tra bộ ký tự đang được sử dụng
AT+CSCS?
Kết quả của câu lệnh này là modem sẽ trả về kiểu ký tự mà modem đang sử dụng có
dạng “ CSCS: “
- Thiết lập bộ ký tự sử dụng cho modem
AT CSCS=
có thể là “GSM”,”IRA”,”HEX”.
6. AT+CIMI Nhận dạng thuê bao di động
Cú pháp
AT+CIMI
Giải thích
Kết quả trả về của lệnh này sẽ là số nhận dạng thuê bao di động quốc tế của modem
mà chúng ta sử dụng(imsi). Kết quả này chỉ nhận được khi nó tồn tại trong một mạng cụ
thể, hay cũng có thể hiểu là thuê bao đang ở tình trạng online.
7. AT+WS46 Lựa chọn mạng
Ý nghĩa
Cho phép lựa chọn một mạng di động để modem hoạt động.
Cú pháp
124
- Kiểm tra mạng di động tồn tại
AT+WS46=?
- Lựa chọn mạng cho modem hoạt động
AT+WS46=
Giải thích
Trên thực tế mạng di động của chúng ta bao gồm các nhà cung cấp khác nhau, mỗi
thuê bao sử dụng một nhà cung cấp mạng của mình. Vì vậy mà trước khi kết nối thuê
bao di động luôn cần phải tìm được sự hiện diện của các nhà cung cấp dịch vụ qua đó
lựa chọn nhà cung cấp dịch vụ cho mình. Và thuê bao cần phải lựa chọng kiểu mạng tế
bào cho mình.
Trước hết để tìm kiếm, kiểm tra xem tại khu vực của thuê bao có những kiểu mạng tế
bào nào ta sử dụng lệnh :
“ AT+WS46=? “
Câu lệnh này sẽ trả về danh sách các mạng tế bào dưới dạng số tự nhiên. Đối với
mạng GSM thì kết quả sẽ là số 12.
Tương tự để lựa chọn mạng ta sử dụng lệnh:
“AT+WS46=”
Với “n” là số hiệu của mạng. GSM=12.
4.2 Các lệnh AT điều khiển cuộc gọi
4.2.1. ATD quay số thiết lập cuộc gọi
Ý nghĩa
Cho phép quay số thiết lập cuộc gọi đến một thuê bao khác với tín hiệu điều khiển
tùy chọn.
Cú pháp
ATD[][;]
Giải thích
Với là số thuê bao đích cần gọi tới,
là các ký tự điều khiển như :
125
- “,” dừng quay số.
- “T” : bỏ qua chuông quay số
- “P” : bỏ qua xung quay số.
- “!” : đăng ký gọi lại.
- “W” : chờ chuông quay số.
- “@” : chờ trả lời.
- “I
” : hạn chế .
Các cuộc gọi nếu ký tự được gửi sau nhưng trước khi nhận được bản tin kết nối
“OK” thì cuộc gọi sẽ bị hủy.
Khi thực hiện lệnh “ ATD[][;] “ ta có thể nhận được một số mã trả lời dưới
dạng số từ 0 đến 8. Trong đó
- 0 (OK) : lệnh thực hiện thành công, không có lỗi.
- 1 (CONNECT) : kết nối được thiết lập (ATX=0).
- 2 (RING) : chuông báo
- 3 (NO CARRIER) : cuộc gọi thất bại hoặc mất kết nối.
- 4 (ERROR) : lệnh không hợp lệ hoặc quá dài.
- 7 (BUSY) : thuê bao gọi tới đang bận không thể tiếp nhận cuộc gọi.
- 8 ( NO ANSWER ) : cuộc gọi thất bại do thời gian chờ kết nối quá lâu
4.2.2. ATD> quay số từ danh bạ điện thoại
Ý nghĩa
Cho phép quay số thiết lập cuộc gọi với đích đến là một số đích được lưu trong bộ
nhớ danh bạ điện thoại.
Cú pháp
ATD>[l][;]
Giải thích
Câu lệnh : “ ATD>[l][;] “ sẽ thực hiện việc quay số thiết lập một cuộc gọi
đến một thuê bao mà số địa chỉ được lấy trong danh bạ điện thoại đã được ghi rõ . Nếu
126
ký tự gửi sau trước khi nhận được thông báo kết nối hoặc bản tin “OK” thì cuộc gọi
sẽ bị hủy.
Với câu lệnh trên tùy chọn mem có thể là các số khẩn cấp hay là các số được lưu
trong dạnh bạ trên SIM. Nó có thể nhận các giá trị là “EN”(Enmergency number) hoặc
“AD” (SIM phone book).
Tùy chọn chính là vị trí bộ nhớ của số điện thoại dùng để quay số
4.2.3. Quay số hiện thời trên danh bạ điện thoại
Để quay số thiết lập cuộc gọi đến một số điện thoại hiện hành trên danh bạ điện thoại
ta sử dụng cú pháp lệnh:
“ ATD>[l][;] “
Tương tự như việc quay số được lựa chọng từ điện thoại ta chỉ cần chỉ ra địa chỉ hay
vị trí của số điện thoại cần gọi đến trong danh bạ điện thoại tương ứng với tùy trọn
trong câu lệnh trên để tiến hành quay số đến một thuê bao đã được lưu trữ trong danh bạ
điện thoại.
4.2.4. ATD+CHUP Ngắt cuộc gọi
Ý nghĩa
Cho phép kết thúc cuộc gọi đang được kích hoạt.
Cú pháp
ATD+CHUP
Giải thích
Khi thực hiện lệnh thành công, tất cả các cuộc gọi đang hoạt động sẽ bị treo đồng
thời tiết hành kết thúc cuộc gọi một cách luân phiên.
4.2.5. AT+CBST Lựa chọn kiểu dịch vụ
Ý nghĩa
Cho phép thiết lập các thông số dùng cho cuộc gọi tới, các giá trị này cũng được
dùng để chấm dứt một cuộc gọi dữ liệu.
Cú pháp
- Kiểm tra danh sách được hỗ trợ
127
AT+CBST=?
- Kiểm tra trạng thái hiện tại
AT+CBST
- Thiết lập các tham số dùng cho dịch vụ
AT+CBST=:[[,[,]]]>
Giải thích
“AT+CBST=?”
Khi thực hiện lệnh thành công sẽ trả vể danh sách các cấu hình được hỗ trợ dưới
dạng xâu như sau : “ CBST: “
Trong đó speed có thể là 7 (9600bps_V32), 12(9600bps_V34), 14(14400bps_V34),
71(9600bps_V110), 75(14400bps_V110).
Name = 0, kết nối dữ liệu không đồng bộ.
có thể nhận giá trị 0 hoặc 1 để thiết lập cho quá trình sửa lỗi diễn ra transparent
hay non-transparent.
Đối với kết nối gửi dữ liệu FAX chỉ được hỗ trợ ở tốc độ 9600 bps.
4.2.6. AT+CRLP Giao thức liên kết vô tuyến
Ý nghĩa
Cho phép kiểm tra, thiết lập các tham số dùng cho cuộc gọi dữ liệu không trong suốt.
Cú pháp
- Kiểm tra danh sách các tham số được hỗ trợ
AT+CRLP=?
- Kiểm tra trạng thái hiện tại hay cấu hình các tham số
AT+CRLP?
AT+CRLP=
4.2.7. AT+CR Điều khiển phản hồi dịch vụ
Ý nghĩa
Cho phép tùy chọn nhận hoặc không nhận phản hồi dịch vụ. Nếu ở trạng thái kích
hoạt modem sẽ truyền các phản hồi dịch vụ về thiết bị đầu cuối dữ liệu khi đã thiết lập
128
tốc độ truyền, cấu hình truyền trước khi các mã kết nối cuối cùng được trả về.
Cú pháp
AT+CR=?
Giải thích
Giống như các lệnh điều khiển cuộc gọi khác, việc điều khiển phản hồi dịch vụ cũng
cho phép ta kiểm tra danh sách hỗ trợ, kiểm tra trạng thái hiện tại, thiết lập chế độ.
“AT+CR=?” nếu thực hiện thành công lệnh này sẽ trả về các chế độ được hỗ trợ dưới
dạng xâu theo dạng “CR: ”
Thường thì có 2 mode chính là : 0 disnable reporting
1 enable reporting
Để kiểm tra mode hiện tại ta chỉ việc sử dụng cú pháp lệnh : “AT+CR?”
Tương tự để thiết lập mode ta chỉ việc gửi đến modem lệnh : “AT+CR=”
4.2.8. AT+CEER Báo cáo lỗi mở rộng
Ý nghĩa
Lệnh này trả về thông tin dưới dạng text, nó là các thông tin mở rộng chi tiết hơn về
các lỗi gây ra việc thất bại trong một cuộc gọi hay là các lỗi làm thay đổi cuộc gọi.
Cú pháp
AT+CEER
Giải thích
Khi lệnh được thực hiện thành công bản tin trả về sẽ có dạng: “ CEER:”.
Giả sử khi quay số gọi tới một thuê bao khác mà thuê bao đó không thể tiếp nhận cuộc
gọi vì đang có một cuộc gọi khác thì bản tin trả về của lệnh này sẽ là:
“ CEER: user busy “ , “user busy” chính là .
4.2.9. AT+CRC Mã kết quả
Ý nghĩa
Lệnh dùng để điều khiển cho người sử dụng báo cáo các định dạng mở rộng thông qua
việc thiết lập cuộc gọi của một thiết bị di động.
Cú pháp
129
AT+CRC=
ở đây có thể là 0 hoặc 1, tương ứng với việc cho phép hoặc không.
4.3 Các lệnh liên quan đến dịch vụ mạng
4.3.1. AT+CNUM,subscriber number
Ý nghĩa
Khi thực hiện lệnh này sẽ trả về MSIDNS liên quan đến thuê bao. Nếu thuê bao
có các MSIDNS khác nhau cho các dịch vụ khác nhau thì mỗi MSIDNS sẽ được trẻ về
trên một dòng.
Cú pháp
AT+CNUM
Giải thích
Nếu thực hiện thành công sẽ nhận được kết quả trả về có dạng:
”CNUM: [],,,,[,]
Trong đó alpha: là tùy trọn về kiểu chuỗi số lien quan đến số thuê bao
Number: chuỗi số thuê bao điện thoại được dịnh dạng theo kiểu của tùy
trọng .
Type: kiểu địa chỉ ở dạng số nguyên.
Speed: thông tin về tôc độ
Service: thông tin về dịch vụ ,chế độ hoạt động đồng bộ hay không đồng
bộ.
4.3.2. AT+CREG Đăng ký mạng
Ý nghĩa
Hiển thị trạng thái đăng ký mạng.
Cú pháp
- Kiểm tra các chế độ được hỗ trợ
AT+CREG=?
130
- Kiểm tra chế độ hiện tại
AT+CREG?
- Thiết lập chế độ hiện tại
AT+CREG=
3.3.3. AT+COPS Lựa chọn nhà cung cấp
Ý nghĩa
Cho phép đăng ký, hiển thị các nhà cung cấp mạng hợp lệ.
Cú pháp
- Kiểm tra danh sách được hỗ trợ
AT+COPS=?
- Kiểm tra trạng thái hiện tại
AT+COPS?
- Thiết lập, đăng ký nhà cung cấp mạng.
AT+COPS=[[,[,]]]
Giải thích
Tham số “mode” là kiểu đăng ký mạng mà modem sẽ sử dụng. Nó có thể là tự
động hoặc thủ công tùy thuộc vào thiết lập của người quản trị.
Tham số “format” là định dạng ký tự của “oper”
“oper” thể hiện nhận dạng của nhà cung cấp với định dạng được thiết lập bởi
“format”
4.3.4. AT+CLCK Khóa hoặc mở khóa
Ý nghĩa
Cho phép khóa hoặc mở mạng cho modem, mật khẩu là cần thiết cho hành động
này.
Cú pháp
AT+CLCK=,[,]
Giải thích
cho phép lựa chọn hành động điều khiển.
131
chế độ khóa/mở khóa đối với
mật khẩu cần thiết dùng cho thao tác thay đổi.
4.4. Các lệnh AT điều khiển tin nhắn SMS
4.4.1 AT+CMGF Định dạng SMS
Ý nghĩa
Lệnh này cho phép thiết lập định dạng SMS mà modem sử dụng, để thiết lập một
định dạng SMS cho modem thì định dạng đó cần được hỗ trợ bởi modem.
Cú pháp
- Kiểm tra các định dạng SMS được hỗ trợ
AT+CMGF=?
- Kiểm tra định dạng SMS mà modem đang sử dụng
AT+CMGF?
- Thiết lập định dạng SMS cho modem
AT+CMGF=
Giải thích
ở đây chính là chế độ định dạng SMS mà modem sẽ sử dụng. Có 2
cơ bản là 0 (PDU) và 1(Text).
Trước khi có một thao tác điều khiển liên quan đến SMS ta cần cấu hình chế độ
SMS cho modem trước khi điều khiển.
4.4.2. AT+CMGW Ghi SMS vào bộ nhớ sim card.
Ý nghĩa
Cho phép ghi một tin nhắn văn bản vào bộ nhớ lưu trữ của sim card. Nếu thành công
sẽ trả về bị trí lưu tin nhắn.
Cú pháp
AT+CMGW=
Giải thích
Với là số thuê bao cần gửi đến, khi thực hiện lệnh thành công modem
132
sẽ trả về ký tự “>”. Sau đó ta có thể nhập nôi dung tin nhắn cần lưu trữ và kết thúc bằng
“Ctrl+z”.
4.4.3. AT+CMSS Gửi tin nhắn từ bộ nhớ Sim card
Ý nghĩa
Cho phép điều khiển modem GSM gửi một tin nhắn được lưu trong bộ nhớ Sim
card.
Cú pháp
AT+CMSS=,
Giải thích
Với AT+CMSS, chính là chỉ số của tin nhắn được lưu trong bộ nhớ Sim
card, là số thuê bao cần gửi tin nhắn, mã kết thúc câu lệnh.
Ví dụ để gửi tin nhắn đến số “0123456789” đã được lưu trong bộ nhớ tại vị trí số
2 ta thực hiện cú pháp lệnh:
AT+CMSS=2,”0123456789”
4.4.4. AT+CMGD Xóa tin nhắn trong bộ nhớ lưu trữ
Ý nghĩa
Xóa một tin nhắn đang lưu trữ trong bộ nhớ điện thoại. Vị trí bộ nhớ mà tin nhắn
lưu trữ là cần thiết cho câu lệnh.
Cú pháp
AT+CMGD=
Trong đó chính là chỉ số, vị trí lưu trữ của tin nhắn.
Ví dụ để xóa tin nhắn tại vị trí lưu trữ số 3 ta sử dụng cú pháp lệnh:
AT+CMGD=3
4.4.5. AT+CMGL Liệt kê tin nhắn
Ý nghĩa
Cho phép liệt kê toàn bộ các tin nhắn SMS chưa đọc trên bộ nhớ.
Cú pháp
AT+CMGL
133
Lưu ý
Ta có thể sử dụng tùy chọn “ALL” để liệt kê toàn bộ tin nhắn có trong bộ nhớ
hiện tại. ví dụ: AT+CMGL=”ALL”
4.5. Giới thiệu module GSM MC35i
4.5.1 Giới thiệu
Module MC35i là một modem GSM hoạt động trên nền mạng 900MHz và 1800MHz
do Sieamen sản xuất. Nó hỗ trợ GPRS và các tinh năng cơ bản của một điện thoại di
động như nghe, gọi và nhắn tin.
GSM Modem loại Siemens MC35i có kích thước nhỏ - gọn, lắp đặt đơn giản nhanh
chóng, tích hợp nhiều tính năng và khả năng hoạt động lâu dài trong điều kiện bình
thường là những điểm nổi bật của Modem MC35i. Điều này mang lại những tiện ích đối
với các thiết bị điện thoại di động, máy tính xách tay, thiết bị đa phương tiện... và đặc
biệt là khả năng tích hợp dễ dàng với PDA, các thiết bị di động thu nhỏ...
Module MC35i đáp ứng được giải pháp GSM/GPRS cho hiệu suất cao với: Vi xử
lý băng tần cơ sở, điện áp cung cấp ASIC, tần số vô tuyến điện bao gồm một bộ khuếch
đại công suất và giao diện anten. Các phần mềm MC35i được lưu trữ trong một thiết bị
nhớ flash. Bộ nhớ bổ sung SRAM cho phép MC35i đáp ứng yêu cầu kết nối GPRS.
Các giao diện vật lý cho các ứng dụng di động được thực hiện thông qua một kết
nối ZIF. ZIF gồm có 40 chân, cho phép kiểm soát các khối, truyền dữ liệu và tín hiệu âm
thanh, các đường điện áp cung cấp. Ngoài ra, module GSM MC35i cung cấp giao diện
nối tiếp tích hợp với giao diện Man-Machine (MMI), điều khiển bởi tập lệnh AT và hỗ
trợ tốc độ truyền lên tới 230 kbps.
134
Module gsm mc35i
4.5.2. Cấu trúc, chức năng Module GSM MC35i
4.5.2.1 Sơ đồ khối MC35i
135
Sơ đồ khối module gsm mc35i
Dựa vào sơ đồ khối ta có thể thấy module gsm mc35i đáp ứng được các tính năng có
bản của một điện thoại di động như nghe, gọi, nhắn tin.
Khối RF Power Amplifier và RF secsion giúp module mc35i khuếch đại tín hiệu vô
tuyến thu được, lựa chon giải tần hoạt động với Baseband Controller. Bộ nhớ SRAM hay
bộ nhớ ngoài có thể dùng để lưu trữ dữ liệu, chương trình điều khiển, thông tin mạng,
thông tin thuê bao....
4.5.2.2. Thành phần, chức năng Module GSM MC35i
Dựa vào sơ đồ khối ta có thể thấy module GSM MC35i gồm các khối chính sau:
- Khối RF
136
- Khối băng tần cơ sở
- Nguồn
- Bộ nhớ
- Khối giao tiếp(ZIF,SIM...)
* Khối RF của module GSM MC35i:
Khối này có chức năng thu phát tín hiệu RF trên dải tần của GSM 900MHz/1800MHz.
· Khối khuếch đại công suất RF:
IC công suất phát được điều khiển thay đổi công suất phát thông qua lệnh APC
(Auto Power Control) ra từ IC cao trung tần. Mạch APC có khả năng tự động điều
chỉnh công suất phát.
· Khối kết nối anten:
Khối này có chức năng bức xạ hoặc thu nhận sóng điện từ. Phục vụ hoạt động của
module GSM MC35i.
* Khối băng tần cơ sở GSM:
· Bộ điều khiển hoạt động GSM ở tần số 26MHz:
Bao gồm CPU (Center Processor Unit – Đơn vị xử lý trung tâm). CPU thực hiện
các chức năng như: Điều khiển tắt mở nguồn chính; chuyển nguồn giữa chế độ thu và
phát; Điều khiển đồng bộ sự hoạt động giữa các IC; Điều khiển khối thu phát sóng;
Quản lý các chương trình trong bộ nhớ; Điều khiển truy cập SIM Card...
· Nguồn cung cấp:
Khối nguồn có chức năng chính là: Điều khiển tắt mở nguồn; Chia nguồn thành
nhiều mức nguồn khác nhau để phục vụ cho các khối của module; Ổn định nguồn cung
cấp cho các tải tiêu thụ...
· Bộ nhớ:
CPU hoạt động theo các mã lệnh được lập trình sẵn nạp vào trong bộ nhớ. CPU sẽ
không hoạt động được nếu không có phần mềm nạp trong bộ nhớ. Vi xử lý khi hoạt
động sẽ truy cập và lấy ra các phần mềm điều khiển trong IC nhớ FLASH, thực hiện
137
giải mã tạo ra các lệnh điều khiển để điều khiển các bộ phận khác của module hoạt
động.
· SRAM: (Syncho Radom Acccess Memory):
Là bộ nhớ trung gian lưu trữ tạm các dữ liệu trong quá trình xử lý của CPU. Nếu
bộ nhớ SRAM hỏng thì CPU sẽ không hoạt động được, khi ta tắt nguồn thì dữ liệu
trong SRAM sẽ mất.
· Giao tiếp ứng dụng (ZIF connector)
MC35i được trang bị một kết nối ZIF gồm 40 chân cho việc kết nối với những ứng
dụng di động. Các chân chức năng của ZIF gồm:
· Nguồn cung cấp
· Giao tiếp RS232
· Hai giao diện âm thanh
· Giao tiếp SIM
Chân In / Out Ký hiệu Mô tả chức năng
1-5 I BATT+ Nguồn cung cấp
6-10 Ground GND Nối đất
11-12 I POWER Sạc nguồn
13 O VDD Nguồn cung cấp ngoài
14 I BATT_TEMP Nhiệt độ pin
15 I /IGT Cháy
16 O RING0_TXD1 Kết nối RS232
17 O /RING0_TXD1 Kết nối RS232
18 O /RxD0 Kết nối RS232
19 I /TxD0 Kết nối RS232
20 O /CTS0 Kết nối RS232
138
21 I /RTS0 Kết nối RS232
22 I /DTR0 Kết nối RS232
23 O /DCD0 Kết nối RS232
24 I CCIN SIM
25 O CCRST SIM
26 IO CCIO SIM
27 O CCCLK SIM
28 O CCVCC SIM
29 Ground CCGND SIM
30 I/O VDDLP Sao lưu RTC
31 I /EMERGOFF Ngắt nguồn
32 O SYNC Đồng bộ
33 O EPP2 Audio
34 O EPN2 Audio
35 O EPP1 Audio
36 O EPN1 Audio
37 I MICP1 Audio
38 I MICN1 Audio
39 I MICP2 Audio
40 I MICN2 Audio
Bảng Chức năng chân của ZIF
Đối với giao tiếp SIM: Bộ vi xử lý băng tần cơ sở có một giao diện SIM tích hợp
tương thích với tiêu chuẩn ISO 7816. Đây là đường nối vào các giao diện chủ (ZIF nối)
để được kết nối với một thẻ SIM bên ngoài. Sáu chốt kết nối ZIF được dành riêng cho
giao diện SIM. Các pin CCIN có nhiệm vụ phát hiện xem có sim trong khay hay không.
139
Tín hiệu Mô tả chức năng
CCGND Nối đất
CCCLK
Thẻ chip đồng hồ, với tốc độ xung nhịp khác nhau có thể được đặt
trong bộ vi xử lý băng tần cơ sở.
CCVCC Cung cấp điện áp từ PSU-ASIC
CCIO Dòng dữ liệu đầu vào và đầu ra.
CCRST
Thẻ chip được thiết lập lại, được cung cấp bởi bộ xử lý băng tần
cơ sở.
CCIN
- Nhập vào bộ xử lý băng gốc để phát hiện một khay thẻ SIM vào
ngăn chứa.
- Các pin CCIN là bắt buộc cho các ứng dụng cho phép người – sử
dụng để loại bỏ các thẻ SIM trong quá trình hoạt động.
Các pin CCIN là chỉ sử dụng cùng với một thẻ SIM. Nó không
phải được sử dụng cho bất kỳ mục đích khác.
Bảng Chức năng chân của giao tiếp SIM
4.5.2.3 Hoạt động của MC35i
MC35i gồm 3 chế độ hoạt động:
- Chế độ bình thường
- Chế độ tắt nguồn
- Chế độ báo động
Chế độ hoạt động bình thường
- GSM / GPRS SLEEP
Thiết lập các chế độ khác nhau để tiết kiệm năng lượng với tập lệnh AT + CFUN.
Chế độ này đang hoạt động ở mức tiết kiệm năng lượng đến mức tối thiểu. Nếu
module này đã được đăng ký với mạng GSM trong chế độ IDLE, nó vẫn còn trong chế
độ SLEEP, đăng ký và phân trang từ các trạm BTS.
140
Tiết kiệm điện có thể được lựa chọn ở các cấp độ khác nhau như vô hiệu hóa giao
diện AT hoặc kích hoạt lại giao diện AT cho phép người sử dụng có thể truy cập
thường xuyên các lệnh AT.
- GSM IDLE
Khi kích hoạt chế độ này, sau khi đăng ký với mạng GSM, module có thể được
phân trang từ các trạm BTS và sẵn sàng để gửi và nhận tín hiệu.
- GSM TALK
Kết nối giữa hai thuê bao được tiến hành. Công suất tiêu thụ phụ thuộc vào các
thiết lập mạng như DTX on/off, FR/EFR/HR, anten...
- GPRS IDLE
Module đã sẵn sàng để chuyển dữ liệu GPRS, nhưng không có dữ liệu hiện đang
được gửi hoặc nhận được. Công suất tiêu thụ phụ thuộc vào các thiết lập mạng và cấu
hình GPRS.
- Quá trình truyền dữ liệu GPRS được tiến hành. Công suất tiêu thụ phụ thuộc vào
các thiết lập mạng (ví dụ như kiểm soát mức năng lượng), đường xuống đường lên
/ dữ liệu giá và cấu hình GPRS.
Chế độ tắt nguồn
Bình thường thiết kế sẽ tắt sau khi gửi lệnh AT^SMSO hay chế độ khẩn cấp ra thông
qua pin /EMERGOFF. Các nguồn ASIC (PSU_ASIC) ngắt kết nối cung cấp điện áp từ
phần baseband của mạch điện. Chỉ có một điều chỉnh điện áp trong PSU_ASIC đang hoạt
động để tạo năng lượng cho RTC
Chế độ báo động
Hạn chế hoạt động theo chức năng đưa ra cảnh báo RTC trong khi module này là ở
chế độ Power Down. Trong chế độ báo thức, module không được đăng ký từ mạng GSM,
do đó sẽ giới hạn số lệnh AT có thể truy cập.
4.6 Lập trình giao tiếp MC35i với vi điều khiển
Như đã trình bày, MC35i cung cấp cho chúng ta các giao diện ghép nối, điều khiển
cơ bản. Việc giao tiếp mc35i với các microprocess có thể thực hiện thông qua phương
141
pháp truyền thông nối tiếp.
Trên thực tế có nhiều loại modem gsm hỗ trợ các chuẩn truyền thông khác nhau, dựa
vào đó ta có thể lựa chọn một phương pháp giao tiếp phù hợp để cấu hình cho modem
gsm.
Khi sử dụng vi điều khiển giao tiếp với mc35i để điều khiển cấu hình cho modem
mc35i thực chất là việc truyền và nhận các tin hiệu điều khiển, tín hiệu phản hồi tới và
từ mc35i trả về.
Vậy khi giao tiếp MC35i với vi điều khiển ta cần chú ý các đặc điểm sau:
- Chuẩn truyền thông sử dụng cho việc giao tiếp : RS232.
- Điều khiển dựa trên tập lệnh AT theo chuẩn GSM 07.07 hoặc GSM 07.05.
Một số quy tắc khi sử dụng tập lệnh AT trong lập trình giao tiếp modem GSM:
Quy tắc 1:
Tất cả các dòng lệnh phải bắt đầu với "AT" và kết thúc bởi một ký tự trả về nào đó
kí hiệu là , thông thường là ký tự Enter. Trong chương trình HyperTerminal của
Microsoft Windows khi kiểm tra một thiết bị được kết nối với máy tính sử dụng tập lệnh
AT thì để kết thúc một lệnh AT có thể nhấn phím Enter trên bàn phím.
Thí dụ: Để xem danh sách tất cả các tin nhắn SMS trong chưa đọc được lưu trữ trong bộ
nhớ của thiết bị, gõ "AT+CMGL" và cuối cùng nhấn kí tự kết thúc thì dạng cú pháp như
sau:
AT + CMGL
Quy tắc 2:
Một dòng lệnh có thể chứa nhiều hơn một lệnh AT, nhưng chỉ có lệnh đầu tiên
được bắt đầu bằng "AT". Mỗi lệnh được cách nhau bởi dấu chấm phẩy.
Thí dụ: Để liệt kê tất cả các tin nhắn SMS chưa được đọc trong bộ nhớ và lấy tên
nhà sản xuất thiết bị thì gõ lệnh như sau:
AT+CMGL; + CGMI
Lỗi sẽ xảy ra nếu cả hai lệnh AT được bắt đầu với "AT" như sau:
AT+CMGL; AT+ CGMI
142
Quy tắc 3: Một chuỗi được đặt giữa cặp dấu nháy kép.
Thí dụ: đọc tất cả các tin nhắn SMS từ bộ nhớ lưu trữ trong chế độ văn bản cần
phải chỉ định chuỗi "ALL" trong lệnh AT+CMGL, như sau:
AT +CMGL = "ALL"
Quy tắc 4:
Thông tin trả lời và mã kết quả luôn luôn bắt đầu và kết thúc với một khí tự trả về
và ký tự linefeed (kí hiệu là LF).
Thí dụ: Sau khi gửi dòng lệnh "AT+ CGMI " đển các thiết bị di động, các
thiết bị di động sẽ trả lại thông tin phản hồi dạng như sau:
N o k i a
OK
Các file đính kèm theo tài liệu này:
- bai_giang_lap_trinh_tren_dien_thoai_di_dong.pdf