`

在Java ME中通过蓝牙发现设备并传送文件

阅读更多

  

 在Java ME设备上执行蓝牙应用程序的首要步骤之一就是发现过程(discovery process)。简而言之就是,发现过程就是带有蓝牙的设备互相找到彼此的过程,然后一起携手找出它们各个可以支持的服务。下一步就是要学习如何在这些两两设备之间传送数据。

  在本篇技术小文章中,我将向你展示如何创建一个可以互相查找设备的一个MIDlet,然后让用户发送一个简单的消息到其中一个被找到的设备中。我已经在Nokia N95的机器上测试并核实了这个MIDlet的工作了,通过启用蓝牙支持,它可以连接到一个运行Windows Vista的电脑上。

  我把整个过程分成以下几个步骤:

  1. 开始发现过程。

  2. 查询在发现过程中找到的设备所支持的服务。

  3. 使用支持服务的URL开始并处理一个OBEX数据交换。

  以下各段将详细说明这些步骤。在这些步骤中遵循代码片段可以查阅这个MIDlet的整个源代码。源代码可以在最后的Resources下的压缩文件中获得。

  第一步:开始发现过程

  发现过程是用来告诉本地蓝牙堆栈可以和在附近任何蓝牙设备进行配对。在这个MIDlet中,这个堆栈可以通过你的设备提供者所提供的JSR 82来完成。这个发现过程通过发现在本地设备中的代理来开始的,如以下代码所示:

       // get the local discovery agent 
  agent = LocalDevice.getLocalDevice().getDiscoveryAgent();

  // start the inquiry for general unlimited inquiry

  agent.startInquiry(DiscoveryAgent.GIAC, this);

  一旦发现代理启动发现过程,它将在一个执行DiscoveryListener接口的类上调用各种调回方法。就我们而言,这是我们的MIDlet类。

具体来说,必须执行这个接口的四个方法,其中两个是在发现阶段我们所感兴趣的:deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) 和 inquiryCompleted(int discType)。这两个方法处理一个设备的发现并完成发现过程。在以下所展示的来自MIDlet的代码中,一旦它们被发现或是当程序结束的时候,我们使用这些方法来添加我们的设备上的UI。

      public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
  try {

  // add the devices using the friendly names

  listofDevices.append(btDevice.getFriendlyName(false), null);

  // add to the devices hashtable

  devices.put(new Long(listofDevices.size()), btDevice);

  } catch(Exception ex) { handleError(ex); }

  }

  public void inquiryCompleted(int discType) {

  // once the inquiry is completed, show the list of devices to the user

  if(listofDevices.size() == 0) {

  display.setCurrent(nothing, noteBox);

  } else {

  display.setCurrent(listofDevices);

  }
      }

  第二步: 在已发现的设备上开始服务发现(service discovery)

  由于本文的目的是让数据从我们的MIDlet中传输到一个兼容的设备上,我们需要在已发现的设备上找到这些服务来实现这个目标。为了达到这个目的,我们需要在服务发现过程中定义正确的属性和UUIDs。以下代码将显示如何来做这个:

 

      agent.searchServices( 
  null,

  new UUID[] {new UUID(0x1105L)}, // we want the OBEX PUSH Profile

  device,

  this);

  正如你所猜到的,这些代码使用我们以前用过的本地代理来查找设备。我们不是在一组特定的属性之后,所以我们需要用null作为第一个参数,但是UUID必须是OBEX PUSH配置文件,因为这是传输数据的一个最开放式的方法。

  我们讲到DiscoveryListener接口有两个其他的方法可以用来利用发现的服务。这两个方法是servicesDiscovered(int transID, ServiceRecord[] servRecord) 和serviceSearchCompleted(int transID, int respCode)。正如名字所显示的那样,第一个方法是每当一个服务被发现时被调用,第二个方法当服务过程结束时被调用。

  每当一个服务被发现的时候,我们需要找到每个设备上的特定的URL服务连接。这个URL连接将使OBEX连接用于我们的数据传送,而且由蓝牙硬件,设备地址组成。在以下的代码中,这个URL连接取自于servicesDiscovered方法:

       String connURL = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);

  通过这个URL连接,现在我们可以把传输数据的程序移动到已发现得设备上。

  第三步:使用PBEX PUT传送数据

  在这个MIDlet中,我们将运行用户输入一些文本作为一个消息,然后用已发现的设备或是服务来传送它们。为了做这个,我们需要在前一步骤中得到的URL连接(当然,消息数据是作为一个String的)。

        // open a client session 
  ClientSession clientSession =

  (ClientSession) Connector.open(connURL);

  // connect using no headers

  clientSession.connect(null);

  if(rHeaders.getResponseCode() != ResponseCodes.OBEX_HTTP_OK) {

  // the connection could not be established

  handleError(

  new Exception("Remote client returned invalid response code: " +

  rHeaders.getResponseCode()));

  return;

  }

  // if we are here, then response code was ok

  // create a new set of headers

  HeaderSet headers = clientSession.createHeaderSet();

  headers.setHeader(

  HeaderSet.LENGTH,

  new Long(noteBox.getString().length()));

  headers.setHeader(HeaderSet.NAME, "myNote.txt");

  headers.setHeader(HeaderSet.TYPE, "text/plain");

  // create an operation using the headers we have just created

  Operation op = clientSession.put(headers);

  // on this operation, create the output stream

  OutputStream out = op.openOutputStream();

  // and send the note

  out.write(noteBox.getString().getBytes());

  为了发送该数据,client session被打开,而且建立一个空标题的连接。在这一点上,你的目标设备要求来自一个新设备的数据接收的确认。如果你以前从来没有配对的设备,也可能要求你提供密钥。

  一旦连接建立,解释数据目的地一些标题会被创建,而且一个新的操作通过这些标题也会被创建。这个操作是通过OutputStream来进行传送数据的。

  接收到的消息放在目标设备上的默认蓝牙交换文件夹中。

 

 

分享到:
评论

相关推荐

    Java ME蓝牙串口通讯中异地文件目录结构的动态访问控制.pdf

    然而,在多终端的Java ME蓝牙串口通讯中,一个常见的需求是访问和控制远程设备的文件目录结构。例如,一个应用程序可能需要查找或操作另一设备上的特定文件。由于蓝牙串口通讯的特性,数据传输速率和格式都受到限制...

    Java ME手机蓝牙俄罗斯方块源码

    Java ME(Mobile Edition)是Java平台...通过这个项目,开发者可以学习到Java ME平台上的游戏开发、蓝牙通信以及如何在受限环境中优化性能。对于想要深入理解移动设备上游戏开发的程序员来说,这是一个很好的学习资源。

    通过蓝牙从电脑传java程序进手机简单易用

    2. **发送文件**:选中`.jar` 文件后,可以通过右键菜单中的“发送到”选项选择蓝牙设备进行发送,或者直接拖拽文件到蓝牙设备图标上。如果是使用BlueSoleil等第三方软件,则可能需要通过软件界面来发送文件。 3. *...

    java me API中文手册

    8. **连接框架**:Java ME的连接框架支持多种连接模式,包括无线网络、蓝牙、红外等,便于设备间的通信和数据交换。 9. **Java ME SDK与模拟器**:开发Java ME应用时,会用到Java ME SDK,它包含了编译器、模拟器...

    SendAndRece_java蓝牙_java蓝牙软件_蓝牙手机_手机蓝牙软件_

    在Java蓝牙程序中,开发者可能使用了`ServiceRecord`来定义服务,并通过`L2CAP`(逻辑链路控制和适配协议)或`RFCOMM`(无线连接协议)建立连接。 在"SendAndRece"这个软件中,核心功能可能包括: 1. **设备发现**...

    使用Java蓝牙无线通讯技术API

    1. **蓝牙设备发现**:在Java中,我们首先需要创建`RemoteDevice`对象来表示蓝牙设备。使用`DiscoveryAgent`接口的`startInquiry()`方法可以开始搜索附近的蓝牙设备。搜索完成后,会触发`DeviceDiscoveryListener`...

    JAVA蓝牙技术可以收发信息

    在Java中,蓝牙通信通常通过Java Micro Edition (Java ME) 的Personal Profile(PP)或者Java SE的Java Bluetooth API(JSR-82)来实现。这两种API为开发者提供了收发数据、设备发现、连接管理等功能。 1. **Java ...

    简单的蓝牙通讯代码通过j2me 的蓝牙设备可以实现多个蓝牙手机之间的设备通讯

    标题中的“简单的蓝牙通讯代码通过j2me 的蓝牙设备可以实现多个蓝牙手机之间的设备通讯”表明,这是一个关于使用Java ME(J2ME)平台进行蓝牙通信的编程实践。J2ME是Java的一种轻量级版本,常用于移动设备,如早期的...

    JavaME实用详解源码

    3. **网络通信**:JavaME提供了JSR 82(Bluetooth API)和JSR 118(J2ME Wireless Messaging API)等接口,源码可能包含使用这些API进行蓝牙通信或发送短信的示例。 4. **数据存储**:利用JSR 75(PIM API)管理...

    java me手机应用开发大全(书上代码)

    Java ME,全称为Java Micro Edition,是Java技术在嵌入式设备和移动设备上的应用平台。这个平台允许开发者创建可以在各种小型设备上运行的应用程序,包括早期的智能手机、功能手机和一些嵌入式系统。"Java ME手机...

    Java蓝牙开发(英文版)

    1. **蓝牙服务发现**:在Java中,通过`LocalDevice`类和`ServiceDiscoveryManager`类可以实现蓝牙设备的发现和服务搜索。`LocalDevice`允许获取本地蓝牙设备的信息,而`ServiceDiscoveryManager`则负责查找远程设备...

    bluetooth_java:java版蓝牙配对、接收数据

    在Java编程环境中,实现蓝牙设备的配对与数据接收是一项重要的技术任务,特别是在移动设备和物联网(IoT)应用中。本项目“bluetooth_java”提供了这样的功能,它使用Java API来处理蓝牙通信,这对于开发者来说是很有...

    Java蓝牙开发(英文版)_程序设计.rar

    在这个领域,开发者利用Java API和蓝牙规范来创建可以发现、连接并交换数据的蓝牙设备应用。下面将详细讨论Java蓝牙开发的关键知识点。 1. **Java Bluetooth API (JSR-82)**: Java蓝牙开发的核心是Java ...

    java-blue.rar_BLUE_bluejava_蓝牙

    Java开发中的蓝牙技术是连接设备并进行数据交换的一种重要手段,尤其在物联网(IoT)领域,蓝牙功能常被用于创建无线传感器网络或智能设备之间的通信。标题中的"java-blue.rar_BLUE_bluejava_蓝牙"表明这是一个与Java...

    手机蓝牙遥控小车 手机J2ME蓝牙API

    - 首先,手机端的Java ME应用会初始化蓝牙,并搜索附近的蓝牙设备。 - 小车上应有一个蓝牙模块,配置为可被发现并且监听连接请求。 - 一旦手机找到小车的蓝牙设备,可以建立连接。连接过程可能需要用户授权。 - ...

    嵌入式Java蓝牙构件模型的研究与应用.pdf

    这些程序通常包括蓝牙设备的发现、连接、数据传输等核心功能,并包含了几个重要的方法,如建立连接、发送数据、接收数据等。 最后,为了实际应用这些理论,文章详细阐述了如何在Linux环境下配置交叉编译环境,以便...

    Bluetooth_for_Java

    在Java中,通过`javax.bluetooth.DiscoveryAgent`接口可以执行蓝牙设备的扫描和发现。调用`discoverDevices()`方法可以搜索周边的蓝牙设备,并获取其详细信息,如设备名称、地址等。 3. **服务搜索** 除了设备发现...

    很不错的蓝牙开发Demo/j2me蓝牙_客户端_服务端_类.rar

    `Client.java`文件可能包含了扫描蓝牙服务、连接到指定蓝牙设备、以及通过蓝牙发送和接收数据的代码。客户端通常需要实现设备发现、服务查询和安全连接等功能。 3. **服务端(Server.java)**:服务端则是蓝牙通信...

    Java 手机 PDA 程序设计入门.rar

    9. **模拟器与真机测试**:开发过程中,开发者会使用Java ME模拟器进行初步测试,但最终仍需在实际设备上进行验证,确保应用能在不同设备上正常运行。 通过深入学习以上知识点,并结合实际项目练习,你将能够熟练地...

    自己写的手机蓝牙控制代码

    2. **jsr82**:这是Java ME平台上的一个规范,提供了对蓝牙设备编程的接口,使得开发者可以通过Java语言来控制蓝牙设备。 3. **j2me**:Java 2 Micro Edition,主要用于移动设备和嵌入式系统的Java开发环境,该项目...

Global site tag (gtag.js) - Google Analytics