【问题标题】:android bluetooth implementation basicsandroid蓝牙实现基础
【发布时间】:2013-05-04 08:44:39
【问题描述】:

谁能用简单的话解释一下android蓝牙示例中对UUID的需求。我已经阅读了一些关于它的文章,但仍然不清楚 UUID 的确切需求。 现在让我向您解释我想要开发的场景: 我想开发一个 android 应用程序来传输数据,例如“扩展名为 .xyz 的文件” 通过蓝牙从我的手机到另一部手机。接收电话完全不需要我正在使用的应用程序。我只想将数据从我的应用程序传输到其他手机,仅此而已。我不在乎接收者对数据做了什么。 我只想连接到范围内的设备并使用我的应用程序传输该文件 现在我应该怎么做? UUID 的作用从何而来?我已经读过 UUID 是为我的应用程序,服务器和接收器都应该知道这个 UUID 形成一个连接。但是如果接收方没有我的应用程序怎么办?它肯定不知道我的 Applications UUID 吗?那么如何进行数据传输呢?我只是想使用蓝牙而不涉及特定的应用程序。 在这里,我的应用程序应该做什么?它应该创建服务器套接字/客户端套接字还是什么?以及为什么。

感谢简单的解释(如果可能,请提供一些文章)。我不希望有 BluetoothChat 建议的常规答案。如果您不明白这个问题,请告诉我,我会尝试更具体并为您详细说明。 这个问题的基本目标是澄清 UUID 的使用以及使用蓝牙从运行在一个 Android 手机上的应用程序在两个设备(而不是应用程序)之间传输数据。

【问题讨论】:

    标签: android bluetooth


    【解决方案1】:

    即使使用蓝牙,您也可以创建客户端-服务器应用程序.. 有一个 BluetoothSocket 阅读这里http://developer.android.com/reference/android/bluetooth/BluetoothSocket.html

    现在,假设您有两个设备:

    1. 设备 A
    2. 设备 B

    假设设备A向设备B发送数据,你没有说设备B是否也在向设备A发送数据,所以我只描述A向B发送数据的第一种情况。

    所以在这种情况下,由于所有数据都存储在设备 A 中,并且您希望将其发送到设备 B,因此将设备 A 创建为 BluetoothServer 并将设备 B 创建为侦听服务器的 BluetoothClient 会更合理。

    但是.. 如果您希望两台设备都交换数据.. 您可以将其中一台作为服务器 并为每个人创建 2 个线程:

    1. 发送数据的线程
    2. 监听数据的线程

    所以他们两个可以交换数据..

    另一件事.. 如果您曾经编写过常规客户端服务器,您会注意到accept() 方法会阻塞,直到有客户端连接到服务器.. 蓝牙客户端-服务器应用程序也是如此。

    总结:

    1. 一个设备将充当服务器 - 因此您需要编写一个服务器项目并进行安装
      它在第一台设备上

    2. 第二个设备将充当客户端 - 因此您需要编写一个客户端项目并 在第二台设备上安装它

    3. 不要忘记在清单文件中为两者添加蓝牙权限
      项目。

    4. 这两个项目都需要与您在问题中提到的相同的 UUID。 简而言之,双方都需要 UUID,所以他们每个人都知道他们是谁 交流 我认为它更像是常规客户端服务器中的端口.. 我在某处读到了用于 RFC 通信的内容。您可能知道有
      一些蓝牙协议,如 RFC、SDP 等。

    编辑: 在大多数手机中,当您想通过它发送数据时,都有一个配对过程 蓝牙。所以如果你不想使用客户端服务器版本,我想你可以 这样做:

    1. 您的应用程序将搜索要连接的设备。 (配对过程)
    2. 配对后,您将连接到另一台设备并发送数据

    编辑 2: 您想将数据从 A 发送到 B 对吗? 我会解释得更清楚..

    当您说客户端应该知道谁是服务器并且需要插入端口和 服务器的 IP 这是正确的,并且以这种方式工作。

    现在,看看..

    当连接建立通信时,服务器侦听来自客户端的连接 开始。

    1. 客户要求数据
    2. 服务器处理客户端请求并将相关数据发送给他

      所以任何数据,如:文件、数据库都应该存储在服务器端..

      现在,在您的情况下,您要发送的文件位于设备 A 而不是设备 B, 因此,如果设备 A 是服务器,他将侦听连接.. 当设备 B 连接到服务器时 (设备 A) 通信开始.. 设备 B 可以向设备 A 请求文件.. 此外,由于设备 A 是服务器,他甚至可以广播消息.. 意味着发送相同的消息 对于所有连接到他的客户。

      但是你想要做的是发送文件,即使设备 b 没有要求它,对吧? 我不明白您是否希望设备 B 也将文件发送到设备 A,所以让我们分开吧
      进入场景:

    3. 只是设备 A 发送到 B: 在这种情况下,由于文件位于设备 A 中,意味着设备 A 有数据, 设备 A 是服务器,设备 B 是客户端。 因此,当连接建立后,您可以从 A 发送到 B。

    4. 两个设备交换数据: 在这种情况下,两个设备都应该互相监听,但只有其中一个应该行动 作为服务器,另一个作为客户端。意味着你需要在上面安装serverApp 其中一个和另一个客户端应用程序。 但是他们每个人都可以发送和收听其他人。所以对于你需要创建的每个 处理发送数据的线程和处理接收数据的另一个线程

    【讨论】:

    • 所以我的问题是如果我们明天第一次见面并且我的应用程序在我的设备上运行并且(显然你不会在你的设备上运行它)并且我想发送那个“.xyz”用蓝牙文件给你,我不能发送?
    • 如果您的手机上有我的申请,我才能发送?
    • 暂时,只有我想使用我的应用程序向您发送数据,而您(您的手机)不知道我正在使用什么应用程序以及要发送什么数据?这可能吗?
    • 不,我不认为它会起作用.. 但也许你可以做一个配对,这样你的应用就会搜索有蓝牙的设备并要求连接它们然后发送数据
    • 不客气,看看那些用于配对设备的链接*.com/questions/14228289/…*.com/questions/4989902/…
    【解决方案2】:

    UUID 是通用唯一标识符。当您想连接到蓝牙公开的任何服务时,您应该有 UUID 告诉蓝牙软件模块它必须启动与此特定服务的连接。在您的情况下,为了将文件从 DevA 发送到 DevB,它必须使用文件传输配置文件,并且有一个与此相关的特定 uuid,这是由蓝牙 SIG 定义的,它是认证蓝牙产品并致力于该技术的权威机构。所有使用蓝牙的设备都知道这一点。

    简而言之,当 DevB 收到带有唯一 uuid 的传入连接请求时,它会知道设备正在尝试连接到 DevB 的哪个特定服务并连接到该服务。因此,如果您想将文件从 DevA 发送到 DevB,那么您不需要在 DevB 拥有相同的应用程序。但您需要确保使用蓝牙 SIG 为文件传输配置文件指定的 UUID。

    问候, 什里帕蒂

    【讨论】: