android - Android 与其他设备之间的蓝牙 SPP、UUID 和 PIN 问题

标签 android bluetooth serial-port

我正在尝试实现一个 Android 应用程序来接收来自医疗设备的数据,但 我无法通过发现过程并让手机和设备相互配对或连接。

描述医疗设备: 该设备正在使用服务发现协议(protocol) (SDP) 和串行端口配置文件 (SPP)。 它启动查询程序以发现(最多 10 个)具有匹配 COD 过滤器和服务名称的周围接入点。然后它通过检查 PIN 顺序地与接入点建立连接(使用 Page Procedure)。匹配 PIN 后,将上传数据。上传数据后,设备等待确认。设备是主设备并启动通信。

我无法控制医疗设备。我所能做的就是启动它并等待上述过程(测量后)。

Android 应用程序: 我从 Bluetooth Chat Example 开始在开发者页面上。到目前为止,我已将 UUID 替换为 00001101-0000-1000-8000-00805f9b34fb 以使用 SPP 并将服务名称设置为适当的名称。我可以通过从计算机检查服务来确认这似乎是正确的。由于医疗设备是查询和发起通信的设备,因此我的服务使用 BluetoothServerSocketaccept() 方法开始监听它。

  1. 在开发人员页面中,我读到 UUID 必须在尝试通信的应用程序之间匹配。由于我无法为医疗设备设置任何 UUID,我想知道这是否会成为问题,或者医疗设备使用 SP 配置文件是否足够?

  2. 如果服务名称和 UUID 正确,并且医疗设备实际上会尝试连接到正在监听连接的蓝牙服务,Android 系统会提示我手动输入 PIN 以便能够配对设备(因为医疗设备有预设 PIN)?

  3. 我在 Android SDK API 中没有找到任何可以让我为我的蓝牙服务设置 PIN 的东西(以防它失败),这可能吗?

我了解到,现在通常 PIN 码是由系统生成的,而用户确认是唯一需要的。我想不在我的系统中,因为设备有点旧。

如果您愿意分享一些与我上面描述的内容相关的知识、提示和猜测,我将非常感激!

提前致谢, 弗雷德里克


编辑:

现在我已经将设备与 bluegiga 盒子配对,它们可以正常通信。现在我正在寻找血压设备连接到我手机的标准。我可以从 Linux 计算机(终端中的 sdptool search SP)检查 bluegiga 提供的蓝牙服务,并将其与我在 Android 上提供的蓝牙服务进行比较.这些值是我得到的:

~$ sdptool search SP

Inquiring ...

Searching for SP on 8C:71:F8:E5:XX:XX . . .

Service Name: 1808130054

Service RecHandle: 0x10003

Service Class ID List:

UUID 128: 00001101-0000-1000-8000-00805f9b34fb

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 13

´

Seaching for SP on 00:07:80:88:XX:XX . . .

Service Name: 1808130054

Service Description: 1808130054

Service RecHandle: 0x10005

Service Class ID List:

"Serial Port" (0x1101)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 12

Language Base Attr List:

code_ISO639: 0x656e

enconding: 0x6a

base_offset: 0x100

找到的第一个设备是手机 (mac=8C:71...Google Nexus S),第二个 (mac=00:07...) 是 bluegiga。我注意到 Android 设备上没有服务描述。我认为最重要的区别在于服务类 ID 列表。 Android 上的 UUID 128 但在 bluegiga 上描述的格式完全不同。

  1. 是否可以在 Android 上使用除 UUID 之外的其他格式的服务类 ID 来实现?

  2. 你能操作在服务发现数据库中注册的服务记录吗?

  3. 是否有可能以某种方式直接实现BlueZ,使用 native 开发c/c++?

/弗雷德里克

最佳答案

如果您可以提供医疗设备的名称/链接(如果它是商业设备),则阅读其指南可能有助于更多地猜测可能发生的情况。 以下是一些建议:

  1. 除了串行端口 UUID 之外,SPP 上的每个服务都可以有一个自定义的特定 UUID - 例如,医疗设备可以使用这个自定义的特定 UUID 查找与其兼容的服务。
    如果医疗设备当前成功连接到 PC 或其他接入点并传输数据,您可以尝试读取该设备的 SDP 记录并确定除了 SPP UUID 之外还使用了哪个特定 UUID(如果有),并使用在您的应用程序中也一样。

  2. 如果医疗设备无法找到您的手机/应用程序,可能是因为它无法被发现。 Android 设备默认是不可发现的,即使你是服务器,也只能连接不可发现,你可以尝试通过程序或设置让它可发现,看看医疗设备是否能找到你的设备。 见这里 - Enabling Discoverability in Android

  3. 对于PIN配对,安卓设备应在未配对的设备尝试连接时启动配对过程,您可以在通过建议(1)和(2)后进行尝试, 如果其中一个设备的版本早于蓝牙 2.1 版本,则使用 PIN 配对,即使是较新的设备,也需要在电话上进行一些用户干预/确认的 6 位密码才能进行配对(这只是一个很好的安全策略不允许这种情况在没有用户干预的情况下自动发生),希望配对仅在第一次发生连接时需要,以后不需要任何用户干预来进行后续连接。

关于android - Android 与其他设备之间的蓝牙 SPP、UUID 和 PIN 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5263144/

相关文章:

java - 是否可以在谷歌地图上识别最近的街道?

android - android :layout_gravity and android:gravity之间的区别

ios - CBConcreteCentralManager 未开机错误

linux - Linux 下的 FTDI TTL

android - android智能手机3.5mm音频口RS232串口信号输入(android开发)

java - 在Java应用程序中通过RxTx从两个串行端口并发读取的问题

Android NDK 加载库 ("KERNEL32.DLL")

android - 在网络/移动应用程序中使用 OAuth/OpenID

ios - 如何设置 Linux BlueZ 5 连接参数以实现 Apple iOS 兼容性

windows - 微软低功耗蓝牙广告