本文来自http://blog.csdn.net/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:%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]-->
分享到:
相关推荐
通过研究和理解bexDemo的代码,可以加深对J2ME蓝牙通信的理解。 总结来说,这个主题涉及到使用J2ME平台和蓝牙API(JSR-82)来创建能够进行设备间通信的应用程序,特别是通过OBEX协议交换数据。开发者可以通过分析...
**安全性考虑**:虽然蓝牙通信方便,但其安全风险也不容忽视,例如蓝牙嗅探和中间人攻击。因此,开发者可能采取了一些措施,如加密通信内容,以提高聊天系统的安全性。 综上所述,【j2me 手机蓝牙聊天系统】是一个...
首先,我们要理解J2ME中的蓝牙通信涉及到的主要API。在J2ME中,主要依赖于JSR-82(Java API for Bluetooth Wireless Technology)来实现蓝牙功能。JSR-82提供了一套完整的接口和类,使得开发者能够创建、搜索、连接...
蓝牙通信可能会受到信号强度、设备负载和网络条件的影响。为了优化性能,需要合理设计数据传输策略,例如,分块传输大文件,以及处理网络中断和重试机制。 总的来说,J2ME蓝牙编程是一个涉及硬件接口、网络通信和...
总的来说,“J2ME手机蓝牙聊天”项目是一个实践性强、涵盖技术点丰富的课程设计,不仅涉及J2ME的基础编程,还涵盖了蓝牙通信的原理与应用。通过这个项目,开发者不仅可以深入理解J2ME平台,还能掌握蓝牙通信的核心...
《基于J2ME蓝牙的手机与计算机通信系统设计》这篇毕业论文主要探讨了如何利用Java Micro Edition(J2ME)平台实现手机与计算机之间的无线通信,尤其是通过蓝牙技术进行数据交换。本文将深入解析该系统的设计原理、...
1. **蓝牙连接管理**:如何使用J2ME API进行蓝牙设备的搜索、连接和断开。 2. **数据交换**:如何编码和解码点菜信息,以及如何通过蓝牙接口进行数据传输。 3. **用户界面**:如何设计简单的图形用户界面(GUI)以...
《基于J2ME的手机蓝牙五子棋程序详解》 J2ME,全称为Java 2 Platform, Micro Edition,是Java...通过这个项目,开发者不仅可以掌握J2ME的基本技能,还能了解到蓝牙通信的原理和实现,以及在有限资源下优化程序的方法。
栈初始化是蓝牙通信的关键第一步,需要根据制造商的具体指南进行。例如,Bruce Hopkins在他的文章中演示了如何在Atinav Java蓝牙SDK中进行初始化设置。需要注意的是,这些步骤不是JSR 82规范的一部分,不同的实现...
1. **蓝牙API**:J2ME中的JSR-82(Java API for Bluetooth Wireless Technology)提供了与蓝牙设备交互的接口,包括搜索设备、建立连接、传输数据等。 2. **线程管理**:游戏逻辑和蓝牙通信通常需要在不同的线程中...
"bluetooth"目录可能包含与蓝牙通信相关的类和配置文件。这些文件处理设备发现、连接建立、数据传输等任务,是实现蓝牙对战的关键部分。 总的来说,J2ME蓝牙五子棋项目展示了如何利用Java技术在移动设备上实现一个...
总的来说,J2ME为移动通信设备提供了强大的开发框架,使得开发者能够创建功能丰富的、跨平台的应用程序。随着技术的发展,尽管现在有更多现代的移动开发平台如Android和iOS,但J2ME的历史地位和其在移动通信领域的...
本资源提供的是一款基于 J2ME 的手机蓝牙源程序,允许开发者通过 Java 代码实现手机间的蓝牙通信功能。下面我们将详细探讨 J2ME 中蓝牙编程的相关知识点。 首先,我们需要了解 J2ME 中蓝牙通信的基础概念。在 J2ME ...
《J2ME蓝牙编程》这一主题深入探讨了在移动设备上开发Java蓝牙应用程序的技术与实践。J2ME(Java 2 Micro Edition)是Sun Microsystems为嵌入式和移动设备设计的Java平台版本,它提供了轻量级的Java运行环境,特别...
在本文中,我们将深入探讨如何基于Java Micro Edition (J2ME) 实现手机与计算机之间的蓝牙通信系统,特别是在手机端的应用。J2ME是Java平台的一个子集,专门设计用于资源有限的移动设备,如手机,它提供了丰富的功能...
5. **网络编程**:尽管蓝牙通信可以视为一种局域网技术,但在J2ME中,开发者仍需要理解网络编程的基本概念,如套接字(Socket)通信,以便实现两个设备之间的游戏数据交换。 6. **游戏逻辑**:为了确保游戏的公平性...
在J2ME中,蓝牙通信是一种常见且实用的技术,它允许设备之间进行无线数据交换,比如图片的发送与接收。本教程将深入探讨J2ME蓝牙用例,重点讲解如何实现图片的发布和接受。 首先,我们需要理解J2ME中的蓝牙API。...
3. **RemoteDevice**: 表示远程蓝牙设备,通常在搜索到设备后,会得到RemoteDevice对象,包含了设备的BluetoothAddress(蓝牙地址)和其他信息。你可以通过`RemoteDevice.getDeviceClass()`获取设备类别,或者`...