我当前的目标是向 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.pyimport objc as _objc_objc.loadBundle('IOBluetooth', globals(),\ bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')bluetooth_test.pyfrom IOBluetooth import *sdp = Nonewith open("record.plist", "r") as f: sdp = f.read()# This functions correctlydevs = IOBluetoothDevice.recentDevices_(0)print(devs[0].getNameOrAddress())# This does notsdp_sr = IOBluetoothSDPServiceRecord.alloc().init()sdp_sr.publishedServiceRecord(sdp)bluetooth_test.py 的输出Apple WatchTraceback (most recent call last): File "bluetooth_test.py", line 12, in <module> sdp_sr.publishedServiceRecord(sdp)AttributeError: 'IOBluetoothSDPServiceRecord' object has no attribute 'publishedServiceRecord'任何对此的意见将不胜感激!
1 回答
FFIVE
TA贡献1797条经验 获得超6个赞
经过更多研究后,我找到了答案。对于那些碰巧正在从事类似工作的人,我将发布我如何解决这个问题:
回答问题1
经过一番搜索后,我认为最好手动重写现有的 XML SDP 记录。我找不到任何实用程序可以处理 16 位蓝牙 UUID 从 XML 到 PLIST 格式的转换。
回答问题2
上面的IOBluetooth.py
文件与我的问题没有变化。
bluetooth_test.py
from IOBluetooth import *
from Cocoa import NSDictionary
import time
plist = NSDictionary.dictionaryWithContentsOfFile_("service.plist")
sdp_sr = IOBluetoothSDPServiceRecord.publishedServiceRecordWithDictionary_(plist)
time.sleep(10)
sdp_sr.removeServiceRecord()
print("Removed Service Record")
真正有助于探索 IOBluetooth API 的是使用dir()Python 中的函数。实际上,您可以向其扔一个 pyobjc 实例或类,您将收到所有可用方法的列表。
希望这对将来的人有帮助!
添加回答
举报
0/150
提交
取消