简短的回答是肯定的,可以在不配对的情况下使用蓝牙。但是,它仍将始终是点对点链接。不使用配对也存在潜在的问题(主要是缺乏安全性和对这种操作模式缺乏良好的支持)。能不能做到取决于你的接收器的蓝牙硬件。我假设您使用的是“标准”蓝牙而不是低功耗蓝牙(这是完全不同的,并且在手机中不是特别支持)。如果您使用的是低能耗,那么您的发射器将是一个低能耗设备,而您的接收器将是侦听消息的东西。我没有用过这个,所以我不能给你任何关于这个的信息,所以我会坚持使用“普通”蓝牙。
在我看来,有两个问题需要克服:
关闭引脚配对
自动连接启动
我将首先介绍第 2 点,因为我觉得这是您真正感兴趣的内容(如果我读错了,请道歉)。为了从电话或其他“主”设备执行此操作,它必须不断搜索远程蓝牙设备。当它识别出一个适用的,它会自动连接到它并发送一些数据或其他数据,以启动所需的任何操作。其他人已经提到在此过程中使用蓝牙友好名称,这当然是一种方法。我对蓝牙友好名称(尤其是但不仅限于 Microsoft 蓝牙堆栈)的经验是,它们不是一种强大的扫描方法。使用蓝牙设备类可能会做得更好,与唯一设备地址同时广播。此设备类有大量预先指定的条目,用于移动电话、笔记本电脑、台式机等。如果您使用非标准设备类之一(例如 00:00:00),您将立即能够过滤掉绝大多数蓝牙设备。然后,您可以连接到剩余的设备并进行某种请求-确认通信以启动您的操作。如果您将此适当地模糊(或检查友好名称作为第二个考虑因素),它应该隐式过滤掉任何剩余的不正确设备。
关于第 1 点,如果您正在创建瞬态连接,引脚配对并不是特别合乎逻辑,但它仍然可能是实现您想要做的最佳方式。如果要避免引脚配对,可以将其关闭并进行未配对连接。你如何做到这一点取决于蓝牙接收器的实现,但这里有几个例子:
- Bluegiga WT12:使用命令 SET BT AUTH *
- National Semiconductor LMX9838:使用 GAP_SET_SECURITY_MODE 命令和安全模式 1(无配对)
等等。
然后可以在不配对的情况下连接到设备。如果发起连接的设备与接收方相同,这很简单。如果您使用的是 Windows PC,则可以通过费力的创建新连接过程并选择“不使用 pin”,尽管 Windows 可能仍会在您连接时要求您输入 pin(0000 通常有效,但这是非常片状的)。如果您将 python 与 pybluez 一起使用,则非常简单:
import bluetooth
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((<insert MAC address>, <insert port number>))
但是,如果您想通过手机进行连接,则要复杂得多。Android SDK 似乎并不真正支持非配对连接:
当前的 Android 蓝牙 API 要求设备在建立 RFCOMM 连接之前进行配对。(当您启动与蓝牙 API 的加密连接时,会自动执行配对。)
(来自http://developer.android.com/guide/topics/connectivity/bluetooth.html)。有一些方法可以解决这个问题,但是它们非常复杂并且没有得到很好的支持。如果您使用的是 iPhone,那么蓝牙连接是一个完全不同的蠕虫罐(许可等),所以我现在暂且不谈。
说了这么多,我看过的几乎每个 API 都允许配对和取消配对(python/pybluez 除外,但这只是 Windows 上 Microsoft 堆栈的包装,因此您始终可以直接调用低级函数)。因此,当您发现具有正确设备类别的设备时,为什么不自动配对(使用预定义的配对 pin 号)、建立连接、发送所需的数据、断开连接然后取消配对。这一切都不需要任何用户干预,只要您不这样做数千次(这可能会导致 EEPROM 磨损问题),它不应该给您带来任何问题。它还可以为您省去很多麻烦,让您尝试让不同的 API 与被认为是使用蓝牙的非标准方法很好地协同工作。