如何使用蓝牙将数据(String,int等)发送到安装在另一个Android设备上的同一个应用程序?

时间:2016-01-09 14:08:25

标签: android android-bluetooth

我很困惑......我的意思是让我们说在用户选择他想要配对的设备后,我的应用程序如何找到相同的应用程序并发送字符串数据???然后,一旦发送数据,接收事件的API是什么?

一个简单的示例代码将完全帮助我! (请不要参考Google的蓝牙聊天示例,他们使用的设计模式我还不熟悉。)

1 个答案:

答案 0 :(得分:1)

好的,我会尝试尽可能简单地解释事情。

我们假设您使用RFCOMM频道进行两个Android设备之间的通信。

一台设备将充当服务器,另一台设备将充当客户端

服务器端:

  • 首先您需要使用以下行将您的应用程序注册到蓝牙堆栈:
  

public BluetoothServerSocket listenUsingRfcommWithServiceRecord(String name,UUID uuid)

其中name是您的应用服务名称(选择任意),而uuid也是您选择的java.util.UUIDhere you have an online generator)。 不要忘记UUID

  • 第二次,您必须启动蓝牙服务器 以下行:
  

public BluetoothSocket accept(); //添加超时参数的可能性

注意:这是一个阻塞调用,这意味着运行此代码的线程将阻塞并等待方法accept()返回。它仅在客户端应用程序连接到服务器应用程序时返回。如果您想要永久阻止(或者只要您的应用程序正在运行),请使用timeout参数。由于它是阻止调用,不在您的UI线程上调用,因此会导致 ANR Application Not Responding)。而是使用Thread

客户端:

有两种情况:您的Android设备是配对的,要么不是。 最简单的方法是通过“设置”手动配对两台设备,但除非您希望获得完美的应用用户体验,否则请使用the discovery & binding operation

现在连接到服务器:

  • 首先解析您的已绑定设备列表(使用 getBondedDevices())并找到您要连接的设备。 在您执行发现的情况下绑定操作,保持 跟踪用户选择配对的设备。那将是 您要连接的设备。
  • 第二,使用以下行建立联系:
  

public BluetoothSocket createRfcommSocketToServiceRecord(UUID uuid);

     

public void connect(); //来自返回的BluetoothSocket

UUID 是您在服务器应用程序中使用的那个。 注意:再次,connect()是阻塞调用,但由于存在内部超时参数,因此不会永久阻止。 从另一个主题调用它。

  • 第三次,一旦在您的两个设备之间建立连接, 正是在您的两个应用程序之间,您可以检索 来自BluetoothSocket outputStream inputStream (服务器和客户端都获得套接字)。
  • 最后,您现在可以使用这些流从/向您的客户端应用程序发送数据或从/向您的服务器接收数据。你可以发送 只要您正确转换它们,就可以使用字符串,整数或其他任何内容 到字节并转换回原始值。

了解Stream和Bytes的指南:http://fr.slideshare.net/shahjahan786/understanding-java-streams

那就是它。您可以使用所有基本元素在您的应用上工作,并在两个设备之间建立蓝牙连接,以便您可以交换数据。