ZigBee Node Discovery example for mbed XBeeLib By Digi

Dependencies:   XBeeLib mbed

Description

This example shows how to discover remote XBee modules based on their NI (Node Identifier) instead of using its 64-bit network address

The example demonstrates the two ways of discovering nodes:

  • Search for all nodes to identify
  • Search for only one node

See Discovering nodes in the network chapter for more information.

Common Setup

Make sure you have a valid Example Common Setup

Example Setup

You need to have your remote XBee module with a valid Node Identifier "NI" (Remember that by default its value is a space). Then customize the REMOTE_NODE_ID define in the application with that value.

Running the example

Build and deploy the example to the mbed module.
Reset the mbed module so the example starts. You should see the example debug information through the debug interface configured in the 'Local Setup' chapter.

Once joined to the coordinator, the application will try to discover the remote XBee module with NI equal to the defined REMOTE_NODE_ID. If found, it will send it a 'hello' message. Check in the "Console" tab of the X-CTU connected to the remote XBee module that the message arrived.
Then a node discovery function callback will be registered and a node discovery performed. All remote XBee modules in the network should answer. This library will process each answer and call the registered callback. The callback sends a 'Hello neighbor!' message to each discovered remote XBee module. Check in the "Console" tab of the X-CTU connected to the remote XBee module that the message arrived.

