社区
J2ME
帖子详情
手机使用j2me程序通过蓝牙模块访问互联网
zhouyu260
2010-04-29 12:42:31
如题
...全文
167
2
打赏
收藏
手机使用j2me程序通过蓝牙模块访问互联网
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Overtherw
2010-05-19
打赏
举报
回复
/////////////////////////////////////////////////////////////////////////////////////////////// ClientBox.java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Vector; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Gauge; import javax.microedition.lcdui.StringItem; import javax.microedition.lcdui.TextField; //jsr082 API import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; /** * 客户端GUI * @author Jagie * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class ClientBox extends Form implements Runnable, CommandListener, DiscoveryListener { //字串输入框 TextField input = new TextField(null, "", 50, TextField.ANY); //loger StringItem result = new StringItem("结果:", ""); private DiscoveryAgent discoveryAgent; private UUID[] uuidSet; //响应服务的UUID private static final UUID ECHO_SERVER_UUID = new UUID( "F0E0D0C0B0A000908070605040302010", false); //设备集合 Vector devices = new Vector(); //服务集合 Vector records = new Vector(); //服务搜索的事务id集合 int[] transIDs; StupidBTMIDlet midlet; public ClientBox(StupidBTMIDlet midlet) { super(""); this.midlet=midlet; this.append(result); this.addCommand(new Command("取消",Command.CANCEL,1)); this.setCommandListener(this); new Thread(this).start(); } public void commandAction(Command arg0, Displayable arg1) { if(arg0.getCommandType()==Command.CANCEL){ midlet.showMainMenu(); }else{ //匿名内部Thread,访问远程服务。 Thread fetchThread=new Thread(){ public void run(){ for(int i=0;i<records.size();i++){ ServiceRecord sr=(ServiceRecord)records.elementAt(i); if(accessService(sr)){ //访问到一个可用的服务即可 break; } } } }; fetchThread.start(); } } private boolean accessService(ServiceRecord sr){ boolean result=false; try { String url = sr.getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); StreamConnection conn = (StreamConnection) Connector.open(url); DataOutputStream dos=conn.openDataOutputStream(); dos.writeUTF(input.getString()); dos.close(); DataInputStream dis=conn.openDataInputStream(); String echo=dis.readUTF(); dis.close(); showInfo("反馈结果是:"+echo); result=true; } catch (IOException e) { } return result; } public synchronized void run() { //发现设备和服务的过程中,给用户以Gauge Gauge g=new Gauge(null,false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING); this.append(g); showInfo("蓝牙初始化..."); boolean isBTReady = false; try { LocalDevice localDevice = LocalDevice.getLocalDevice(); discoveryAgent = localDevice.getDiscoveryAgent(); isBTReady = true; } catch (Exception e) { e.printStackTrace(); } if (!isBTReady) { showInfo("蓝牙不可用"); //删除Gauge this.delete(1); return; } uuidSet = new UUID[2]; //标志我们的响应服务的UUID集合 uuidSet[0] = new UUID(0x1101); uuidSet[1] = ECHO_SERVER_UUID; try { discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); } catch (BluetoothStateException e) { } try { //阻塞,由inquiryCompleted()回调方法唤醒 wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } showInfo("设备搜索完毕,共找到"+devices.size()+"个设备,开始搜索服务"); transIDs = new int[devices.size()]; for (int i = 0; i < devices.size(); i++) { RemoteDevice rd = (RemoteDevice) devices.elementAt(i); try { //记录每一次服务搜索的事务id transIDs[i] = discoveryAgent.searchServices(null, uuidSet, rd, this); } catch (BluetoothStateException e) { continue; } } try { //阻塞,由serviceSearchCompleted()回调方法在所有设备都搜索完的情况下唤醒 wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } showInfo("服务搜索完毕,共找到"+records.size()+"个服务,准备发送请求"); if(records.size()>0){ this.append(input); this.addCommand(new Command("发送",Command.OK,0)); } //删除Gauge this.delete(1); } /** * debug * @param s */ private void showInfo(String s){ StringBuffer sb=new StringBuffer(result.getText()); if(sb.length()>0){ sb.append("\n"); } sb.append(s); result.setText(sb.toString()); } /** * 回调方法 */ public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { if (devices.indexOf(btDevice) == -1) { devices.addElement(btDevice); } } /** * 回调方法,唤醒初始化线程 */ public void inquiryCompleted(int discType) { synchronized (this) { notify(); } } /** * 回调方法 */ public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { for (int i = 0; i < servRecord.length; i++) { records.addElement(servRecord[i]); } } /** * 回调方法,唤醒初始化线程 */ public void serviceSearchCompleted(int transID, int respCode) { for (int i = 0; i < transIDs.length; i++) { if (transIDs[i] == transID) { transIDs[i] = -1; break; } } //如果所有的设备都已经搜索服务完毕,则唤醒初始化线程。 boolean finished = true; for (int i = 0; i < transIDs.length; i++) { if (transIDs[i] != -1) { finished = false; break; } } if (finished) { synchronized (this) { notify(); } } } }
自己整理吧!就这样了。
Overtherw
2010-05-19
打赏
举报
回复
两台设备必须共享通用的通讯协议才能通讯。为了应用能够访问更多的蓝牙服务,蓝牙java API有一个这样一个机制,它允许连接到使用RFCOMM, L2CAP, 或 OBEX协议的任何服务。
代码:这个程序包括3个java文件。一个是MIDlet,另外2个为服务端GUI和客户端GUI。该程序已经在wtk22模拟器和Nokia 6600,Nokia 6670两款手机上测试通过
StupidBTMIDlet.java import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; /** * @author Jagie * * MIDlet */ public class StupidBTMIDlet extends MIDlet implements CommandListener { List list; ServerBox sb; ClientBox cb; /* * (non-Javadoc) * * @see javax.microedition.midlet.MIDlet#startApp() */ protected void startApp() throws MIDletStateChangeException { list = new List("傻瓜蓝牙入门", List.IMPLICIT); list.append("Client", null); list.append("Server", null); list.setCommandListener(this); Display.getDisplay(this).setCurrent(list); } /** * debug方法 * @param s 要显示的字串 */ public void showString(String s) { Displayable dp = Display.getDisplay(this).getCurrent(); Alert al = new Alert(null, s, null, AlertType.INFO); al.setTimeout(2000); Display.getDisplay(this).setCurrent(al, dp); } /** * 显示主菜单 * */ public void showMainMenu() { Display.getDisplay(this).setCurrent(list); } protected void pauseApp() { // TODO Auto-generated method stub } public void commandAction(Command com, Displayable disp) { if (com == List.SELECT_COMMAND) { List list = (List) disp; int index = list.getSelectedIndex(); if (index == 1) { if (sb == null) { sb = new ServerBox(this); } sb.setString(null); Display.getDisplay(this).setCurrent(sb); } else { //每次都生成新的客户端实例 cb = null; System.gc(); cb = new ClientBox(this); Display.getDisplay(this).setCurrent(cb); } } } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } } /////////////////////////////////////////////////////////////////////////////////////////////// ServerBox.java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Vector; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.LocalDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnectionNotifier; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; /** * 服务端GUI * @author Jagie * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class ServerBox extends TextBox implements Runnable, CommandListener { Command com_pub = new Command("开启服务", Command.OK, 0); Command com_cancel = new Command("终止服务", Command.CANCEL, 0); Command com_back = new Command("返回", Command.BACK, 1); LocalDevice localDevice; StreamConnectionNotifier notifier; ServiceRecord record; boolean isClosed; ClientProcessor processor; StupidBTMIDlet midlet; //响应服务的uuid private static final UUID ECHO_SERVER_UUID = new UUID( "F0E0D0C0B0A000908070605040302010", false); public ServerBox(StupidBTMIDlet midlet) { super(null, "", 500, TextField.ANY); this.midlet = midlet; this.addCommand(com_pub); this.addCommand(com_back); this.setCommandListener(this); } public void run() { boolean isBTReady = false; try { localDevice = LocalDevice.getLocalDevice(); if (!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) { showInfo("无法设置设备发现模式"); return; } // prepare a URL to create a notifier StringBuffer url = new StringBuffer("btspp://"); // indicate this is a server url.append("localhost").append(':'); // add the UUID to identify this service url.append(ECHO_SERVER_UUID.toString()); // add the name for our service url.append(";name=Echo Server"); // request all of the client not to be authorized // some devices fail on authorize=true url.append(";authorize=false"); // create notifier now notifier = (StreamConnectionNotifier) Connector .open(url.toString()); record = localDevice.getRecord(notifier); // remember we've reached this point. isBTReady = true; } catch (Exception e) { e.printStackTrace(); } // nothing to do if no bluetooth available if (isBTReady) { showInfo("初始化成功,等待连接"); this.removeCommand(com_pub); this.addCommand(com_cancel); } else { showInfo("初始化失败,退出"); return; } // 生成服务端服务线程对象 processor = new ClientProcessor(); // ok, start accepting connections then while (!isClosed) { StreamConnection conn = null; try { conn = notifier.acceptAndOpen(); } catch (IOException e) { // wrong client or interrupted - continue anyway continue; } processor.addConnection(conn); } } public void publish() { isClosed = false; this.setString(null); new Thread(this).start(); } public void cancelService() { isClosed = true; showInfo("服务终止"); this.removeCommand(com_cancel); this.addCommand(com_pub); } /* * (non-Javadoc) * * @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command, * javax.microedition.lcdui.Displayable) */ public void commandAction(Command arg0, Displayable arg1) { if (arg0 == com_pub) { //发布service publish(); } else if (arg0 == com_cancel) { cancelService(); } else { cancelService(); midlet.showMainMenu(); } } /** * 内部类,服务端服务线程。 * @author Jagie * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ private class ClientProcessor implements Runnable { private Thread processorThread; private Vector queue = new Vector(); private boolean isOk = true; ClientProcessor() { processorThread = new Thread(this); processorThread.start(); } public void run() { while (!isClosed) { synchronized (this) { if (queue.size() == 0) { try { //阻塞,直到有新客户连接 wait(); } catch (InterruptedException e) { } } } //处理连接队列 StreamConnection conn; synchronized (this) { if (isClosed) { return; } conn = (StreamConnection) queue.firstElement(); queue.removeElementAt(0); processConnection(conn); } } } /** * 往连接队列添加新连接,同时唤醒处理线程 * @param conn */ void addConnection(StreamConnection conn) { synchronized (this) { queue.addElement(conn); notify(); } } } /** * 从StreamConnection读取输入 * @param conn * @return */ private String readInputString(StreamConnection conn) { String inputString = null; try { DataInputStream dis = conn.openDataInputStream(); inputString = dis.readUTF(); dis.close(); } catch (Exception e) { e.printStackTrace(); } return inputString; } /** * debug * @param s */ private void showInfo(String s) { StringBuffer sb = new StringBuffer(this.getString()); if (sb.length() > 0) { sb.append("\n"); } sb.append(s); this.setString(sb.toString()); } /** * 处理客户端连接 * @param conn */ private void processConnection(StreamConnection conn) { // 读取输入 String inputString = readInputString(conn); //生成响应 String outputString = inputString.toUpperCase(); //输出响应 sendOutputData(outputString, conn); try { conn.close(); } catch (IOException e) { } // ignore showInfo("客户端输入:" + inputString + ",已成功响应!"); } /** * 输出响应 * @param outputData * @param conn */ private void sendOutputData(String outputData, StreamConnection conn) { try { DataOutputStream dos = conn.openDataOutputStream(); dos.writeUTF(outputData); dos.close(); } catch (IOException e) { } } }
Java游戏设计打飞机
程序
(源代码+WORD论文).zip
2. 传统
手机
访问
互联网
是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线
访问
,非常耗时、费用亦很高。 而Java技术在无线应用方面的优势非常明显: 1. 应用
程序
可按需下载,而不是购买由...
JAVA打飞机游戏毕业设计(源代码+论文).zip
2. 传统
手机
访问
互联网
是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线
访问
,非常耗时、费用亦很高。 而Java技术在无线应用方面的优势非常明显: 1. 应用
程序
可按需下载,而不是购买由...
JAVA打飞机游戏毕业设计(源代码+论文)
2. 传统
手机
访问
互联网
是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线
访问
,非常耗时、费用亦很高。 而Java技术在无线应用方面的优势非常明显: 1. 应用
程序
可按需下载,而不是购买由...
JAVA毕业设计论文
本文主要探讨了Java技术在
手机
游戏开发中的应用,首先分析了
手机
软件的现状,指出传统
手机
存在的限制,如
程序
固化、无法更新和升级,以及
访问
互联网
的不便。随着信息技术的发展,Java技术因其可按需下载、易升级和...
JAVA游戏毕业设计源码与论文
2. 传统
手机
访问
互联网
是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线
访问
,非常耗时、费用亦很高。 而Java技术在无线应用方面的优势非常明显: 1. 应用
程序
可按需下载,而不是购买由...
J2ME
13,096
社区成员
26,491
社区内容
发帖
与我相关
我的任务
J2ME
Java J2ME
复制链接
扫一扫
分享
社区描述
Java J2ME
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章