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:
hbujanda
Date:
Thu May 14 16:24:21 2015 +0200
Revision:
5:6916f9c7bdb0
Child:
7:694d412d8a05
Automatic upload

Who changed what in which revision?

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