首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 第二书店 程序员
您的位置:Mobile->使用J2ME搜索蓝牙设备,并与搜到的设备通信

使用J2ME搜索蓝牙设备,并与搜到的设备通信2008-05-15 来自:lizhe1985  [收藏到我的网摘]

来源:JSR184/MascotV3专栏 - CSDNBlog

由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般J2ME程序员绝对看得懂!
首先,给出J2ME搜索蓝牙设备的代码:
public void commandAction(Command command, Displayable displayable)
{
if(command==cmd_Search)
{
try
{
LocalDevice localDevice = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();
discoveryAgent.startInquiry(DiscoveryAgent.GIAC,new MyDiscoveryListener(this));
}
catch (Exception e)
{
MyClass.MessageBox("搜索出错,找不到蓝牙设备!", display);
return;
}

Menu.removeCommand(cmd_Search);
}
}
}


class MyDiscoveryListener implements DiscoveryListener {
//用于保存搜索到的设备
Vector devices = new Vector();
SearchDevices midlet;

public MyDiscoveryListener(SearchDevices midlet) {
this.midlet = midlet;
}

public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
devices.addElement(btDevice);
}

public void inquiryCompleted(int discType) {
for (int i=0; i {
RemoteDevice btDevice = (RemoteDevice)devices.elementAt(i);
try
{
String device_address=btDevice.getBluetoothAddress(); //取得蓝牙设备的全球唯一地址
}
catch (Exception e) {e.printStackTrace(); }
}
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {}
public void serviceSearchCompleted(int transID, int responseCode) {}

}

接下来就是根据搜索所得的蓝牙设备地址来连接设备,并与设备通信:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.bluetooth.ServiceRecord;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MIDlet_ConnDevice extends MIDlet
implements Runnable, CommandListener {
private Display display = null;


private Form form = new Form("蓝牙 ");
//用于输入要发送的消息
private TextField tfData = new TextField("请输入发送的消息",
"",255,TextField.ANY);

private Command cmdExit = new Command("退出", Command.EXIT, 0);
private Command cmdSend = new Command("发送", Command.SCREEN, 1);
private Command cmdConnect = new Command("连接", Command.SCREEN, 1);

//线程运行标志
private boolean isRunning = true;

StreamConnection client = null;
//服务器服务记录
ServiceRecord record=null;
private DataInputStream dis = null;
private DataOutputStream dos = null;

public MIDlet_ConnDevice() {
super();
form.append(tfData);
form.addCommand(cmdExit);
form.addCommand(cmdConnect);
form.setCommandListener(this);
}
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(form);
}

protected void pauseApp() {
isRunning = false;
close();
}

protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
isRunning = false;
close();
}

/**
* 处理命令按钮事件
*/
public void commandAction(Command cmd, Displayable d) {
if (cmd == cmdExit) {
isRunning = false;
notifyDestroyed();
} else if(cmd == cmdSend) {
//发送数据
new Thread() {
public void run() {
if (dos == null) {
return;
}
//把输入的字符串变为数字
try {

dos.writeUTF(tfData.getString());
dos.flush();
} catch (IOException e) {
form.append("Send error");
}
}
}.start();
} else if (cmd == cmdConnect) {
//开始服务器线程
new Thread(this).start();
}
}

/**
* 客户端接收线程
*/
public void run() {
isRunning = true;
client = null;
String device_address; //搜索所得的设备地址
String conURL = "btspp://"+device_address+":1";
try {
client = (StreamConnection)Connector.open(conURL);
form.append("Connected!\n");
dis = client.openDataInputStream();
dos = client.openDataOutputStream();
form.removeCommand(cmdConnect);
form.addCommand(cmdSend);
} catch (Exception e) {
form.append("connect error");
close();
return;
}
while(isRunning) {
try {
if(dis.available()>1)
{
byte[] rec_package=new byte[dis.available()]; //强烈建议这里使用byte[]
dis.read(rec_package);
String str=new String(rec_package);
}
}
catch (Exception e) {
form.append("rec error");
break;
}
}
close();
form.removeCommand(cmdSend);
form.addCommand(cmdConnect);
}

/**
* 关闭连接
*/
public void close() {
try {
if (dis != null) {
dis.close();
dis = null;
}

if (dos != null) {
dos.close();
dos = null;
}

if (client != null) {
client.close();
client = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

推荐人评论

由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般J2ME程序员绝对看得懂!

用户评论

正在载入评论列表...

是谁推荐了此篇文章

专家头像李哲
个人blog发送信息
李哲推荐的其他文章

赞助商精华文章

热点新闻

热点评论

    精彩视频

    精彩专题

      网站简介广告服务网站地图帮助联系方式诚聘英才English问题报告
    北京世纪乐知码科技有限公司  版权所有  京 ICP 证 020026 号
    Copyright © 2000-2006, CSDN.NET, All Rights Reserved