亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號