Library to easily communicate with XBee modules.
Dependencies: DigiLogger
Dependents: WaterLogger XbeeGateway XBee_Cooker ProjetReceiver ... more
Sending data to another module
The data transmission operation sends data from your local (attached) XBee device to a remote device on the network. Data is sent in API frames, but the mbed XBee Library abstracts the process so you only have to care about the node you want to send data to and the data itself.
You can send data either using a unicast or broadcast transmission. Unicast transmissions route data from one source device to one destination device, whereas broadcast transmissions are sent to all devices in the network.
These are the steps to send data to a remote XBee device:
- Create an XBee object.
- Initialize the XBee.
- Send data to remote device(s).
Create an XBee object¶
Create an XBee object of the desired variant:
ZigBee
#include "XBeeLib.h" using namespace XBeeLib; void main() { [...] XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET); [...] }
802.15.4
#include "XBeeLib.h" using namespace XBeeLib; void main() { [...] XBee802 xbee = XBee802(RADIO_TX, RADIO_RX, RADIO_RESET); [...] }
DigiMesh
#include "XBeeLib.h" using namespace XBeeLib; void main() { [...] XBeeDM xbee = XBeeDM(RADIO_TX, RADIO_RX, RADIO_RESET); [...] }
Initialize the XBee¶
Now initialize the XBee. That means calling the init() method (see Initializing modules) and optionally any method required to put the device in the desired network.
#include "XBeeLib.h" using namespace XBeeLib; int main() { [...] xbee.init(); }
Send data to remote device(s)¶
These type of operations can be either synchronous or asynchronous. Synchronous means the methods will wait until the transmit status response is received or the default timeout is reached. See Synchronous Operations Timeout. The 'syncr' parameter (last parameter in all methods) is optional and defaults to true.
Sending data to all devices in the network¶
To send a message to all the devices in the network (a broadcast message) it is enough to call the following method, common for all XBee variants:
XBee class | Method | Description |
---|---|---|
XBeeZB XBee802 XBeeDM | TxStatus send_data_broadcast(const uint8_t *const data, uint16_t len, bool syncr = true); | Send data to all the devices in the network. This function only takes a pointer to the data and its length |
#include "XBeeLib.h" using namespace XBeeLib; int main() { [...] const uint8_t data[] = "Hello, XBees!"; const uint16_t data_len = sizeof data / sizeof data[0] - 1; TxStatus txStatus = xbee.send_data_broadcast(data, data_len); if (txStatus != TxStatusSuccess) { printf("send_data_broadcast() failed with error %d\n", (int)txStatus); } }
Sending data to a specific device in the network¶
Unicast transmissions are sent from one source device to another destination device. There are several ways to send data depending on the module protocol. The destination device could be an immediate neighbor of the source, or it could be several hops away (ZigBee and DigiMesh only).
XBee class | Method | Description |
---|---|---|
XBeeZB | TxStatus send_data_to_coordinator(const uint8_t *data, uint16_t len, bool syncr = true); | Send data to the coordinator only. This function only takes a pointer to the data and its length |
XBeeZB XBee802 XBeeDM | TxStatus send_data(RemoteXBee& remote, const uint8_t *data, uint16_t len, bool syncr = true); | Send data to a RemoteXBee object. This object must have been created or retrieved through a node discovery or data reception |
XBeeZB XBeeDM | TxStatus send_data(RemoteXBee& remote, uint8_t source_ep, uint8_t dest_ep, uint16_t cluster_id, uint16_t profile_id, const uint8_t *data, uint16_t len, bool syncr = true); | Send an explicit frame to a RemoteXBee object. This object must have been created or retrieved through a node discovery or data reception. This is an advanced method to address a remote device's specific end-points, cluster IDs and profiles. It takes parameters for the source and destination end-points, the cluster ID and such cluster's profile ID. All other methods implicitly use Source and Destination end-points to be 0xE8, the Cluster ID to be 0x11 and the Profile ID 0xC10 |
XBee802
#include "XBeeLib.h" using namespace XBeeLib; int main() { [...] const uint8_t data[] = "Hello, XBees!"; const uint16_t data_len = sizeof data / sizeof data[0] - 1; const uint16_t addr16 = 0x01; RemoteXBee802 remoteDevice = RemoteXBee802(addr16); TxStatus txStatus = xbee.send_data(remoteDevice, data, data_len); if (txStatus != TxStatusSuccess) { printf("send_data() failed with error %d\n", (int)txStatus); [...] } [...] }
XBeeZB
#include "XBeeLib.h" using namespace XBeeLib; int main() { [...] const uint8_t data[] = "Hello, XBees!"; const uint16_t data_len = sizeof data / sizeof data[0] - 1; RemoteXBeeZB remoteDevice = RemoteXBeeZB(0x0013A200AABBCCDD); TxStatus txStatus = xbee.send_data(remoteDevice, data, data_len); if (txStatus != TxStatusSuccess) { printf("send_data() failed with error %d\n", (int)txStatus); [...] } [...] }
XBeeDM
#include "XBeeLib.h" using namespace XBeeLib; int main() { [...] const uint8_t data[] = "Hello, XBees!"; const uint16_t data_len = sizeof data / sizeof data[0] - 1; RemoteXBeeDM remoteDevice = RemoteXBeeDM(0x0013A200AABBCCDD); TxStatus txStatus = xbee.send_data(remoteDevice, data, data_len); if (txStatus != TxStatusSuccess) { printf("send_data() failed with error %d\n", (int)txStatus); [...] } [...] }
Return values¶
Al the sending methods return a TxStatus with the following meaning:
Value | Cause |
---|---|
TxStatusSuccess | Transmission completed successfully |
TxStatusAckFail Mack | Acknowledge failure |
TxStatusCCAFail | CCA failure |
TxStatusInvDestEP | Invalid destination endpoint |
TxStatusNwAckFail | Network ACK failure |
TxStatusNotJoinNw | Module is not joined to a network |
TxStatusSelfAddr | Self-addressed |
TxStatusAddrNotFound | Address not found in network |
TxStatusRouteNotFound | Route not found |
TxStatusBroadSrcFail2Heard | Broadcast source failed to hear a neighbor relay the message |
TxStatusInvBindTableIdx | Invalid binding table index |
TxStatusResourceError | Resource error (lack of free buffers, timers, etc.) |
TxStatusAttBroadcWithAPS | Attempted broadcast with APS transmission |
TxStatusAttUnicWithAPSEE0 | Attempted unicast with APS transmission, but EE=0 |
TxStatusResourceError2 | Resource error (lack of free buffers, timers, etc.) |
TxStatusInternalError | Resource error (lack of free buffers, timers, etc.) |
TxStatusPayloadTooLarge | Data Payload too large |
TxStatusIndirectMsgUnReq | Indirect message unrequested (DigiMesh P2MP) |
TxStatusInvAddr | RemoteXBee object has an invalid address |
TxStatusTimeout | Timeout to wait for response expired |
Examples¶
Here is a ready to use example:
For ZigBee modules:¶
Import programXBeeZB_Send_Data
ZigBee Send Data example for mbed XBeeLib By Digi
For 802.15.4 modules:¶
Import programXBee802_Send_Data
802.15.4 Send Data example for mbed XBeeLib By Digi
For DigiMesh modules:¶
Import programXBeeDM_Send_Data
DigiMesh Send Data example for mbed XBeeLib By Digi