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:
Mon May 11 18:00:30 2015 +0200
Revision:
3:ee7b06215329
Parent:
2:5e41a845f211
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
hbujanda 0:52b14877e9eb 20 using namespace XBeeLib;
hbujanda 0:52b14877e9eb 21
hbujanda 0:52b14877e9eb 22 Serial *log_serial;
hbujanda 0:52b14877e9eb 23
hbujanda 3:ee7b06215329 24 static RemoteXBeeZB send_to = RemoteXBeeZB();
hbujanda 0:52b14877e9eb 25
hbujanda 0:52b14877e9eb 26 void discovery_function(const RemoteXBeeZB& remote, char const * const node_id)
hbujanda 0:52b14877e9eb 27 {
spastor 2:5e41a845f211 28 const uint64_t remote_addr64 = remote.get_addr64();
spastor 2:5e41a845f211 29
hbujanda 3:ee7b06215329 30 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 3:ee7b06215329 31 if (send_to.is_valid()) {
hbujanda 3:ee7b06215329 32 log_serial->printf( "Skipping salutation to '%s' [%08x:%08x][%04X] because previous one has not been sent\r\n", node_id, UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16());
hbujanda 3:ee7b06215329 33 } else {
hbujanda 3:ee7b06215329 34 send_to = remote;
hbujanda 0:52b14877e9eb 35 }
hbujanda 0:52b14877e9eb 36 }
hbujanda 0:52b14877e9eb 37
hbujanda 0:52b14877e9eb 38 int main()
hbujanda 0:52b14877e9eb 39 {
hbujanda 0:52b14877e9eb 40 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
hbujanda 0:52b14877e9eb 41 log_serial->baud(9600);
hbujanda 0:52b14877e9eb 42 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 43 log_serial->printf(XB_LIB_BANNER);
hbujanda 0:52b14877e9eb 44
hbujanda 0:52b14877e9eb 45 #if defined(ENABLE_LOGGING)
hbujanda 0:52b14877e9eb 46 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
hbujanda 0:52b14877e9eb 47 #endif
hbujanda 0:52b14877e9eb 48
hbujanda 3:ee7b06215329 49 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
hbujanda 0:52b14877e9eb 50
hbujanda 0:52b14877e9eb 51 /* Register callbacks */
hbujanda 3:ee7b06215329 52 xbee.register_node_discovery_cb(&discovery_function);
hbujanda 0:52b14877e9eb 53
hbujanda 3:ee7b06215329 54 RadioStatus const radioStatus = xbee.init();
hbujanda 0:52b14877e9eb 55 MBED_ASSERT(radioStatus == Success);
hbujanda 0:52b14877e9eb 56
hbujanda 0:52b14877e9eb 57 /* Wait until the device has joined the network */
hbujanda 0:52b14877e9eb 58 log_serial->printf("Waiting for device to join the network: ");
hbujanda 3:ee7b06215329 59 while (!xbee.is_joined()) {
hbujanda 0:52b14877e9eb 60 wait_ms(1000);
hbujanda 0:52b14877e9eb 61 log_serial->printf(".");
hbujanda 0:52b14877e9eb 62 }
hbujanda 0:52b14877e9eb 63 log_serial->printf("OK\r\n");
hbujanda 0:52b14877e9eb 64
hbujanda 0:52b14877e9eb 65 log_serial->printf("Starting Node Discovery\r\n");
hbujanda 3:ee7b06215329 66 xbee.start_node_discovery();
hbujanda 0:52b14877e9eb 67
hbujanda 0:52b14877e9eb 68 while (true) {
hbujanda 3:ee7b06215329 69 xbee.process_rx_frames();
hbujanda 3:ee7b06215329 70 if (send_to.is_valid()) {
hbujanda 3:ee7b06215329 71 const char message[] = "Hello neighbor!";
hbujanda 3:ee7b06215329 72 log_serial->printf("Sending data to remote device\r\n");
hbujanda 3:ee7b06215329 73 const TxStatus txStatus = xbee.send_data(send_to, (const uint8_t *)message, sizeof message - 1);
hbujanda 3:ee7b06215329 74 if (txStatus != TxStatusSuccess) {
hbujanda 3:ee7b06215329 75 log_serial->printf("Found an error while sending data %d\r\n", txStatus);
hbujanda 3:ee7b06215329 76 }
hbujanda 3:ee7b06215329 77 send_to = RemoteXBeeZB(); /* Set it to an uninitialized object again */
hbujanda 3:ee7b06215329 78 }
hbujanda 0:52b14877e9eb 79 wait_ms(10);
hbujanda 0:52b14877e9eb 80 }
hbujanda 0:52b14877e9eb 81
hbujanda 0:52b14877e9eb 82 delete(log_serial);
hbujanda 0:52b14877e9eb 83 }