如何使用 Python 将 SDP 记录添加到 MacOS?

我当前的目标是向 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'

任何对此的意见将不胜感激!


慕森卡
浏览 120回答 1
1回答

FFIVE

经过更多研究后,我找到了答案。对于那些碰巧正在从事类似工作的人,我将发布我如何解决这个问题:回答问题1经过一番搜索后,我认为最好手动重写现有的 XML SDP 记录。我找不到任何实用程序可以处理 16 位蓝牙 UUID 从 XML 到 PLIST 格式的转换。回答问题2上面的IOBluetooth.py文件与我的问题没有变化。bluetooth_test.pyfrom IOBluetooth import *from Cocoa import NSDictionaryimport timeplist = NSDictionary.dictionaryWithContentsOfFile_("service.plist")sdp_sr = IOBluetoothSDPServiceRecord.publishedServiceRecordWithDictionary_(plist)time.sleep(10)sdp_sr.removeServiceRecord()print("Removed Service Record")真正有助于探索 IOBluetooth API 的是使用dir()Python 中的函数。实际上,您可以向其扔一个 pyobjc 实例或类,您将收到所有可用方法的列表。希望这对将来的人有帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python