5 febbraio 2011

PyobjC e Cocoa API

E' da non molto che mi sono avvicinata al mondo Mac e al mondo Python. Le due cose non sono necessariamente legate, ma dato che sto cercando di esplorare le potenzialità del Wiimote e tutti i tutorial e le API che trovo sono o dedicati agli sviluppatori Windows o agli sviluppatori Java, ho pensato di risalire alla fonte e di provare a crearmi una mini libreria personalizzata (forse dovrei chiamarla framework? ^_^) per gestire l'interfaccia bluetooth direttamente da un programma Python.
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.

1 commento:

  1. Dovrei aver trovato la soluzione, rimando ad un prossimo post la spiegazione di cosa non va nell'ultimo codice.

    RispondiElimina