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:
Fri May 08 11:52:08 2015 +0200
Revision:
2:8c1955f15fdd
Parent:
0:7be0794fb24f
Child:
3:44059a052f3a
Automatic upload

Who changed what in which revision?

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