Ns3 Projects for B.E/B.Tech M.E/M.Tech PhD Scholars.  Phone-Number:9790238391   E-mail: ns3simulation@gmail.com

How to Implement zigbee protocol in ns3

To implement the Zigbee protocol in ns3, a custom module we create Zigbee stack and its functionalities. Read out the steps, we provide good support for your project.  Here the steps given below will guide to create and implement a basic zigbee protocol in ns3 and explains about the integration of network simulation.

Step-by-Step Guide to Implementing Zigbee in ns-3

  1. Set Up Your Environment

Ensure that ns3 is installed.

  1. Create a New ns-3 Module

Create a new module for the Zigbee protocol in the src directory of the ns3 installation. This involves creating the necessary directory structure and files.

cd ns-3.xx

cd src

mkdir -p zigbee/model

mkdir -p zigbee/helper

3. Create the Zigbee Protocol Header File

Create the Zigbee routing protocol header file zigbee-routing-protocol.h in the model directory.

#ifndef ZIGBEE_ROUTING_PROTOCOL_H

#define ZIGBEE_ROUTING_PROTOCOL_H

#include “ns3/ipv4-routing-protocol.h”

#include “ns3/ipv4-address.h”

#include “ns3/timer.h”

#include “ns3/mobility-model.h”

#include “ns3/node.h”

#include “ns3/net-device.h”

#include “ns3/ipv4.h”

#include “ns3/ipv4-routing-table-entry.h”

#include <map>

namespace ns3 {

class ZigbeeRoutingProtocol : public Ipv4RoutingProtocol

{

public:

  static TypeId GetTypeId (void);

  ZigbeeRoutingProtocol ();

  virtual ~ZigbeeRoutingProtocol ();

  // Inherited from Ipv4RoutingProtocol

  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);

  virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb);

  virtual void NotifyInterfaceUp (uint32_t interface);

  virtual void NotifyInterfaceDown (uint32_t interface);

  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);

  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);

  virtual void SetIpv4 (Ptr<Ipv4> ipv4);

  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;

private:

  Ptr<Ipv4> m_ipv4;

  std::map<Ipv4Address, Ipv4RoutingTableEntry> m_routingTable;

  Ptr<NetDevice> GetNetDevice (uint32_t interface);

  Ptr<MobilityModel> GetMobilityModel (Ptr<NetDevice> netDevice);

  Ipv4Address GetNextHop (Ipv4Address dest);

};

} // namespace ns3

#endif /* ZIGBEE_ROUTING_PROTOCOL_H */

4. Create the Zigbee Protocol Source File

Create the Zigbee routing protocol source file zigbee-routing-protocol.cc in the model directory.

#include “zigbee-routing-protocol.h”

#include “ns3/log.h”

#include “ns3/ipv4-route.h”

#include “ns3/simulator.h”

namespace ns3 {

NS_LOG_COMPONENT_DEFINE (“ZigbeeRoutingProtocol”);

NS_OBJECT_ENSURE_REGISTERED (ZigbeeRoutingProtocol);

TypeId

ZigbeeRoutingProtocol::GetTypeId (void)

{

  static TypeId tid = TypeId (“ns3::ZigbeeRoutingProtocol”)

    .SetParent<Ipv4RoutingProtocol> ()

    .SetGroupName(“Internet”)

    .AddConstructor<ZigbeeRoutingProtocol> ();

  return tid;

}

ZigbeeRoutingProtocol::ZigbeeRoutingProtocol ()

{

}

ZigbeeRoutingProtocol::~ZigbeeRoutingProtocol ()

{

}

void

ZigbeeRoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4)

{

  m_ipv4 = ipv4;

}

Ptr<NetDevice>

ZigbeeRoutingProtocol::GetNetDevice (uint32_t interface)

{

  return m_ipv4->GetNetDevice (interface);

}

 

Ptr<MobilityModel>

ZigbeeRoutingProtocol::GetMobilityModel (Ptr<NetDevice> netDevice)

{

  return netDevice->GetNode ()->GetObject<MobilityModel> ();

}

Ipv4Address

ZigbeeRoutingProtocol::GetNextHop (Ipv4Address dest)

{

  // Simplified example of next hop selection

  if (m_routingTable.find(dest) != m_routingTable.end())

    {

      return m_routingTable[dest].GetGateway();

    }

  return Ipv4Address::GetBroadcast ();

}

Ptr<Ipv4Route>

ZigbeeRoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)

{

  Ipv4Address dest = header.GetDestination ();

  Ipv4Address nextHop = GetNextHop (dest);

 

  if (nextHop == Ipv4Address::GetBroadcast ())

    {

      sockerr = Socket::ERROR_NOROUTETOHOST;

      return nullptr;

    }

  Ptr<Ipv4Route> route = Create<Ipv4Route> ();

  route->SetDestination (dest);

  route->SetGateway (nextHop);

  route->SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (nextHop)));

  return route;

}

