2012-11-18 5 views
5

Welche Bibliothek sollte ich verwenden und wie?Wie kann ich Datenfolgen an einen XBee mit einer Python-Bibliothek senden?

Python XBee scheint nur in der Lage zu sein, Befehle im API-Modus zu senden, und ich kann kein Beispiel finden, das jemand benutzt, um eine Zeichenfolge zu senden. Vielleicht verstehe ich nicht, was API-Modus ist, aber ich kann keine Nutzlast in der Dokumentation finden ...

Sind Digi's Python Socket extensions in Python gebacken? Ich kann nicht scheinen, irgendwelche der Konstanten zu erhalten, die sie in meinem Python (2.7.3rc2) definiert haben, noch finde ich eine Erwähnung, wie man diese Erweiterungen auf ihrer Site erhält. Es scheint, als könnte das ein Weg sein, Strings zu umgehen, aber wie benutze ich es?

Antwort

8

Wenn der Xbee als serielles Gerät an den Computer angeschlossen ist, können Sie einfach eine serielle Bibliothek wie pySerial verwenden. Hier sind einige Codeschnipsel von einem Projekt, das ich gerade beendet habe.

# Connect to Xbee 
self.ser = serial.Serial(port, baud, timeout=timeout) 

# Send data (a string) 
self.ser.write(packet) 

# Read data 
self.data += self.ser.read() 

Wir wurden mit den Xbees im transparenten Modus - jedes Byte Sie an einem Ende schreiben am anderen Ende mit einem Lese sichtbar ist. Es gab keine Notwendigkeit für eine spezielle Xbee-Bibliothek.

+0

So ist die XBee an der seriellen Schnittstelle wird die Zeichenfolge auf das XBee Netzwerk wiederholen, und schreiben Sie auch alle Daten, die sie von entfernten XBees zu seriell empfängt? Ich nehme an, beide XBees müssen im transparenten Modus sein? –

+0

Ich habe bisher nur mit zwei Xbees gearbeitet, die direkt kommunizieren, niemals mit einem größeren Netzwerk. Wenn beide im transparenten Modus sind, erscheint jedes Byte, das Sie an einem Ende schreiben, am anderen Ende, genau wie bei der normalen seriellen Schnittstelle. – Tim

7

Ich würde auch pySerial empfehlen, wenn Sie eine sehr einfache Einrichtung und nur zwei XBees haben, aber wenn Sie etwas komplizierter haben, dann sind Sie besser dran mit einer Bibliothek.

Die python-xbee-Bibliothek ist recht einfach zu benutzen, aber es fehlt jegliche umfassende Dokumentation. Zum Senden und Empfangen einfache Nachricht, um sie mit:

from xbee import XBee 
from serial import Serial 

PORT = '/dev/ttyUSB0' 
BAUD = 9600 

ser = Serial(PORT, BAUD) 

xbee = XBee(ser) 
# Send the string 'Hello World' to the module with MY set to 1 
xbee.tx(dest_addr='\x00\x01', data='Hello World') 

# Wait for and get the response 
print(xbee.wait_read_frame()) 

ser.close() 

können Sie AT-Befehle senden, indem Sie:

xbee.at(frame_id='A', command='MY') 
reply = xbee.wait_read_frame() 
print(reply) 

# Getting the integer value out of reply 
import struct  
print(struct.unpack('>h', reply['parameter'])[0]) 

Sie können einstellen, die Frame_ID auf eine beliebige Zeichenfolge, und es verwendet wird, um die richtige Antwort zu identifizieren.

+0

Ich habe kürzlich die Verwaltung von python-xbee übernommen (die, die Sie pip installieren), da sie seit Jahren nicht mehr aktualisiert wurde. Ich akzeptiere gerne Pull-Requests, die die Dokumentation verbessern! https://github.com/nioinnovation/python-xbee/blob/master/docs/source/index.rst – hansmosh

0
ser = serial.Serial(SERIAL_PORT, 9600) 
bee = ZigBee(ser) # <-- 

Versuchen Sie, ZigBee anstelle von XBee zu verwenden, wenn es fehlschlägt.

0

Die erste Frage lautet: "Sind Sie sicher, dass sich Ihre Geräte im API-Modus befinden?". Sie sehen diesen Fehler, weil das empfangende Ende einen Frame des Typs 'tx' (Typ 0x01) hereinkommt. Obwohl dies der Frame ist, den Sie gesendet haben, glaube ich, dass Sie erwarten würden, dass er als Typ 'rx empfangen wird '(Geben Sie 0x81 ein) am empfangenden Ende.

Wenn Sie sich den Code in /xbee/ieee.py ansehen, sehen Sie zwei Listen: * api_commands = Ausgehend: Sie würden niemals erwarten, dass einer dieser Rahmentypen eingeht. * api_responses = Eingehend: Sie sollten nur diese Rahmentypen ankommen sehen.

Wenn die Bibliothek erkennt eine der api_commands eingehenden es den Fehler werfen, werden Sie sehen: "Incoming frame with id 1 looks like a command frame of type 'tx' (these should not be received). Are you sure your devices are in API mode?"

Ich bin nicht 100% sicher von Ihrer Situation, aber es sieht aus wie die abgehenden ‚tx‘ Rahmen nicht übersetzt wird zu einem eingehenden 'rx' Rahmen am anderen Ende - möglicherweise API-Modus nicht auf allen XBees aktiviert?

Siehe auch https://github.com/nioinnovation/python-xbee/issues/44

Verwandte Themen