紅外線通信協議介紹
基于紅外線的傳輸技術最近幾年有了很大發展。目前廣泛使用的家電遙控器幾乎都是采用的紅外線傳輸技術。作為無線局域網的傳輸方式,紅外線方式的最大優點是不受無線電干擾,且它的使用不受國家無線管理委員會的限制。但是,紅外線對非透明物體的透過性較差,
基于紅外線的傳輸技術最近幾年有了很大發展。目前廣泛使用的家電遙控器幾乎都是采用的紅外線傳輸技術。作為無線局域網的傳輸方式,紅外線方式的最大優點是不受無線電干擾,且它的使用不受國家無線管理委員會的限制。但是,紅外線對非透明物體的透過性較差,導致傳輸距離受限制。
紅外線是波長在750nm至1mm之間的電磁波,它的頻率高于微波而低于可見光,是一種人的眼睛看不到的光線。紅外通信一般采用紅外波段內的近紅外線,波長在0.75um至25um之間。紅外數據協會(IRDA)成立后,為了保證不同廠商的紅外產品能夠獲得最佳的通信效果,紅外通信協議將紅外數據通信所采用的光波波長的范圍限定在850至900nm之內。
IRDA標準包括三個基本的規范和協議:物理層規范(Physical Layer Link Specification)、鏈接建立協議(Link Access Protocol:IrLAP)和鏈接管理協議(Link Management Protocol:IrLMP)。物理層規范制定了紅外通信硬件設計上的目標和要求,IrLAP和IrLMP為兩個軟件層,負責對鏈接進行設置、管理和維護。在IrLAP和IrLMP基礎上,針對一些特定的紅外通信應用領域,IRDA還陸續發布了一些更高級別的紅外協議,如TinyTP、IrOBEX、IrCOMM、IrLAN、IrTran-P和IrBus等等(見圖1)。
圖1 IrBus紅外線通信協議層
Palm J2ME對紅外口的操作介紹
事實上,Sun對基于Palm的
Java程序設計提供了兩種方法:一種是利用CLDC+K
Java;另一種是利用CLDC+
MIDP,然后通過MIDP4Palm將MIDP轉換為Palm上可以運行的程序。前一種為
編程方式,它無論從功能、對漢字的支持、還是運行速度上都高于后者,但是前一種提供的Java虛擬機KVM是單色的,不過可以選用完全兼容KVM的KAWT虛擬機來彌補此缺憾。后一種
編程方式沒有提供對紅外口操作的類庫或方法。
Sun公司的J2ME中的CLDC1.x,KJava為Palm提供了紅外通信的API功能包。在KJava的API中,Palm 應程序中的主程序必須從J2ME的Spotlet類派生而來。
圖2 Sun Java體系結構
Spotlet類提供了Palm經過紅外口發送數據的靜態方法beamSend()。在Palm應用程序中,只需要將待經紅外線發送的數據轉化為字節數組,直接利用beamSend()就可以將數據經紅外口發送給別的設備,見下面程序代碼。
....
public boolean sendData(String s)
{
boolean state=false;
if (s!=null)
state=this.beamSend(s.getBytes());
return state;
}.......
|
對于紅外線數據的接收,Spotlet類提供了 beamReceive(byte[]) 方法,將經紅外口接收到的數據存儲到一個字節數組中,進一步通過對此字節數組操作(如將其轉化為字符串等),可以將獲得的數據顯示出來,見下面程序代碼。
//Receive beam Data
public void beamReceive(byte[] parm1) {
super.beamReceive( parm1);
beamData=new String(parm1);
System.out.print(“the received beam datab is:\n”+eamData);
}
|
Palm J2ME紅外線聊天程序
Palm紅外線數據傳輸應用程序的編寫,取決于經紅外線通信的雙方。通信的雙方必須將接受紅外線設置為Beam Receive: on。雙方必須安裝相應的紅外通訊軟件。
在此假設通信的雙方均是Palm掌上電腦,雙向使用紅外線聊天系統。通信的雙方可以采用相同的程序。系統的主要設計思路是:在Palm J2ME程序GUI中,構造兩個TextField用于對話框,一個用于發送數據,另一個用于顯示經紅外口接收到的數據,然后在構造幾個按鈕,完成數據的發送、程序退出等(見圖3)。
圖3 Palm紅外聊天程序
程序說明如下 :
(1)構造類BeamDemo,由于BeamDemo屬于Palm 的J2ME程序的入口類必須由Spotlet派生,同時BeamDemo完成DialogOwner類(該類是否完成implements可選)如圖4所示。
圖4 BeamDemo UML類圖
(2)設置BeamDemo的程序入口,代碼如下。
public static void main(String args[]) {
new BeamDemo().register(WANT_SYSTEM_KEYS);
}
|
Spotlet.register()的系統注冊事件可以有兩種:
一種為NO_EVENT_OPTIONS。如果注冊了此類事件,Palm的幾個功能鍵仍然可以被PalmOS操作系統使用。因此,由Spotlet派生來的程序可以不用設置程序的退出,直接由Palm的按鈕完成。
另一種為WANT_SYSTEM_KEYS。如果注冊了此類事件,Palm的幾個功能鍵不被PalmOS操作系統使用,只能由程序控制使用。因此,由Spotlet派生來的程序,必須設置程序的退出退出代碼,如:
switch ( keyCode ) {
case 264: // Home button was pressed
System.exit(0); // exits program
break;
.........
|
否則系統無法退出。只有Reset Palm才能使系統退出。系統事件類型為使用系統鍵,該程序運行后會屏蔽系統鍵的功能,這樣可以提高系統響應速度。
(3)用戶界面的構造
為了演示Palm紅外線的通信功能,我們在此只構造3個按鈕、1個textField和1個textBox(如圖3)。
....
static Graphics g = Graphics.getGraphics();
//這里構造用戶界面(如圖1)
Button button5 = new Button(“Exit”,117,139);
Button button4 = new Button(“Clear”,69,139);
Button button3 = new Button(“Send”,20,139);
TextField textField2 = new TextField(“Please Data Here”,13,96,139,33);
TextBox textBox1 = new TextBox(“This is the message that this\n System
Received!\n\n”,15,8,137,73);
//構造方法。
public BeamDemo() {
button5.setEnabled(true);
button4.setEnabled(true);
button3.setEnabled(true);
textField2.setUpperCase(false);
textField2.setText(“”);
paint();
}
|
(4)為了監聽系統紅外線口,必須重載Spotlet的beamReceive事件,Palm監聽的數據是原始的字節,如果由數據到來,就將數據讀入字節數組data[]中,將data[]構造出字符串,寫入textBox1,代碼如下:
public void beamReceive(byte[] data) {
String receivedString=new String(data);
textBox1.setText(String.valueOf(receivedString));
}
public void dialogDismissed(String title) {
......
}
public void keyDown(int keyCode) {
if (textField2.hasFocus()) {
textField2.handleKeyDown(keyCode);
}
public void penDown(int x, int y) {
if (button5.pressed(x,y)) {
System.exit(0);
}
if (button4.pressed(x,y)) {
textBox1.setText(“”);
}
...
|
(5)設置經過紅外口,發送的內容。在BeamDemo程序中,使用textField2的內容作為要發送的數據。由于該數據是字符串,所以可以直接將字符串轉換為字節數組,通過beamSend方法以字節的形式經過Palm紅外口發送出。
String text = textField2.getText();
boolean suceeded = beamSend(String.valueOf(text).getBytes());
if (textField2.pressed(x,y)) {
}
public void penMove(int x, int y) {
if (textField2.pressed(x,y)) {
}
public void penUp(int x, int y) {
}
}
|
總結
總體來講,Palm J2ME紅外程序的編寫并不復雜,但要注意數據的發送是通過Spotlet的靜態方法static booolean beamSend(byte[])實現的,而數據的獲得必須重載beamReceive(byte[]) 方法,來提取接收的數據。另外,要注意Palm的模擬器POSE到目前為止并不支持紅外線通信的模擬,該程序的調試必須在兩臺真實的Palm上進行。
在日常生活中,許多紅外線遙控器都發送紅外線指令給被控制電器??梢岳蒙鲜龀绦?,將紅外線遙控器對準Palm的紅外口,由Palm捕獲紅外線遙控器發出的字節,并存放于Palm的內部
數據庫中,然后利用static booolean beamSend(byte[])發送給被控制電器,就會驚喜地發現,Palm完全可以替代紅外線遙控器。
原文轉自:http://www.anti-gravitydesign.com
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97
|