为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2023-12-29 16:33:23
我当前的目标是向 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 实例或类,您将收到所有可用方法的列表。


希望这对将来的人有帮助!


查看完整回答
反对 回复 2023-12-29
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信