问题描述
我目前的目标是将SDP记录添加到MacBook Pro上运行的Bluetooth服务中,这样我就可以将该服务发布给其他Bluetooth设备。理想情况下,我想用Python完成此任务。
目前,我已经在BlueZ蓝牙协议栈下的Linux上成功创建,添加和发布了带有SDP记录的广告,但是,要在MacOS上运行类似的过程有点麻烦。 / p>
经过一些研究,我的理解是与MacOS上的Bluetooth API交互涉及使用IOBluetooth Objective-C框架,该框架可以在Python中通过pyobjc完成。顺便提一句,我也了解CoreBluetooth框架的存在,但是,该框架的功能不适合使用,因为它缺少SDP记录添加/删除功能。
我目前正在处理两个问题:
1。创建适合MacOS的SDP记录
MacOS使用PLIST格式来加载/指定SDP记录。我已经有了BlueZ可以加载的XML格式的现有记录。是否可以将此记录转换为PLIST格式,还是应该从头开始重写记录?
2。通过pyobjc添加SDP记录
我能够通过pyobjc / IOBluetooth交互/查询基本的蓝牙功能。当我尝试使用IOBluetoothSDPServiceRecord类时,会出现问题。从我在其他地方看到的一些示例(一个示例here)来看,该类似乎是您用来添加新记录的类?当我尝试加载/使用此类时,我无法访问其任何功能。
如果对于熟悉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)
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'
对此表示感谢!
解决方法
在进行了更多工作之后,我能够提出一个答案。对于碰巧正在从事类似工作的人,我将发布如何解决此问题:
问题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的真正帮助是在Python中使用了dir()
函数。您实际上可以将pyobjc实例或类扔给它,然后会收到所有可用方法的列表。
希望这对以后的人有帮助!