使用J2ME搜索蓝牙设备,并与搜到的设备通信

本文介绍如何使用J2ME进行蓝牙设备的搜索、连接及数据通信,包括实现蓝牙搜索的关键代码和通过获取的蓝牙地址建立连接并收发数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文来自http://blog.youkuaiyun.com/hellogv/
由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般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<devices.size();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(); } } } <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///G:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_filelist.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><style type="text/css"> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值