Pagine

Visualizzazione post con etichetta Pyobjc. Mostra tutti i post
Visualizzazione post con etichetta Pyobjc. Mostra tutti i post

7 febbraio 2011

IOBluetoothDeviceInquiry - Ora funziona!

Nonostante avessi richiesto una mano per del codice nel post PyobjC e Cocoa API, sono riuscita in breve a scovare nei meandri della rete qualcuno che come me ha avuto qualche difficoltà a capire il funzionamento della classe IOBluetoothDeviceInquiry e che per questo ha messo a disposizione un esempio corretto. L'esempio originale (lo trovate qui) è stato scritto in objective-c e comprende anche qualche manipolazione dei dispositivi trovati.
Quello che ho fatto è stato semplicemente "tradurre" l'esempio in Python tramite le regole di conversione di PyObjC, eliminare le parti che non mi servivano e personalizzarlo un po':

# Setup the inquiry to search for available devices
inquiry = IOBluetoothDeviceInquiry.alloc().init()
inquiry.start()
NSThread.sleepUntilDate_(NSDate.dateWithTimeIntervalSinceNow_(7))
inquiry.stop()

# Create an array of foundDevices
deviceList = inquiry.foundDevices()
print deviceList.count()

Effettivamente, mi ero già accorta che il mio codice precedente terminava troppo rapidamente, di certo non i 10 secondi cui dovrebbe durare la ricerca, ma non avevo trovato il modo di risolvere la questione e così foundDevices() veniva chiamato troppo presto. Quello che invece non mi è ben chiaro, è perché sia necessario chiamare anche stop(): la ricerca non dovrebbe terminare da sola dopo massimo 10 secondi? C'è ancora qualcosa che mi sfugge?

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.