我當前的目標是向 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
提交
取消