简短的回答是,可以不配对使用蓝牙。但是,它仍然始终是点对点链接。不使用配对也存在潜在的问题(主要是缺乏安全性以及缺乏对这种操作模式的良好支持)。是否可以完成取决于接收器的蓝牙硬件。我假设您使用的是“标准”蓝牙,而不是低功耗蓝牙(这是完全不同的,并且在移动电话中并不是特别受支持)。如果您使用的是低能耗,那么您的发送器将是低能耗的设备,而您的接收器将是侦听消息的对象。我没有使用过,所以我无法提供任何信息,因此我将坚持使用“普通”蓝牙。
如我所见,有两个问题需要克服:
关闭引脚配对
自动启动连接
首先,我将介绍2号,因为我得到的印象是这是您真正感兴趣的(如果我读错了,很抱歉)。为了通过电话或其他“主”设备执行此操作,必须连续搜索远程蓝牙设备。当它识别出一个合适的设备时,它将自动连接到它并发送一些数据或其他数据来启动所需的任何操作。其他人提到在此过程中使用了蓝牙友好名称,这无疑是做到这一点的一种方法。我对Bluetooth友好名称(特别是但不限于Microsoft Bluetooth堆栈)的经验是,它们不是一种健壮的扫描方法。使用蓝牙设备类可能会做得更好,它与唯一设备地址同时广播。该设备类别具有大量针对手机,笔记本电脑,台式机等的预定条目。如果您使用一种非标准设备类别(例如00:00:00),则可以立即进行操作过滤掉绝大多数蓝牙设备。然后,您可以连接到其余设备,并进行某种请求确认通信以启动操作。如果您使它变得晦涩难懂(或将友好名称作为第二个考虑因素),则它应隐式过滤掉所有剩余的不正确设备。
关于数字1,如果要创建瞬态连接,则引脚配对并不是特别合乎逻辑,但它仍然可能是实现所需功能的最佳方法。如果要避免引脚配对,可以将其关闭并建立未配对的连接。如何执行此操作取决于蓝牙接收器的实现,但以下是一些示例:
- Bluegiga WT12:使用命令SET BT AUTH *
- 美国国家半导体LMX9838:在安全模式1下使用GAP_SET_SECURITY_MODE命令(无配对)
等等
然后无需配对即可连接到设备。如果启动连接的设备与接收器相同,则非常简单。如果您使用的是Windows PC,则可以进行繁琐的创建新连接过程并选择“不要使用大头针”,尽管Windows在连接时可能仍会要求您提供大头针(通常可以使用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堆栈的包装,因此您始终可以直接调用低级函数)。因此,当您找到具有正确设备类别的设备时,为什么不仅仅自动配对(具有预定义的配对插针编号),建立连接,发送所需的数据,断开连接然后取消配对。这一切都不需要用户干预,只要您不做数千次(可能会导致EEPROM磨损的问题),就不会给您带来任何问题。尝试使不同的API与被认为是使用蓝牙的非标准方法很好地配合使用时,也将为您节省很多麻烦。