per utilizzare il telefono Android come client FTP e' piuttosto semplice utilizzando la libreria ftplib
---------------------------------------------------------------------------------------------------------
import ftplib
s = ftplib.FTP('192.168.0.1','luca','password')
f = open('/mnt/sdcard/datalogger.db','rb') #path del file che deve essere inviato
s.storbinary('STOR datalogger.db', f) #come deve essere salvato il file sul server
#il comando STOR non accetta il percorso ma solo il
#nome del file per cui per porlo in directory particolare
# si deve usare il comando CWD
f.close()
s.quit()
---------------------------------------------------------------------------------------------------------
Qualche problema in piu' deriva dal lato server. Per esempio installando su Linux il server FTP VsFtp si avra' una configurazione di base sostanzialmente paranoica che non permette di fare quasi niente oltre a loggarsi per cui si deve editare il file di configurazione in modo da permettere la scrittura agli utenti
sabato 14 gennaio 2012
venerdì 13 gennaio 2012
Datalogger + Twetter
Una versione del Datalogger con salvataggio su Twetter (poco utile a fini scientifici). Dalle prime prove la latenza di Twetter e' decisamente superiore a quella di GDocs
---------------------------------------------------------------------------------------------
import android, time, tweepy
from time import strftime
CONSUMER_KEY = 'xxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
droid = android.Android()
droid.startSensingTimed(1,1000)
time.sleep(3)
acq = 0
while True:
accx = str(droid.sensorsReadAccelerometer().result[0])
accy = str(droid.sensorsReadAccelerometer().result[1])
accz = str(droid.sensorsReadAccelerometer().result[2])
az = str(droid.sensorsReadOrientation().result[0])
pitch = str(droid.sensorsReadOrientation().result[1])
roll = str(droid.sensorsReadOrientation().result[2])
orario = strftime("%Y-%m-%d %H:%M:%S")
outString = "Azimuth: " + az + " Pitch: " + pitch + " Roll: " + roll + " - " + orario
api.update_status(outString)
acq = acq + 1
print "Dato " + str(acq)
time.sleep(30)
droid.stopSensing()
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
import android, time, tweepy
from time import strftime
CONSUMER_KEY = 'xxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
droid = android.Android()
droid.startSensingTimed(1,1000)
time.sleep(3)
acq = 0
while True:
accx = str(droid.sensorsReadAccelerometer().result[0])
accy = str(droid.sensorsReadAccelerometer().result[1])
accz = str(droid.sensorsReadAccelerometer().result[2])
az = str(droid.sensorsReadOrientation().result[0])
pitch = str(droid.sensorsReadOrientation().result[1])
roll = str(droid.sensorsReadOrientation().result[2])
orario = strftime("%Y-%m-%d %H:%M:%S")
outString = "Azimuth: " + az + " Pitch: " + pitch + " Roll: " + roll + " - " + orario
api.update_status(outString)
acq = acq + 1
print "Dato " + str(acq)
time.sleep(30)
droid.stopSensing()
---------------------------------------------------------------------------------------------
FPing
In modo piu' o meno puntuale mi capita di aver bisogno di un apparato di rete sepolto in qualche cassetto di cui ho perso l'indirizzo IP per l'amministrazione (...il foglio allegato e' regolarmente sbagliato)
In particolare con gli Access Point
In questi casi e' fondamentale il programma FPing che permette di automatizzare il Ping su intere classi di indirizzi (in genere finisco abbastanza alla svelta perche' le classi che uso sono quasi sempre la 192.168.0.x, 192.168.1.x e 10.0.0.x)
un esempio (si rimanda al man) per limitare la ricerca ai primi 100 indirizzi
fping -g 192.168.1.1 192.168.1.100
PS: ovviamente si deve sperare che l'apparato di rete non sia in modalita' No_ping come spesso vedono impostati molti server...
In particolare con gli Access Point
In questi casi e' fondamentale il programma FPing che permette di automatizzare il Ping su intere classi di indirizzi (in genere finisco abbastanza alla svelta perche' le classi che uso sono quasi sempre la 192.168.0.x, 192.168.1.x e 10.0.0.x)
un esempio (si rimanda al man) per limitare la ricerca ai primi 100 indirizzi
fping -g 192.168.1.1 192.168.1.100
PS: ovviamente si deve sperare che l'apparato di rete non sia in modalita' No_ping come spesso vedono impostati molti server...
Twitter via Android su telefono
Inviare tweet dal telefono Android prevede una procedura un po' differente rispetto a quella pubblicata qualche post fa.
Per prima cosa si deve scaricare da qui la libreria tweepy, in particolare a me funziona la versione 2.6
Successivamente dal telefono si deve aprire Python per Android/Import Modules e si seleziona la libreria per l'installazione
Lo script per postare su Tweet e' semplice come nell'esempio ripreso da un libro su SL4A
-------------------------------------------------------------------------------------------------------------
import android, datetime, time, tweepy
CONSUMER_KEY = 'xxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
droid = android.Android()
droid.startLocating()
time.sleep(15)
loc = droid.readLocation()
droid.stopLocating()
if 'gps' in loc.result:
lat = str(loc.result['gps']['latitude'])
lon = str(loc.result['gps']['longitude'])
else:
lat = str(loc.result['network']['latitude'])
lon = str(loc.result['network']['longitude'])
now = str(datetime.datetime.now())
outString = 'I am here: ' + now + ' ' + lat + ' ' + lon
api.update_status(outString)
-------------------------------------------------------------------------------------------------------------
Per prima cosa si deve scaricare da qui la libreria tweepy, in particolare a me funziona la versione 2.6
Successivamente dal telefono si deve aprire Python per Android/Import Modules e si seleziona la libreria per l'installazione
Lo script per postare su Tweet e' semplice come nell'esempio ripreso da un libro su SL4A
-------------------------------------------------------------------------------------------------------------
import android, datetime, time, tweepy
CONSUMER_KEY = 'xxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
droid = android.Android()
droid.startLocating()
time.sleep(15)
loc = droid.readLocation()
droid.stopLocating()
if 'gps' in loc.result:
lat = str(loc.result['gps']['latitude'])
lon = str(loc.result['gps']['longitude'])
else:
lat = str(loc.result['network']['latitude'])
lon = str(loc.result['network']['longitude'])
now = str(datetime.datetime.now())
outString = 'I am here: ' + now + ' ' + lat + ' ' + lon
api.update_status(outString)
-------------------------------------------------------------------------------------------------------------
Hacking Access Point WG602w4
Tempo fa avevo bisogno di estendere la copertura di una rete WiFi e cosi' ho cercato di acquistare un Access Point con modalita' Repeater. Il simpatico negoziante mi ha venduto un AP, anche abbastanza costoso, dicendo "Certo che funziona come repeater..c'e' scritto sulla scatola!!"
Dopo un giorno di prove ho letto su Internet che il WG602w4 funziona come repeater solo con altri AP della stessa ditta (??)
Ho quindi modificato il software dell'AP montando DD-WRT (http://www.dd-wrt.com/site/index), un firmware basato su Linux con una procedura ben descritta sul sito e andata liscia come l'olio
Una volta terminato lo scatolotto era pieno di nuove funzionalita' tra cui il repeater che ha funzionato a meraviglia....certe che un po' fa pensare di spendere soldi (anche abbastanza) per un hardware limitato poi dal software che ci gira sopra....
Dopo un giorno di prove ho letto su Internet che il WG602w4 funziona come repeater solo con altri AP della stessa ditta (??)
Ho quindi modificato il software dell'AP montando DD-WRT (http://www.dd-wrt.com/site/index), un firmware basato su Linux con una procedura ben descritta sul sito e andata liscia come l'olio
Una volta terminato lo scatolotto era pieno di nuove funzionalita' tra cui il repeater che ha funzionato a meraviglia....certe che un po' fa pensare di spendere soldi (anche abbastanza) per un hardware limitato poi dal software che ci gira sopra....
Datalogger + GDocs + Python + Android
Una versione differente del datalogger con salvataggio non in locale ma in real timesu Goggle Docs
Per prima cosa si deve creare uno Spreadsheet su Google Docs mettendo nella prima riga il nome delle colonne che saranno poi di riferimento per lo scrpit Python (i nomi devono essere minucoli e senza caratteri speciali)
Ci si deve inoltre annotare la key che compare nella URL
a questo punto lo script del Datalogger e' modificato come segue utilizzando le librerie GData che sono incluse in Python per SL4A nel pacchetto extra
-----------------------------------------------------------------------------------------------------
import android, time
from time import strftime
import gdata.spreadsheet.service
droid = android.Android()
email = 'lucainnoc@gmail.com'
password = 'password'
# Find this value in the url with 'key=XXX' and copy XXX below
spreadsheet_key = '0AvBeE7yoBqdHdFdmOW1UQUthVFpMZzF1S0lRWjRWdFE'
worksheet_id = 'od6' #indica il primo foglio
spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source = 'Example Spreadsheet Writing Application'
spr_client.ProgrammaticLogin()
droid.startSensingTimed(1,1000)
time.sleep(3)
acq = 0
while True:
accx = str(droid.sensorsReadAccelerometer().result[0])
accy = str(droid.sensorsReadAccelerometer().result[1])
accz = str(droid.sensorsReadAccelerometer().result[2])
az = str(droid.sensorsReadOrientation().result[0])
pitch = str(droid.sensorsReadOrientation().result[1])
roll = str(droid.sensorsReadOrientation().result[2])
orario = strftime("%Y-%m-%d %H:%M:%S")
dict = {}
#dict['date'] = time.strftime('%m/%d/%Y')
dict['time'] = orario
dict['accx'] = accx
dict['accy'] = accy
dict['accz'] = accz
dict['az'] = az
dict['pitch'] = pitch
dict['roll'] = roll
entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)
if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
#print "Insert row succeeded."
acq = acq + 1
print "Dato " + str(acq)
else:
print "Insert row failed."
time.sleep(1)
droid.stopSensing()
conn.close()
-----------------------------------------------------------------------------------
Lanciando lo script su telefono e tenendo aperto il foglio di calcolo nel browser del computer si vedranno le righe popolarsi con il passare del tempo. Il tempo di campionamento minimo e' piuttosto lungo (al minimo occorre circa 1 secondo per acquisizione) a causa della latenza della rete
Riferimenti : http://www.brokenairplane.com/2011/08/im-not-texting-im-programming.html (il sistema di autenticazione del mio script rispetto a quello di DoScience.py e' differente in quanto con il metodo proposto al link Google risponde con un errore di autenticazione)
Per prima cosa si deve creare uno Spreadsheet su Google Docs mettendo nella prima riga il nome delle colonne che saranno poi di riferimento per lo scrpit Python (i nomi devono essere minucoli e senza caratteri speciali)
Ci si deve inoltre annotare la key che compare nella URL
a questo punto lo script del Datalogger e' modificato come segue utilizzando le librerie GData che sono incluse in Python per SL4A nel pacchetto extra
-----------------------------------------------------------------------------------------------------
import android, time
from time import strftime
import gdata.spreadsheet.service
droid = android.Android()
email = 'lucainnoc@gmail.com'
password = 'password'
# Find this value in the url with 'key=XXX' and copy XXX below
spreadsheet_key = '0AvBeE7yoBqdHdFdmOW1UQUthVFpMZzF1S0lRWjRWdFE'
worksheet_id = 'od6' #indica il primo foglio
spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source = 'Example Spreadsheet Writing Application'
spr_client.ProgrammaticLogin()
droid.startSensingTimed(1,1000)
time.sleep(3)
acq = 0
while True:
accx = str(droid.sensorsReadAccelerometer().result[0])
accy = str(droid.sensorsReadAccelerometer().result[1])
accz = str(droid.sensorsReadAccelerometer().result[2])
az = str(droid.sensorsReadOrientation().result[0])
pitch = str(droid.sensorsReadOrientation().result[1])
roll = str(droid.sensorsReadOrientation().result[2])
orario = strftime("%Y-%m-%d %H:%M:%S")
dict = {}
#dict['date'] = time.strftime('%m/%d/%Y')
dict['time'] = orario
dict['accx'] = accx
dict['accy'] = accy
dict['accz'] = accz
dict['az'] = az
dict['pitch'] = pitch
dict['roll'] = roll
entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)
if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
#print "Insert row succeeded."
acq = acq + 1
print "Dato " + str(acq)
else:
print "Insert row failed."
time.sleep(1)
droid.stopSensing()
conn.close()
-----------------------------------------------------------------------------------
Lanciando lo script su telefono e tenendo aperto il foglio di calcolo nel browser del computer si vedranno le righe popolarsi con il passare del tempo. Il tempo di campionamento minimo e' piuttosto lungo (al minimo occorre circa 1 secondo per acquisizione) a causa della latenza della rete
Riferimenti : http://www.brokenairplane.com/2011/08/im-not-texting-im-programming.html (il sistema di autenticazione del mio script rispetto a quello di DoScience.py e' differente in quanto con il metodo proposto al link Google risponde con un errore di autenticazione)
giovedì 12 gennaio 2012
Twitter via programma
Per il datalogger una funzione carina poteva essere quella di inviare i dati via Twitter.
Tra gli esempi di SL4A si trovano diversi client twitter peccato che si basino sul metodo di autenticazione Authentication Basic che ad oggi Twitter non usa piu'.
Al momento riesco ad inviare tweet via programma usando la libreria python-twitter-0.8.2 ed in particolare l'esempio tweet.py nella sottodirectory /examples impiegando il sistema di autenticazione OAuth
Prima di tutto pero' si deve andare su http://dev.twitter.com registrandosi con il proprio utente e creando una nuova applicazione.
Verranno cosi' create la Consumer Key e la Consumer Secret...non basta...si deve settare Access Application Type a Read and Write e poi creare Access Token e Access Token Secret
Tra gli esempi di SL4A si trovano diversi client twitter peccato che si basino sul metodo di autenticazione Authentication Basic che ad oggi Twitter non usa piu'.
Al momento riesco ad inviare tweet via programma usando la libreria python-twitter-0.8.2 ed in particolare l'esempio tweet.py nella sottodirectory /examples impiegando il sistema di autenticazione OAuth
Prima di tutto pero' si deve andare su http://dev.twitter.com registrandosi con il proprio utente e creando una nuova applicazione.
Verranno cosi' create la Consumer Key e la Consumer Secret...non basta...si deve settare Access Application Type a Read and Write e poi creare Access Token e Access Token Secret
Con questi quattro codici si crea un file .tweetrc nella propria home copiando i valori
[Tweet]
consumer_key: XXXXXXXXXXX
consumer_secret: XXXXXXXXXXX
access_key: XXXXXXXXXXXXXXX
access_secret: XXXXXXXXXXXXXX
(gli stessi valori possono essere passati da linea di comando)
a questo punto si puo' usare il file di esempio tweet.py (magari modificando la prima riga che fa riferimento all'obsoleto python 2.4) con la sintassy
tweet.py 12344
sulla pagina andando sulla pagina di Twitter si vede il nuovo Tweet
Per i futuri Tweet del sensore Android seguire https://twitter.com/#!/sensore_android
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...