分享
 
 
 

编写Palm J2ME红外线“聊天”程序

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

红外线通信协议介绍

基于红外线的传输技术最近几年有了很大发展。目前广泛使用的家电遥控器几乎都是采用的红外线传输技术。作为无线局域网的传输方式,红外线方式的最大优点是不受无线电干扰,且它的使用不受国家无线管理委员会的限制。但是,红外线对非透明物体的透过性较差,导致传输距离受限制。

红外线是波长在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+KJava;另一种是利用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.biplip.com/Default.aspx?tabid=36&mid=355&ctl=View&ItemID=195

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有