swift - IOBluetooth 的问题
问题描述
我对下面列出的 IOBluetooth 框架有一些疑问。
我目前有一台运行 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 的笔记本电脑有问题?
我试图从我的第一台笔记本电脑打开 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
解决方案
关于第二点,我修复了代码并粘贴在下面。问题在于 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
推荐阅读
- node.js - 从 nodejs 服务器流式传输复杂数组作为对 http post 的响应
- angular - Angular 7 路由路径打开源图
- java - 来自 ManyToOne 惰性关系的实体未加载到不同的类中
- c# - 在 ASP.NET Core 3.1 中,如何在未来的特定日期和时间安排具有托管服务的后台任务(Cron 作业)?
- firebase - 无效的`Podfile`文件:无效的`RNFBDatabase.podspec`文件:没有这样的文件或目录@ rb_sysopen - ../app/package.json - 反应原生
- mysql - 根据引用同一表的视图从表中删除行
- python - 如何在odoo中编写原始sql查询
- scala - Scala Spark 根据另一列中值的聚合计数在数据框中创建一个新列
- sql - Azure 数据工厂中的复制数据活动后更新
- java - 如何使用 Spring 集成流处理异常