使用J2ME搜索蓝牙设备,并与搜到的设备通信
本文来自http://blog.csdn.net/hellogv/
由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般J2ME程序员绝对看得懂!
首先,给出J2ME搜索蓝牙设备的代码:
由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般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:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_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]-->