bool

ZigbeeRoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)

{

  Ipv4Address dest = header.GetDestination ();

  Ipv4Address nextHop = GetNextHop (dest);

  if (nextHop == Ipv4Address::GetBroadcast ())

    {

      ecb (p, header, Socket::ERROR_NOROUTETOHOST);

      return false;

    }

 

  Ptr<Ipv4Route> route = Create<Ipv4Route> ();

  route->SetDestination (dest);

  route->SetGateway (nextHop);

  route->SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (nextHop)));

  ucb (route, p, header);

  return true;

}

void

ZigbeeRoutingProtocol::NotifyInterfaceUp (uint32_t interface)

{

}

void

ZigbeeRoutingProtocol::NotifyInterfaceDown (uint32_t interface)

{

}

void

ZigbeeRoutingProtocol::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

}

void

ZigbeeRoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

}

void

ZigbeeRoutingProtocol::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const

{

  *stream->GetStream () << “Zigbee Routing Table” << std::endl;

  for (auto const &entry : m_routingTable)

    {

      *stream->GetStream () << entry.first << ” -> ” << entry.second.GetGateway () << ” via ” << entry.second.GetInterface () << std::endl;

    }

}

} // namespace ns3

5. Define Zigbee Helper

Create the Zigbee helper header file zigbee-helper.h in the helper directory.

#ifndef ZIGBEE_HELPER_H

#define ZIGBEE_HELPER_H

#include “ns3/ipv4-routing-helper.h”

#include “zigbee-routing-protocol.h”

namespace ns3 {

class ZigbeeHelper : public Ipv4RoutingHelper

{

public:

  ZigbeeHelper ();

  virtual ~ZigbeeHelper ();

  ZigbeeHelper* Copy (void) const;

  virtual Ptr<Ipv4RoutingProtocol> Create (Ptr<Node> node) const;

};

} // namespace ns3

#endif /* ZIGBEE_HELPER_H */

Create the Zigbee helper source file zigbee-helper.cc in the helper directory.

#include “zigbee-helper.h”

#include “ns3/node.h”

#include “ns3/ipv4.h”

namespace ns3 {

ZigbeeHelper::ZigbeeHelper ()

{

}

ZigbeeHelper::~ZigbeeHelper ()

{

}

ZigbeeHelper*

ZigbeeHelper::Copy (void) const

{

  return new ZigbeeHelper (*this);

}

Ptr<Ipv4RoutingProtocol>

ZigbeeHelper::Create (Ptr<Node> node) const

{

  Ptr<ZigbeeRoutingProtocol> zigbeeRouting = CreateObject<ZigbeeRoutingProtocol> ();

  node->AggregateObject (zigbeeRouting);

  return zigbeeRouting;

}

} // namespace ns3

6. Update CMakeLists.txt

Add the new Zigbee module to the ns-3 build system. Edit src/CMakeLists.txt and add the following line:

add_subdirectory (zigbee)

Create src/zigbee/CMakeLists.txt with the following content:

ns3_add_library (zigbee

    model/zigbee-routing-protocol.cc

    helper/zigbee-helper.cc

)

target_link_libraries (zigbee)

7. Set Up the Network Topology

Create a simulation script in the scratch directory to use the Zigbee protocol.

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/point-to-point-module.h”

#include “ns3/applications-module.h”

#include “ns3/mobility-module.h”

#include “zigbee-helper.h”

using namespace ns3;

int main (int argc, char *argv[])

