Opportunistic Xbee optimization in a mobile mesh network.
Go to file
Adrien Marquès a2688fa19d git ignore test folders 2018-12-04 17:14:32 +01:00
libraries add libraries 2018-12-02 21:42:34 +01:00
node/main make node routine#0 to be non-blocking before each MESSAGE_TIMEOUT | add node routine#1 to print and propagate/ignore discover requests and messages data 2018-12-04 11:47:19 +01:00
well/main make node routine#0 to be non-blocking before each MESSAGE_TIMEOUT | add node routine#1 to print and propagate/ignore discover requests and messages data 2018-12-04 11:47:19 +01:00
.gitignore git ignore test folders 2018-12-04 17:14:32 +01:00
README.md fix readme 2018-12-02 21:57:31 +01:00
lcd.h add 'lcd' library (LCDWrapper) that implements formatting + autoscroll | use rich formatting in entrypoints (.ino) | make well routine#0 to be non-blocking before each WAVE_TIMEOUT | add well routine#1 to receive and print messages 2018-12-04 09:43:11 +01:00
packet.cpp add 'lcd' library (LCDWrapper) that implements formatting + autoscroll | use rich formatting in entrypoints (.ino) | make well routine#0 to be non-blocking before each WAVE_TIMEOUT | add well routine#1 to receive and print messages 2018-12-04 09:43:11 +01:00
packet.h add 'lcd' library (LCDWrapper) that implements formatting + autoscroll | use rich formatting in entrypoints (.ino) | make well routine#0 to be non-blocking before each WAVE_TIMEOUT | add well routine#1 to receive and print messages 2018-12-04 09:43:11 +01:00
protocol.h make node routine#0 to be non-blocking before each MESSAGE_TIMEOUT | add node routine#1 to print and propagate/ignore discover requests and messages data 2018-12-04 11:47:19 +01:00
xbee_wrapper.cpp add 'lcd' library (LCDWrapper) that implements formatting + autoscroll | use rich formatting in entrypoints (.ino) | make well routine#0 to be non-blocking before each WAVE_TIMEOUT | add well routine#1 to receive and print messages 2018-12-04 09:43:11 +01:00
xbee_wrapper.h add 'lcd' library (LCDWrapper) that implements formatting + autoscroll | use rich formatting in entrypoints (.ino) | make well routine#0 to be non-blocking before each WAVE_TIMEOUT | add well routine#1 to receive and print messages 2018-12-04 09:43:11 +01:00

README.md

| Opportunistic ZigBee |

I. Overview

This project aims to design and optimize a solution for an optimistic network using Arduino and XBee.

The base scenario takes place in a mesh network of similar nodes ; each being subject to real-time motion. Every node has to transmit logging data (i.e. periodically) to a special node : the **well ** ; the well is unique in the network and is the only one that actually receives data, every other node has the same source code and behavior.

Main goals :

  1. Optimize network usage : limit duplicates and retransmissions
  2. Maximize relative space-awareness throughout time : avoid losses and retransmissions
  3. [TODO]

Vocabulary

  • distance - the relative distance to the well. The well has a distance of 0, its direct neighbors a distance of 1 and so on.

  • wave - a propagation of distances throughout the network that share a common source.


II. File structure

The code is split over 2 sub-projects :

  • the well, located inside well/main/.
  • nodes, located in the node/main folder.

The project bundles its required libraries - for compatibility purposes - inside the libraries/ folder. Symbolic links make them available for each sub-project.


III. Algorithm

1) Data structure

Every communication follows a consistent data format which can be split into 2 types ; the first byte (i.e. called opcode) allows receivers to identity the data type.

Discover Request

The discover request is used to propagate the relative distances throughout the network. The well is the only node that can initiate a discover request, other nodes only make sure of the propagation.

struct discover {
    uint8_t opcode; // opcode = 0
    uint8_t wave;   // wave id (overflows at 255 ; uint8_t)
    uint8_t dist;   // current node's distance
};
Data Message

The data format is sent by nodes to submit messages to the well.

struct message {
    uint8_t opcode; // opcode = 1
    uint8_t dist;   // distance of the last sender
    uint8_t ttl;    // time to live default = 10
    uint8_t size;   // size of message in bytes
    uint8_t data[]; // actual message
};

2) Well

The well features 2 routines :

  1. Send discover requests periodically.
  2. Listen for incoming data.

3) Nodes

[TODO]