Bài giảng Lập trình trên điện thoại di động

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

pdf142 trang | Chia sẻ: huongthu9 | Lượt xem: 531 | Lượt tải: 0download
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:

  • pdfbai_giang_lap_trinh_tren_dien_thoai_di_dong.pdf