802.15.4 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 or 16-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.

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:
Mon Jun 01 19:00:42 2015 +0200
Revision:
7:702ecf64ffcd
Parent:
5:f5ecaeb53632
Child:
8:dbff8c266dc5
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hbujanda 5:f5ecaeb53632 1 /**
hbujanda 5:f5ecaeb53632 2 * Copyright (c) 2015 Digi International Inc.,
hbujanda 5:f5ecaeb53632 3 * All rights not expressly granted are reserved.
hbujanda 5:f5ecaeb53632 4 *
hbujanda 5:f5ecaeb53632 5 * This Source Code Form is subject to the terms of the Mozilla Public
hbujanda 5:f5ecaeb53632 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
hbujanda 5:f5ecaeb53632 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
hbujanda 5:f5ecaeb53632 8 *
hbujanda 5:f5ecaeb53632 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
hbujanda 5:f5ecaeb53632 10 * =======================================================================
hbujanda 5:f5ecaeb53632 11 */
hbujanda 5:f5ecaeb53632 12
hbujanda 5:f5ecaeb53632 13 #include "mbed.h"
hbujanda 5:f5ecaeb53632 14 #include "XBeeLib.h"
hbujanda 5:f5ecaeb53632 15 #if defined(ENABLE_LOGGING)
hbujanda 5:f5ecaeb53632 16 #include "DigiLoggerMbedSerial.h"
hbujanda 5:f5ecaeb53632 17 using namespace DigiLog;
hbujanda 5:f5ecaeb53632 18 #endif
hbujanda 5:f5ecaeb53632 19
spastor 7:702ecf64ffcd 20 #error "Replace next define with the remote module's Node Identifier (NI parameter)"
spastor 7:702ecf64ffcd 21 #define REMOTE_NODE_ID "MyNodeID"
spastor 7:702ecf64ffcd 22
spastor 7:702ecf64ffcd 23 #define MAX_NODES 5
spastor 7:702ecf64ffcd 24 #define NODE_DISCOVERY_TIMEOUT_MS 5000
hbujanda 5:f5ecaeb53632 25
hbujanda 5:f5ecaeb53632 26 using namespace XBeeLib;
hbujanda 5:f5ecaeb53632 27
hbujanda 5:f5ecaeb53632 28 Serial *log_serial;
spastor 7:702ecf64ffcd 29 XBee802 * xbee = NULL;
hbujanda 5:f5ecaeb53632 30
spastor 7:702ecf64ffcd 31 RemoteXBee802 remote_nodes_in_network[MAX_NODES];
spastor 7:702ecf64ffcd 32 unsigned int remote_nodes_count = 0;
hbujanda 5:f5ecaeb53632 33
hbujanda 5:f5ecaeb53632 34 void discovery_function(const RemoteXBee802& remote, char const * const node_id)
hbujanda 5:f5ecaeb53632 35 {
hbujanda 5:f5ecaeb53632 36 MBED_ASSERT(xbee != NULL);
hbujanda 5:f5ecaeb53632 37 const uint64_t remote_addr64 = remote.get_addr64();
hbujanda 5:f5ecaeb53632 38
spastor 7:702ecf64ffcd 39 log_serial->printf("Found device '%s' [%08x:%08x][%04X]\r\n", node_id, UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16());
hbujanda 5:f5ecaeb53632 40
spastor 7:702ecf64ffcd 41 if (remote_nodes_count < MAX_NODES) {
spastor 7:702ecf64ffcd 42 remote_nodes_in_network[remote_nodes_count] = remote;
spastor 7:702ecf64ffcd 43 remote_nodes_count++;
spastor 7:702ecf64ffcd 44 } else {
spastor 7:702ecf64ffcd 45 log_serial->printf("Found more nodes than maximum configured for example (%d)\r\n", MAX_NODES);
hbujanda 5:f5ecaeb53632 46 }
hbujanda 5:f5ecaeb53632 47 }
hbujanda 5:f5ecaeb53632 48
hbujanda 5:f5ecaeb53632 49 int main()
hbujanda 5:f5ecaeb53632 50 {
hbujanda 5:f5ecaeb53632 51 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
hbujanda 5:f5ecaeb53632 52 log_serial->baud(9600);
hbujanda 5:f5ecaeb53632 53 log_serial->printf("Sample application to demo how to discover other XBee 802.15.4 modules in the network and send a message to them\r\n\r\n");
hbujanda 5:f5ecaeb53632 54 log_serial->printf(XB_LIB_BANNER);
hbujanda 5:f5ecaeb53632 55
hbujanda 5:f5ecaeb53632 56 #if defined(ENABLE_LOGGING)
spastor 7:702ecf64ffcd 57 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
hbujanda 5:f5ecaeb53632 58 #endif
hbujanda 5:f5ecaeb53632 59
hbujanda 5:f5ecaeb53632 60 xbee = new XBee802(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
spastor 7:702ecf64ffcd 61
spastor 7:702ecf64ffcd 62 RadioStatus radioStatus = xbee->init();
spastor 7:702ecf64ffcd 63 MBED_ASSERT(radioStatus == Success);
hbujanda 5:f5ecaeb53632 64
spastor 7:702ecf64ffcd 65 log_serial->printf("Configuring Node Discovery timeout to %d ms\r\n", NODE_DISCOVERY_TIMEOUT_MS);
spastor 7:702ecf64ffcd 66 radioStatus = xbee->config_node_discovery(NODE_DISCOVERY_TIMEOUT_MS);
spastor 7:702ecf64ffcd 67 if (radioStatus != Success) {
spastor 7:702ecf64ffcd 68 log_serial->printf("Error on config_node_discovery()\r\n");
spastor 7:702ecf64ffcd 69 }
hbujanda 5:f5ecaeb53632 70
hbujanda 5:f5ecaeb53632 71 log_serial->printf("Trying to discover '%s' by its NI\r\n", REMOTE_NODE_ID);
hbujanda 5:f5ecaeb53632 72 RemoteXBee802 remote_node = xbee->get_remote_node_by_id(REMOTE_NODE_ID);
hbujanda 5:f5ecaeb53632 73
hbujanda 5:f5ecaeb53632 74 if (remote_node.is_valid()) {
hbujanda 5:f5ecaeb53632 75 const uint64_t addr64 = remote_node.get_addr64();
hbujanda 5:f5ecaeb53632 76 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:f5ecaeb53632 77
hbujanda 5:f5ecaeb53632 78 const char message[] = "Hello " REMOTE_NODE_ID "!";
hbujanda 5:f5ecaeb53632 79 log_serial->printf("Sending data to remote device\r\n");
hbujanda 5:f5ecaeb53632 80 const TxStatus txStatus = xbee->send_data(remote_node, (const uint8_t *)message, sizeof message - 1);
hbujanda 5:f5ecaeb53632 81 if (txStatus != TxStatusSuccess) {
hbujanda 5:f5ecaeb53632 82 log_serial->printf("Found an error while sending data %d\r\n", txStatus);
hbujanda 5:f5ecaeb53632 83 }
hbujanda 5:f5ecaeb53632 84 } else {
hbujanda 5:f5ecaeb53632 85 log_serial->printf("Couldn't find '%s' node\r\n", REMOTE_NODE_ID);
hbujanda 5:f5ecaeb53632 86 }
hbujanda 5:f5ecaeb53632 87
spastor 7:702ecf64ffcd 88 /* Register callbacks */
spastor 7:702ecf64ffcd 89 xbee->register_node_discovery_cb(&discovery_function);
spastor 7:702ecf64ffcd 90
spastor 7:702ecf64ffcd 91 log_serial->printf("\r\nStarting Node Discovery\r\n\r\n");
hbujanda 5:f5ecaeb53632 92 xbee->start_node_discovery();
hbujanda 5:f5ecaeb53632 93
spastor 7:702ecf64ffcd 94 do {
hbujanda 5:f5ecaeb53632 95 xbee->process_rx_frames();
hbujanda 5:f5ecaeb53632 96 wait_ms(10);
spastor 7:702ecf64ffcd 97 } while(xbee->is_node_discovery_in_progress());
spastor 7:702ecf64ffcd 98 log_serial->printf("\r\nNode Discovery Finished\r\n\r\n");
spastor 7:702ecf64ffcd 99
spastor 7:702ecf64ffcd 100 for (unsigned int i = 0; i < remote_nodes_count; i++) {
spastor 7:702ecf64ffcd 101
spastor 7:702ecf64ffcd 102 RemoteXBee802 remote = remote_nodes_in_network[i];
spastor 7:702ecf64ffcd 103 const uint64_t remote_addr64 = remote.get_addr64();
spastor 7:702ecf64ffcd 104
spastor 7:702ecf64ffcd 105 const char message[] = "Hello neighbor!";
spastor 7:702ecf64ffcd 106 log_serial->printf("Sending data to remote device [%08x:%08x][%04X]\r\n", UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16());
spastor 7:702ecf64ffcd 107 const TxStatus txStatus = xbee->send_data(remote, (const uint8_t *)message, sizeof message - 1);
spastor 7:702ecf64ffcd 108 if (txStatus != TxStatusSuccess) {
spastor 7:702ecf64ffcd 109 log_serial->printf("Found an error while sending data %d\r\n", txStatus);
spastor 7:702ecf64ffcd 110 }
hbujanda 5:f5ecaeb53632 111 }
hbujanda 5:f5ecaeb53632 112
spastor 7:702ecf64ffcd 113 log_serial->printf("Example finished\r\n");
spastor 7:702ecf64ffcd 114
hbujanda 5:f5ecaeb53632 115 delete(log_serial);
spastor 7:702ecf64ffcd 116 delete(xbee);
spastor 7:702ecf64ffcd 117 while (true) {
spastor 7:702ecf64ffcd 118 wait_ms(10000);
spastor 7:702ecf64ffcd 119 }
hbujanda 5:f5ecaeb53632 120 }