{

  CommandLine cmd;

  cmd.Parse (argc, argv);

  NodeContainer nodes;

  nodes.Create (10);

  // Set up WiFi (Zigbee typically uses 802.15.4, but for simplicity we use WiFi here)

  WifiHelper wifi;

  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);

  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();

  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();

  wifiPhy.SetChannel (wifiChannel.Create ());

  WifiMacHelper wifiMac;

  wifiMac.SetType (“ns3::AdhocWifiMac”);

  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);

  // Set up mobility model

  MobilityHelper mobility;

  Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();

  mobility.SetPositionAllocator (“ns3::RandomRectanglePositionAllocator”,

                                 “MinX”, DoubleValue (0.0),

                                 “MinY”, DoubleValue (0.0),

                                 “MaxX”, DoubleValue (100.0),

                                 “MaxY”, DoubleValue (100.0));

  mobility.SetMobilityModel (“ns3::RandomWaypointMobilityModel”,

                             “Speed”, StringValue (“ns3::ConstantRandomVariable[Constant=20.0]”),

                             “Pause”, StringValue (“ns3::ConstantRandomVariable[Constant=0.0]”),

                             “PositionAllocator”,StringValue (“ns3::RandomRectanglePositionAllocator[MinX=0.0|MinY=0.0|MaxX=100.0|MaxY=100.0]”));

  mobility.Install (nodes);

  // Install the internet stack on nodes

  InternetStackHelper stack;

  ZigbeeHelper zigbee;

  stack.SetRoutingHelper (zigbee);

  stack.Install (nodes);

  // Assign IP addresses to the devices

  Ipv4AddressHelper address;

  address.SetBase (“10.1.1.0”, “255.255.255.0”);

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  // Set up applications (e.g., a UDP echo server and client)

  UdpEchoServerHelper echoServer (9);

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (9));

  serverApps.Start (Seconds (1.0));

  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (interfaces.GetAddress (9), 9);

  echoClient.SetAttribute (“MaxPackets”, UintegerValue (1));

  echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.0)));

  echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));

  clientApps.Start (Seconds (2.0));

  clientApps.Stop (Seconds (10.0));

  // Enable tracing

  AsciiTraceHelper ascii;

  wifiPhy.EnableAsciiAll (ascii.CreateFileStream (“zigbee-simulation.tr”));

  wifiPhy.EnablePcapAll (“zigbee-simulation”);

  // Run the simulation

  Simulator::Run ();

  Simulator::Destroy ();

  return 0;

}

8. Build and Run the Simulation

After writing your script, we need to build and run it.

./waf build

./waf –run scratch/zigbee-simulation

9. Analyze the Results

After running the simulation, we can analyze the results using the generated trace files (zigbee-simulation.tr and zigbee-simulation-0-0.pcap).

Complete Example Script for Zigbee Protocol

Here’s an example script for reference:

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/wifi-module.h”

#include “ns3/mobility-module.h”

#include “ns3/applications-module.h”

#include “zigbee-helper.h”

using namespace ns3;

int main (int argc, char *argv[])

{

  CommandLine cmd;

  cmd.Parse (argc, argv);

  NodeContainer nodes;

  nodes.Create (10);

  // Set up WiFi (Zigbee typically uses 802.15.4, but for simplicity we use WiFi here)

  WifiHelper wifi;

  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);

  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();

  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();

  wifiPhy.SetChannel (wifiChannel.Create ());

  WifiMacHelper wifiMac;

  wifiMac.SetType (“ns3::AdhocWifiMac”);

  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);

  // Set up mobility model

  MobilityHelper mobility;

  Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();

  mobility.SetPositionAllocator (“ns3::RandomRectanglePositionAllocator”,

                                 “MinX”, DoubleValue (0.0),

                                 “MinY”, DoubleValue (0.0),

                                 “MaxX”, DoubleValue (100.0),

                                 “MaxY”, DoubleValue (100.0));

  mobility.SetMobilityModel (“ns3::RandomWaypointMobilityModel”,

                             “Speed”, StringValue (“ns3::ConstantRandomVariable[Constant=20.0]”),

                             “Pause”, StringValue (“ns3::ConstantRandomVariable[Constant=0.0]”),

                             “PositionAllocator”,StringValue (“ns3::RandomRectanglePositionAllocator[MinX=0.0|MinY=0.0|MaxX=100.0|MaxY=100.0]”));

  mobility.Install (nodes);

  // Install the internet stack on nodes

  InternetStackHelper stack;

  ZigbeeHelper zigbee;

  stack.SetRoutingHelper (zigbee);

  stack.Install (nodes);

  // Assign IP addresses to the devices

  Ipv4AddressHelper address;

  address.SetBase (“10.1.1.0”, “255.255.255.0”);

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  // Set up applications (e.g., a UDP echo server and client)

  UdpEchoServerHelper echoServer (9);

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (9));

  serverApps.Start (Seconds (1.0));

  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (interfaces.GetAddress (9), 9);

  echoClient.SetAttribute (“MaxPackets”, UintegerValue (1));

  echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.0)));

  echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));

  clientApps.Start (Seconds (2.0));

  clientApps.Stop (Seconds (10.0));

  // Enable tracing

  AsciiTraceHelper ascii;

  wifiPhy.EnableAsciiAll (ascii.CreateFileStream (“zigbee-simulation.tr”));

  wifiPhy.EnablePcapAll (“zigbee-simulation”);

  // Run the simulation

  Simulator::Run ();

  Simulator::Destroy ();

  return 0;

}

The implementation of Zigbee protocol in ns3 environment is explained clearly by creating a simple Zigbee routing protocol and its integration into a network simulation. We also create module to handle your Zigbee stack and its functionalities.