A dire la verità, esisterebbe già un API scritto proprio per gli utenti della mela, ma è un progetto arrivato alla release 0.4 e mai più toccato dal novembre 2009. La cosa non mi rende molto fiduciosa per quanto riguarda la compatibilità e mi sono quindi detta che avrei speso meglio il mio tempo creandomi un API ad hoc, piuttosto che imparando quella di qualcun'altro e nel frattempo avrei anche preso dimestichezza con Python.
In mio soccorso sono arrivati subito Pyobjc e i framework Cocoa (in particolare IOBluetooth e IOBluetoothUI).
Il primo è un bridge tra Python e Objective-C che si trova direttamente installato in OS X 10.5 o superiori, mentre le seconde sono le API presenti nei sistemi operativi Apple più recenti e sono scritte in Objective-C.
A questo punto, pensavo di avere tutto quello che mi servisse per mettermi a programmare, ed invece sto trovando parecchi intoppi lungo la strada. Il fatto è che trovo pochissima documentazione su Pyobjc, anche se sembrerebbe largamente utilizzato e lodato. Se qualcuno dovesse trovare qualche fonte aggiornata mi farebbe cosa gradita se me la segnalasse, magari in un commento.
Nel frattempo cercherò di raccogliere tutte le informazioni che riesco a trovare in questo e successivi post, in modo che possano essere utili anche ad altri.
Importare un framework in un modulo Python:
Da OS X Leopard per importare un framework in un modulo Python tramite Pyobjc si utilizza:
__bundle__ = objc.initFrameworkWrapper("IOBluetooth",
frameworkIdentifier="com.apple.IOBluetooth",
frameworkPath=objc.pathForFramework(
"/System/Library/Frameworks/
IOBluetooth.framework"),globals=globals())
E non come suggerito in molti post nella rete:
objc.loadBundle("IOBluetooth", globals(),
bundle_path=objc.pathForFramework
(u'/System/Library/Frameworks/
IOBluetooth.framework'))
il problema a questo punto diventa cercare un device remoto, che nel mio caso è il Wiimote. Ho provato in vari modi, ma il risultato è sempre negativo.
Questo è il codice:
inquiry = IOBluetoothDeviceInquiry.alloc().init()
a = inquiry.start()
if a == 0:
devices = inquiry.foundDevices()
print devices.count()
else:
print "errore"
devices.count() ritorna sempre 0, il che dovrebbe indicare che non è stato trovato nessun device bluetooth. Evidentemente sto sbagliando da qualche parte, ma non riesco a capire dove. Nessuna idea?
Aggiornamento: Ho risolto il problema! Se volete sapere come, leggete questo post.
Dovrei aver trovato la soluzione, rimando ad un prossimo post la spiegazione di cosa non va nell'ultimo codice.
RispondiElimina