....
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
本文地址:http://com.8s8s.com/it/it32769.htm