Python-Xbee

Python-xbee è  una libreria in python che permette di lavorare in modalità API sui moduli di comunicazione xbee ( vedi articolo: Digimesh ).

Digimesh

La libreria non implementa correttamente le api dei moduli Digimesh, per questo ho deciso di contribuire al progetto implementando i tipi di pacchetti mancanti.

Ho deciso di utilizzarla per sviluppare un progetto in cui dovrò mettere in comunicazione più arduino con un pc che funga da coordinatore.

Anche se alcune questioni sintattiche non mi aggradano troppo, trovo il python un ottimo linguaggio per la velocità con cui riesco a svilupparvi applicazioni funzionali, inoltre la libreria è molto semplice e anch’essa veloce da utilizzare.

Ecco un esempio:

In questo esempio ho voluto testare la funzione “ND” Network Discovery dei moduli Xbee. Al pc è connesso un Xbee Explorer e nell’area circostante sono attivi 2 Arduino Fio con anch’essi muniti di modulo Xbee DigiMesh.

Lo script non fa altro che un discovery dei nodi attivi, dopodiche invia un comando “RS” ciascuno per valutare la qualità del link.

In uscita viene restituita una tabella con identificativo,indirizzo e qualità della trasmissione.

#! /usr/bin/python

#importo Digimesh
from xbee import DigiMesh
import serial, time

#definisco una funzione di callback a cui saranno passati ipacchetti ricevuti
frame=[]
def print_data(data):
frame.append(data)

#inizializzo la seriale e vi associo la classe
ser = serial.Serial('/dev/ttyUSB0', 9600)
xbee = DigiMesh(ser, escaped=True, callback=print_data)

#invio il comando di scansione
print "eseguo la scansione dei nodi"
xbee.send('at', frame_id="S", command="ND")

#attendo 5 secondi che tutti i nodi abbiano risposto
time.sleep(5)
xbee.halt()
d=1
#per ogni pacchetto ricevuto eseguo il ciclo
for f in frame:
i=10
ID=''
while f['parameter'][i]!='x00':
ID+=f['parameter'][i]
i+=1
xbee = DigiMesh(ser, escaped=True)
#invio ad ogni modulo la richiesta della qualità di comunicazione
xbee.send('remote_at', frame_id='B', dest_addr_long=f['parameter'][2:10], command='DB')
indirizzo=' '.join( [ "%02X " % ord( x ) for x in f['parameter'][2:10] ] )
potenza=xbee.wait_read_frame()['parameter']
#stampa i dati ottenuti
print "nodo %d t| ID: %s t| Indirizzo: %s t|Potenza Segnale: -%d Db " % (d,ID,indirizzo,ord(potenza))
d+=1

xbee.halt()
ser.close()

Questo è quello che viene restituito nel mio caso:

 nodo 1 | ID: lulu3 | Indirizzo: 0013A200406914A4 |Potenza Segnale: -59 Db
 nodo 2 | ID: lulu2 | Indirizzo: 0013A20040691491 |Potenza Segnale: -48 Db

Digimesh.py

In allegato la nuova classe Digimesh in attesa che sia inclusa nel repository ufficiale:

digimesh.py

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...