如何在 Cordova 应用程序中使用 iPhone 上的蓝牙?

Posted

技术标签:

【中文标题】如何在 Cordova 应用程序中使用 iPhone 上的蓝牙?【英文标题】:How to use Bluetooth on iPhone in Cordova application? 【发布时间】:2016-07-19 13:34:39 【问题描述】:

我正在开发一个移动应用程序(iosandroid),它通过蓝牙与运行 Linux 的基于 arm 的嵌入式设备进行通信。通信是客户端-服务器。电话(客户端)与设备配对,连接到设备并发送查询。设备回复这些查询。

我决定使用 Cordova(和 Ionic 框架)进行移动开发。安卓部分就完成了。对于通信,我使用的是 BluetoothSerial 插件 (https://github.com/don/BluetoothSerial)。

设备上的服务器部分基于本教程:https://people.csail.mit.edu/albert/bluez-intro/x502.html#rfcomm-server.c

最近我购买了 iPhone SE,我想定位 iOS。除蓝牙通信外,一切正常。

如果我理解正确的话,iPhone 上的蓝牙通信仅限于蓝牙智能(或蓝牙低功耗/BLE)。我正在使用的 BluetoothSerial 插件能够在 iOS 上与数量非常有限的设备进行通信。

所以我的问题是:

    是否可以在 iOS 上提供完整的蓝牙支持?完整是指类似于聊天的通信,其中客户端(电话)正在发送一些结构化数据,而设备也在以文本形式回复一些结构化数据。

    如果是这样,我可以使用 BluetoothSerial 插件吗?我还找到了 Cordova 的 BLE 插件,但它们似乎对蓝牙通信的支持非常有限(从我的角度来看)。它们只是用于在 BLE 设备上获取或写入一些广告特性。

    https://github.com/don/cordova-plugin-ble-central, https://github.com/randdusing/cordova-plugin-bluetoothle)

    如果我必须使用基于 BLE 的解决方案,我认为我还必须在设备上重写服务器代码。我说的对吗?

感谢您提供任何提示、建议或解决方案。

【问题讨论】:

我认为您需要为此编写插件。 Cordova 并不是一个很好的框架。您应该在本机中完成所有这些操作。 @KunalBalani 是的,我知道我必须使用插件才能与硬件通信,这正是我在 Android 案例中所做的 - 我正在使用 BluetoothSerial。我的问题是这在 iOS 上是否可行(100% 本机应用程序或 Cordova 插件)。如果是这样,使用什么插件/库/框架。 Stepan,您能否提供更新。我只是尝试使用 BLE Central 插件向/从 Arduino 板发送/接收几个字节。我可以让 iOS 连接到我的设备,我可以读取它的特性,但我很难发送/接收数据。很高兴在这篇文章之外进行讨论 @frednikgohar 我放弃了将应用程序移植到 iOS,因为数据吞吐量至关重要(我正在发送图像和相当多的 JSON 数据块)。在接下来的几周里,我将开始实现另一个应用程序,用于与自定义的基于 ARM 的 Linux 设备在一侧和电话的另一侧进行通信。嵌入式设备将运行具有多种读写特性的 BLE 信标。一旦我至少有一些概念证明,我可能会让你知道。很可能,如果我有时间,我会在博客上讨论这个。 【参考方案1】:

在这种情况下,手机和设备之间使用蓝牙进行通信有两种选择。

    电话 --- RFCOMM over Legacy Bluetooth ------- 设备实现(串行端口配置文件)SPP 服务器

    电话 --- GATT over Bluetooth Low Energy (BLE)---- 实现自定义 GATT 服务的设备。 BLE 上没有标准的 SPP GATT 服务。

Serial plugin 支持 Android 的选项 1 和 iOS 的选项 2。

因此,您的 Android 应用通过 Serial 插件使用选项 1 连接到运行 RFCOMM server 的设备。 要为 iOS 使用选项 1,我认为设备需要通过 MFi program。 串行插件不支持 iOS 的选项 1。

对于选项 2: 串行插件支持 iOS 的选项 2,但不支持 Android。 https://github.com/don/cordova-plugin-ble-central,支持 Android 和 iOS 的选项 2。 设备现在需要实现模拟串行端口的 GATT 服务。

回答您的问题

    我认为对于 iOS 上传统蓝牙上的 SPP 配置文件,设备需要兼容 MFi。

    https://github.com/don/cordova-plugin-ble-central 和 https://github.com/randdusing/cordova-plugin-bluetoothle 支持 Android 和 iOS 的选项 2。 设备需要实现 GATT 服务。手机和设备之间的通信方式是读取和/或写入 GATT 服务器上的特征。

    是的,设备现在必须实现 GATT 服务。它目前实现了一个 RFCOMM 服务。

【讨论】:

感谢您的回复!现在看来我不得不依赖 BLE/GATT 解决方案,因为 MFi 认证是不现实的场景。我有点担心连接速度。例如,在 Android 和 RFCOMM 上,我以 15fps 传输小图像 (10KB)。我想这将不再可能:***.com/questions/10254048/… 如果设备和手机支持 LE 4.1,则 l2cap 层的最大理论数据速率约为 305kbits/sec。在应用层,它会低得多。 LE 4.2 引入了更高的数据速率。【参考方案2】:

我认为你想做的事情是可能的:

    iOS 具有完整的蓝牙支持。低功耗蓝牙是一种补充,而不是替代。完全是指它支持蓝牙协议栈中某个级别的所有功能,但您的问题有点不同;您还询问是否有适用于您的用例的配置文件。关于 iOS 的另一件事是有 2 个蓝牙库:核心蓝牙 (BLE) 和 IOBluetooth(传统蓝牙)。 BluetoothSerial 是一种 BLE 实现。请务必使用核心蓝牙。除此之外,我不明白为什么它不应该工作。 我对您实际使用了什么以及如何使其工作感到有些困惑。 BluetoothSerial 是一个 BLE 解决方案(这就是文档所说的),但您参考了一个使用 RFCOMM 的教程,RFCOMM 是蓝牙经典协议。在任何情况下,您都必须选择使用 BLE 的 BluetoothSerial 或 Bluetooth classic 和 RFCOMM。

【讨论】:

您好,感谢您的回复。 BluetoothSerial 不是严格的 BLE 解决方案。这个插件实际上在 Android 上使用 Bluetooth Classic,在 iOS 上使用 BLE。到目前为止,我只有 Android 解决方案,我正在寻找适用于 iOS 的类似解决方案。 我明白了,它是仅适用于 iOS 上的 BLE 的 BluetoothSerial 代码。应该可以将其移植到 iOS 上的经典蓝牙。除非它需要某些在该平台上受限的功能,有时就是这种情况。您可以使用 Android 代码作为参考,看看是否所有需要的功能都可用。 好吧,但如果我理解正确的话,如果您想使用 iPhone 和蓝牙经典设备与设备通信,您的设备应该通过 Apple MFi 程序的认证。否则你只能使用 BLE。 我没有意识到这一点,但这有点道理。查了一下,实际情况是标准配置文件不需要MFi,但除此之外还需要。

以上是关于如何在 Cordova 应用程序中使用 iPhone 上的蓝牙?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Apple Watch 应用的情况下使用 cordova 在 Apple Watch 上获取 iPhone 应用的推送通知?

如何使用'cordova build ios --release'部署(创建.ipa)iphone应用程序?

如何使用 cordova 1.5 和 xcode 4.2 创建“Hello World”iPhone 应用程序?

Cordova 3.5.0 中的 iPhone 屏幕方向没有改变

在ios应用程序中更改位置iPhone时如何旋转照片[关闭]

如何在 Cordova 中显示照片库权限对话框?