Committer:
spastor
Date:
Fri May 08 11:53:15 2015 +0200
Revision:
2:5e41a845f211
Parent:
0:52b14877e9eb
Child:
3:ee7b06215329
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hbujanda 0:52b14877e9eb 1 /**
hbujanda 0:52b14877e9eb 2 * Copyright (c) 2015 Digi International Inc.,
hbujanda 0:52b14877e9eb 3 * All rights not expressly granted are reserved.
hbujanda 0:52b14877e9eb 4 *
hbujanda 0:52b14877e9eb 5 * This Source Code Form is subject to the terms of the Mozilla Public
hbujanda 0:52b14877e9eb 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
hbujanda 0:52b14877e9eb 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
hbujanda 0:52b14877e9eb 8 *
hbujanda 0:52b14877e9eb 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
hbujanda 0:52b14877e9eb 10 * =======================================================================
hbujanda 0:52b14877e9eb 11 */
hbujanda 0:52b14877e9eb 12
hbujanda 0:52b14877e9eb 13 #include "mbed.h"
hbujanda 0:52b14877e9eb 14 #include "XBeeLib.h"
hbujanda 0:52b14877e9eb 15 #if defined(ENABLE_LOGGING)
hbujanda 0:52b14877e9eb 16 #include "DigiLoggerMbedSerial.h"
hbujanda 0:52b14877e9eb 17 using namespace DigiLog;
hbujanda 0:52b14877e9eb 18 #endif
hbujanda 0:52b14877e9eb 19
spastor 2:5e41a845f211 20 #define REMOTE_NODE_ID "MyNodeID" /* TODO: Write a node's NI here*/
spastor 2:5e41a845f211 21
hbujanda 0:52b14877e9eb 22 using namespace XBeeLib;
hbujanda 0:52b14877e9eb 23
hbujanda 0:52b14877e9eb 24 Serial *log_serial;
hbujanda 0:52b14877e9eb 25
spastor 2:5e41a845f211 26 XBeeZB * xbee = NULL;
hbujanda 0:52b14877e9eb 27
hbujanda 0:52b14877e9eb 28 void discovery_function(const RemoteXBeeZB& remote, char const * const node_id)
hbujanda 0:52b14877e9eb 29 {
spastor 2:5e41a845f211 30 MBED_ASSERT(xbee != NULL);
spastor 2:5e41a845f211 31
spastor 2:5e41a845f211 32 const uint64_t remote_addr64 = remote.get_addr64();
spastor 2:5e41a845f211 33
spastor 2:5e41a845f211 34 log_serial->printf("Found device '%s' [%08x:%08x][%04X] sending a message to it\r\n", node_id, UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16());
hbujanda 0:52b14877e9eb 35
spastor 2:5e41a845f211 36 const char message[] = "Hello neighbor!";
spastor 2:5e41a845f211 37 log_serial->printf("Sending data to remote device\r\n");
spastor 2:5e41a845f211 38 const TxStatus txStatus = xbee->send_data(remote, (const uint8_t *)message, sizeof message - 1);
spastor 2:5e41a845f211 39 if (txStatus != TxStatusSuccess) {
spastor 2:5e41a845f211 40 log_serial->printf("Found an error while sending data %d\r\n", txStatus);
hbujanda 0:52b14877e9eb 41 }
hbujanda 0:52b14877e9eb 42 }
hbujanda 0:52b14877e9eb 43
hbujanda 0:52b14877e9eb 44 int main()
hbujanda 0:52b14877e9eb 45 {
hbujanda 0:52b14877e9eb 46 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
hbujanda 0:52b14877e9eb 47 log_serial->baud(9600);
hbujanda 0:52b14877e9eb 48 log_serial->printf("Sample application to demo how to discover nodes in the ZigBee network and send a message to them\r\n\r\n");
hbujanda 0:52b14877e9eb 49 log_serial->printf(XB_LIB_BANNER);
hbujanda 0:52b14877e9eb 50
hbujanda 0:52b14877e9eb 51 #if defined(ENABLE_LOGGING)
hbujanda 0:52b14877e9eb 52 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
hbujanda 0:52b14877e9eb 53 #endif
hbujanda 0:52b14877e9eb 54
spastor 2:5e41a845f211 55 xbee = new XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
hbujanda 0:52b14877e9eb 56
hbujanda 0:52b14877e9eb 57 /* Register callbacks */
spastor 2:5e41a845f211 58 xbee->register_node_discovery_cb(&discovery_function);
hbujanda 0:52b14877e9eb 59
spastor 2:5e41a845f211 60 RadioStatus const radioStatus = xbee->init();
hbujanda 0:52b14877e9eb 61 MBED_ASSERT(radioStatus == Success);
hbujanda 0:52b14877e9eb 62
hbujanda 0:52b14877e9eb 63 /* Wait until the device has joined the network */
hbujanda 0:52b14877e9eb 64 log_serial->printf("Waiting for device to join the network: ");
spastor 2:5e41a845f211 65 while (!xbee->is_joined()) {
hbujanda 0:52b14877e9eb 66 wait_ms(1000);
hbujanda 0:52b14877e9eb 67 log_serial->printf(".");
hbujanda 0:52b14877e9eb 68 }
hbujanda 0:52b14877e9eb 69 log_serial->printf("OK\r\n");
hbujanda 0:52b14877e9eb 70
hbujanda 0:52b14877e9eb 71 log_serial->printf("Starting Node Discovery\r\n");
spastor 2:5e41a845f211 72
spastor 2:5e41a845f211 73 log_serial->printf("Trying to discover '%s' by its NI\r\n", REMOTE_NODE_ID);
spastor 2:5e41a845f211 74 RemoteXBeeZB remote_node = xbee->get_remote_node_by_id(REMOTE_NODE_ID);
spastor 2:5e41a845f211 75
spastor 2:5e41a845f211 76 if (remote_node.is_valid()) {
spastor 2:5e41a845f211 77 const uint64_t addr64 = remote_node.get_addr64();
spastor 2:5e41a845f211 78 log_serial->printf("Found '%s'! [%08x:%08x|%04x]\r\n", REMOTE_NODE_ID, UINT64_HI32(addr64), UINT64_LO32(addr64), remote_node.get_addr16());
spastor 2:5e41a845f211 79
spastor 2:5e41a845f211 80 const char message[] = "Hello " REMOTE_NODE_ID "!";
spastor 2:5e41a845f211 81 log_serial->printf("Sending data to remote device\r\n");
spastor 2:5e41a845f211 82 const TxStatus txStatus = xbee->send_data(remote_node, (const uint8_t *)message, sizeof message - 1);
spastor 2:5e41a845f211 83 if (txStatus != TxStatusSuccess) {
spastor 2:5e41a845f211 84 log_serial->printf("Found an error while sending data %d\r\n", txStatus);
spastor 2:5e41a845f211 85 }
spastor 2:5e41a845f211 86 } else {
spastor 2:5e41a845f211 87 log_serial->printf("Couldn't find '%s' node\r\n", REMOTE_NODE_ID);
spastor 2:5e41a845f211 88 }
spastor 2:5e41a845f211 89
spastor 2:5e41a845f211 90 log_serial->printf("Starting Node Discovery\r\n");
spastor 2:5e41a845f211 91 xbee->start_node_discovery();
hbujanda 0:52b14877e9eb 92
hbujanda 0:52b14877e9eb 93 while (true) {
spastor 2:5e41a845f211 94 xbee->process_rx_frames();
hbujanda 0:52b14877e9eb 95 wait_ms(10);
hbujanda 0:52b14877e9eb 96 }
hbujanda 0:52b14877e9eb 97
hbujanda 0:52b14877e9eb 98 delete(log_serial);
hbujanda 0:52b14877e9eb 99 }