我当前的目标是向 MacBook Pro 上运行的蓝牙服务添加 SDP 记录,以便我可以将该服务通告给其他蓝牙设备。理想情况下,我想用 Python 来完成这个任务。
此时,我已在 BlueZ 蓝牙堆栈下的 Linux 上成功创建、添加和发布 SDP 记录,但是,在 MacOS 上使用类似的过程时遇到了一些麻烦。
经过一番研究,我的理解是,在 MacOS 上与蓝牙 API 交互需要使用IOBluetooth Objective-C 框架,这可以在 Python 中通过pyobjc来完成。顺便说一句,我也了解 CoreBluetooth 框架的存在,但是,该框架的功能并不合适,因为它缺乏 SDP 记录添加/删除功能。
我目前正在处理两个问题:
1. 创建适用于MacOS的SDP记录
MacOS 使用 PLIST 格式加载/指定 SDP 记录。我有一个 XML 格式的现有记录,可由 BlueZ 加载。是否可以将此记录转换为 PLIST 格式,还是我应该考虑从头开始重写该记录?
2.通过pyobjc添加SDP记录
我可以通过 pyobjc/IOBluetooth 交互/查询基本蓝牙功能。当我尝试使用 IOBluetoothSDPServiceRecord 类时出现问题。从我在其他地方看到的一些示例(这里有一个示例)来看,这个类似乎是您用来添加新记录的类?当我尝试加载/使用此类时,我无法访问它的任何功能。
如果对于那些熟悉 Objective-C 的人来说这似乎是一个微不足道的/或业余的问题,我提前道歉!Python 是我的专长所在,因此与这种语言的交互有点超出了我的能力范围。
我还将在下面提供我一直在做的事情的最小工作示例:
IOBluetooth.py
import objc as _objc
_objc.loadBundle('IOBluetooth', globals(),\
bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')
bluetooth_test.py
from IOBluetooth import *
sdp = None
with open("record.plist", "r") as f:
sdp = f.read()
# This functions correctly
devs = IOBluetoothDevice.recentDevices_(0)
print(devs[0].getNameOrAddress())
# This does not
sdp_sr = IOBluetoothSDPServiceRecord.alloc().init()
sdp_sr.publishedServiceRecord(sdp)
bluetooth_test.py 的输出
Apple Watch
Traceback (most recent call last):
File "bluetooth_test.py", line 12, in <module>
sdp_sr.publishedServiceRecord(sdp)
AttributeError: 'IOBluetoothSDPServiceRecord' object has no attribute 'publishedServiceRecord'
任何对此的意见将不胜感激!
FFIVE
相关分类