首页 > 解决方案 > IOBluetooth 的问题

问题描述

我对下面列出的 IOBluetooth 框架有一些疑问。

  1. 我目前有一台运行 Big Sur v11.1 的 MacBook Pro(13 英寸,2018 年),当我打电话询问并尝试查找附近的设备时,它经常失败并且无法持续工作。另一方面,我有第二台运行 Mojave v10.14.6 的 MacBook Pro(13 英寸,2015 年),它具有完全相同的功能并且每次都能正常工作。我也一直在使用 blueutil 命令行工具进行测试:https ://github.com/toy/blueutil以及 PyBluez:https ://github.com/pybluez/pybluez并发现我的第二台运行 Mojave 的 MacBook 总是能找到附近的设备而运行 Big Sur 的 MacBook 则遇到了麻烦。你知道这是因为框架的潜在更新还是我运行 Big Sur 的笔记本电脑有问题?

  2. 我试图从我的第一台笔记本电脑打开 L2CAPChannel 到第二台笔记本电脑,反之亦然,但在 IOBluetoothDevice 对象(我已正确实例化)上调用 openL2CAPChannelSync 似乎永远不会返回 kIOReturnSuccess。我在这里也做错了吗?我附上了我在下面使用的代码片段(在其中我删除了我的其他设备的地址字符串)。

import IOBluetooth
import PlaygroundSupport

class ChannelDelegate : IOBluetoothL2CAPChannelDelegate {

    func l2capChannelOpenComplete(_ l2capChannel: IOBluetoothL2CAPChannel!, status error: IOReturn) {
        print("Channel Opened!")
    }

}

var remoteDevice = IOBluetoothDevice(addressString: ***deviceString***)
print((remoteDevice?.name ?? "nil") as String)

remoteDevice?.openConnection()
var connection = remoteDevice?.isConnected()
print(connection!)

var channelPtr: AutoreleasingUnsafeMutablePointer<IOBluetoothL2CAPChannel?>?
var success = remoteDevice?.openL2CAPChannelSync(channelPtr, withPSM: 0x0000, delegate: ChannelDelegate())
print(success == kIOReturnSuccess)

PlaygroundPage.current.needsIndefiniteExecution = true

标签: swiftmacosbluetoothpyblueziobluetooth

解决方案


关于第二点,我修复了代码并粘贴在下面。问题在于 Apple 的文档指出该对象是使用函数调用实例化的,openL2CAPChannelSync但事实并非如此。您需要先实例化对象,然后将引用传递给您实例化的对象。希望这可以为人们节省一些时间,因为 IOBluetooth API 上的示例很少。

import IOBluetooth
import PlaygroundSupport

class ChannelDelegate : IOBluetoothL2CAPChannelDelegate {

    func l2capChannelOpenComplete(_ l2capChannel: IOBluetoothL2CAPChannel!, status error: IOReturn) {
        print("Channel Opened!")
    }

}

var remoteDevice = IOBluetoothDevice(addressString: ***deviceString***)
print((remoteDevice?.name ?? "nil") as String)

remoteDevice?.openConnection()
var connection = remoteDevice?.isConnected()
print(connection!)

var channel: IOBluetoothL2CAPChannel? = IOBluetoothL2CAPChannel()
var success = remoteDevice?.openL2CAPChannelSync(&channel, withPSM: 0x0000, delegate: ChannelDelegate())
print(success == kIOReturnSuccess)

PlaygroundPage.current.needsIndefiniteExecution = true

推荐阅读