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

问题描述

我目前的目标是将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)

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'

对此表示感谢!

解决方法

在进行了更多工作之后,我能够提出一个答案。对于碰巧正在从事类似工作的人,我将发布如何解决此问题:

问题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实例或类扔给它,然后会收到所有可用方法的列表。

希望这对以后的人有帮助!