Skip to main content
. 2021 Jun 26;21(13):4376. doi: 10.3390/s21134376
Algorithm 1: REBORN
Variables:
1:  aTimeri; {Time spent in activity state}
2:  eTimeri; {Time spent in energy-saving state}
3:  discTimeri; {Time spent in the discovery state}
4:  remTimeActi; {Remaining time for the node to exit the active state}
5:  state := discovery; {Current node state}
6:  routeConfi := false; {Routing message received}
7:  sinkDisti; {Distance to the sink}
8:  gridIDi; {Identification of the cell}
9:  msgi; {Identifier of incoming data messages}
Input:
10:  Sink node sends routing message
 Action:
11:  sendRouteMsg(sinkPosi)  {Sink initiates a controlled flooding}
Input:
12:  Regular nodes receive routing message (msgRoute)
 Action:
13:  if !routeConfi then {Was message received?}
14:   routeConfi := true; {Confirmed message}
15:   sinkDisti := getDist(msgRoute.sinkPosi); {Compute distance of sink}
16:   sendRouteMsg(sinkPosi); {Forward the message}
17:   gridID := getGrid(nodePos); {Compute the grid ID}
18:  end if
Input:
19:  Regular nodes enter in discovery state
 Action
20:  discTimeri := Constant {Update discTimeri value}
21:  aTimeri := remTimerActi := getTimeToSend(); {Compute the send time}
22:  timerdiscTimeri.trigger() {Time to node change the state}
23:  sendDiscMessage(nodeID, gridID, remTimeAct, state, energyBat);
Input:
24:  Regular nodes receive discovery message (msgDis)
 Action
25:  if state == discovery and msgDis.state == active then {High priority?}
26:   eTimeri := msgDis.remTimeAct; state := sleep;
27:  else if state == msgDis.state then {Are nodes in same state ?}
28:   if energyBat < msgDis.energyBat then {Is my energy bigger ?}
29:    eTimer := msgDis.remTimeAct; state := sleep;
30:   end if
31:  end if
Input:
32:  TimerdiscTimeri fire
 Action
33:  state := active {The elected node changes to active state}
Input:
34:  Elected nodes enter in active state
 Action
35:  discTimeri := aTimeri/6; {Update discTimeri value}
36:  TimeraTimeri.trigger(); {Time to node change state}
37:  TimeraTimeri/2.trigger(); {Time to node send the data message}
38:  TimerDiscTimeri.trigger(); {Time for node to send the discovery message}
Input:
39:  TimerDiscTimeri fire
 Action:
40:  remTimeActi := timeraTimer.remainingTime(); {Update remTimeActi with rest time of aTimeri}
41:  sendDiscMessage(nodeID, gridID, remTimeAct, state, energyBat);
Input:
42:  TimeraTimeri/2 fire
 Action:
43:  sendDataMessage(data, msgi, sinkDist);
Input:
44:  Nodes in active state receive data message (msgDat)
 Action:
45:  if sinkDisti < msgDat.sinkDistiand !checkID(msg.Dat.msgi) then
46:   sendDataMessage(msgDat.date, msg.Dat.msgi, distSink);
47:   msgi.add(msg.Dat.msgi); {Storage msgi}
48:  end if
Input:
49:  Nodes not elected enter in the sleep state
 Action:
50:  timereTimeri.trigger(); {Time to node change state}
Input:
51:  TimeraTimer or TimereTimeri fire
 Action:
52:  state := discovery; {Restart the process}