/// <summary> /// redunduant transmisin /// </summary> /// <param name="pacekt"></param> /// <param name="reciverNode"></param> public void RedundantTransmisionCost(Packet pacekt, Sensor reciverNode) { // logs. PublicParamerters.TotalReduntantTransmission += 1; double UsedEnergy_Nanojoule = EnergyModel.Receive(128); // preamble packet length. double UsedEnergy_joule = ConvertToJoule(UsedEnergy_Nanojoule); reciverNode.ResidualEnergy = reciverNode.ResidualEnergy - UsedEnergy_joule; pacekt.UsedEnergy_Joule += UsedEnergy_joule; PublicParamerters.TotalEnergyConsumptionJoule += UsedEnergy_joule; PublicParamerters.TotalWastedEnergyJoule += UsedEnergy_joule; reciverNode.MainWindow.Dispatcher.Invoke(() => reciverNode.MainWindow.lbl_Redundant_packets.Content = PublicParamerters.TotalReduntantTransmission); reciverNode.MainWindow.Dispatcher.Invoke(() => reciverNode.MainWindow.lbl_Wasted_Energy_percentage.Content = PublicParamerters.WastedEnergyPercentage); }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="reciver"></param> /// <param name="datap"></param> public void ReceiveData(Sensor sender, Sensor reciver, Datapacket datap) { if (reciver != null || sender != null) { if (reciver.ID != PublicParamerters.SinkNode.ID) { if (reciver.ID != sender.ID) { if (reciver.ResidualEnergy > 0) { SensorRoutingLog log = new SensorRoutingLog(); log.IsReceive = true; log.NodeID = this.ID; log.Operation = "From:" + sender.ID; log.Time = DateTime.Now; log.Distance_M = Operations.DistanceBetweenTwoSensors(reciver, sender); log.UsedEnergy_Nanojoule = EnergyModel.Receive(RoutingDataLength); log.PID = datap.PacektSequentID; // set the remain battery Energy: if (reciver.ID != PublicParamerters.SinkNode.ID) { double remainEnergy = ResidualEnergy - log.UsedEnergy_Joule; reciver.ResidualEnergy = remainEnergy; log.RemaimBatteryEnergy_Joule = ResidualEnergy; PublicParamerters.TotalEnergyConsumptionJoule += log.UsedEnergy_Joule; } // routing distance: datap.Path += ">" + reciver.ID; datap.RoutingDistance += log.Distance_M; datap.Hops += 1; datap.UsedEnergy_Joule += log.UsedEnergy_Joule; datap.Delay += DelayModel.DelayModel.Delay(sender, reciver); if (Settings.Default.KeepLogs) { reciver.Logs.Add(log); // keep logs for each node. } else { Dispose(); } if (datap.Hops > datap.MaxHops) { datap.IsDelivered = false; PublicParamerters.SinkNode.PacketsList.Add(datap); PublicParamerters.NumberofDropedPacket += 1; } else { // relay: RelayThePacket(reciver, datap);// relay the packet: } } else { if (Settings.Default.StopeWhenFirstNodeDeid) { MainWindow.TimerCounter.Stop(); MainWindow.RandomSelectSourceNodesTimer.Stop(); MainWindow.stopSimlationWhen = PublicParamerters.SimulationTime; /*ExpReport win = new ExpReport(MainWindow); * win.Show();*/ MainWindow.top_menu.IsEnabled = true; } } } else { MessageBox.Show("Error, The sender and reciver are the same!"); } } else { // recive the packet by the sink: SensorRoutingLog log = new SensorRoutingLog(); log.IsReceive = true; log.NodeID = this.ID; log.Operation = "From:" + sender.ID; log.Time = DateTime.Now; log.Distance_M = Operations.DistanceBetweenTwoSensors(reciver, sender); log.UsedEnergy_Nanojoule = EnergyModel.Receive(RoutingDataLength); log.PID = datap.PacektSequentID; // set the remain battery Energy: if (reciver.ID != PublicParamerters.SinkNode.ID) { double remainEnergy = ResidualEnergy - log.UsedEnergy_Joule; reciver.ResidualEnergy = remainEnergy; log.RemaimBatteryEnergy_Joule = ResidualEnergy; PublicParamerters.TotalEnergyConsumptionJoule += log.UsedEnergy_Joule; } // routing distance: datap.Path += ">" + reciver.ID; datap.RoutingDistance += log.Distance_M; datap.Hops += 1; datap.UsedEnergy_Joule += log.UsedEnergy_Joule; datap.Delay += DelayModel.DelayModel.Delay(sender, reciver); datap.IsDelivered = true; if (Settings.Default.KeepLogs) { datap.IsDelivered = true; PublicParamerters.NumberofDeliveredPacket += 1; PublicParamerters.SinkNode.PacketsList.Add(datap); PublicParamerters.RoutingDistanceEffeciency += datap.RoutingDistanceEfficiency; PublicParamerters.TotalNumberOfHope += datap.Hops; PublicParamerters.TransmissionDistanceEff += datap.TransDistanceEfficiency; PublicParamerters.TotalWaitingTime += datap.PacketWaitingTimes; } else { PublicParamerters.NumberofDeliveredPacket += 1; PublicParamerters.RoutingDistanceEffeciency += datap.RoutingDistanceEfficiency; PublicParamerters.TotalNumberOfHope += datap.Hops; PublicParamerters.TransmissionDistanceEff += datap.TransDistanceEfficiency; PublicParamerters.TotalWaitingTime += datap.PacketWaitingTimes; Dispose(); } } } else { MessageBox.Show("Error. Reciver or Sender is Null."); } }
/// <summary> /// reciev data /// </summary> public void ReceivePacekt(Sensor SenderSensor, Datapacket datap) { if (SenderSensor != null) { if (SenderSensor.ID != this.ID) { if (ResidualEnergy > 0) { SensorRoutingLog log = new SensorRoutingLog(); log.IsReceive = true; log.NodeID = this.ID; log.Operation = "Receive Data From:" + SenderSensor.ID; log.Time = DateTime.Now; log.Distance_M = Operations.DistanceBetweenTwoSensors(this, SenderSensor); log.UsedEnergy_Nanojoule = EnergyModel.Receive(PublicParamerters.RoutingDataLength); // set the remain battery Energy: double remainEnergy = ResidualEnergy - log.UsedEnergy_Joule; ResidualEnergy = remainEnergy; log.RemaimBatteryEnergy_Joule = ResidualEnergy; if (PublicParamerters.SaveNetworkRecords) { this.RoutingOperationsLog.Add(log); } datap.UsedEnergy_Joule += log.UsedEnergy_Joule; // routing distance: datap.Path += ">" + datap.Reciver.ID; datap.RoutingDistance += log.Distance_M; datap.Hops += 1; datap.UsedEnergy_Joule += log.UsedEnergy_Joule; datap.Delay += DelayModel.DelayModel.Delay(datap.Sender, datap.Reciver); log.RelaySequence = datap.Hops; log.PID = datap.PacektSequentID; // Fowrward: colone Datapacket forwardPacket = new Datapacket(); forwardPacket.SourceNodeID = datap.SourceNodeID; forwardPacket.Distance = datap.Distance; forwardPacket.RoutingDistance = datap.RoutingDistance; forwardPacket.Path = datap.Path; forwardPacket.Hops = datap.Hops; forwardPacket.UsedEnergy_Joule = datap.UsedEnergy_Joule; forwardPacket.Delay = datap.Delay; forwardPacket.SourceNode = datap.SourceNode; forwardPacket.PacektSequentID = datap.PacektSequentID; Sensor RelayNode = datap.Reciver; if (RelayNode.ID == PublicParamerters.SinkNode.ID) { PublicParamerters.SinkNode.PacketsList.Add(datap); } else { // FORWARD: RelayNode.SendPacekt(datap.Reciver, forwardPacket); } } else { this.Ellipse_Sensing_range.Fill = Brushes.Brown; // die out node // MessageBox.Show("DeadNODE!"); } } } }
/// <summary> /// /// </summary> /// <param name="FromSensor"></param> /// <param name="ToSensor"></param> /// <param name="datap"></param> public void ReceiveData(Sensor FromSensor, Sensor ToSensor, Datapacket datap) { if (ToSensor != null || FromSensor != null) { if (ToSensor.ID != FromSensor.ID) { if (ToSensor.ResidualEnergy > 0) { SensorRoutingLog log = new SensorRoutingLog(); log.IsReceive = true; log.NodeID = this.ID; log.Operation = "From:" + FromSensor.ID; log.Time = DateTime.Now; log.Distance_M = Operations.DistanceBetweenTwoSensors(ToSensor, FromSensor); log.UsedEnergy_Nanojoule = EnergyModel.Receive(RoutingDataLength); log.PID = datap.PacektSequentID; // set the remain battery Energy: if (ToSensor.ID != PublicParamerters.SinkNode.ID) { double remainEnergy = ResidualEnergy - log.UsedEnergy_Joule; ToSensor.ResidualEnergy = remainEnergy; log.RemaimBatteryEnergy_Joule = ResidualEnergy; } // routing distance: datap.Path += ">" + ToSensor.ID; datap.RoutingDistance += log.Distance_M; datap.Hops += 1; datap.UsedEnergy_Joule += log.UsedEnergy_Joule; datap.Delay += DelayModel.DelayModel.Delay(FromSensor, ToSensor); // random: if (datap.IsRandomControls) { // forward: with random random controls: // calculate adil relatives: Sensor RelayNode = ToSensor; DistributionsComputations relatives = new DistributionsComputations(); List <double> Controls = RandomControls.Generate4Controls(); List <RoutingRandomVariable> RelativityRows = relatives.ComputeDistributions(datap.SourceNode, PublicParamerters.SinkNode, RelayNode, Controls[0], Controls[1], Controls[2], Controls[3]); SeletNextHopRandomlly randomGenrator = new SeletNextHopRandomlly(); RoutingRandomVariable nextHop = randomGenrator.SelectNextHop(RelativityRows); if (nextHop != null) // not the sink { //: historial record: if (Settings.Default.KeepLogs) { // log.ForwardingRandomNumber = datap.ForwardingRandomNumber; ToSensor.Logs.Add(log); // add the log HistoricalRelativityRows.AddRange(RelativityRows); // add the log } // forward: Datapacket forwardPacket; if (RelativityRows.Count > 0) { Sensor NextHopNode = nextHop.NextHopNode; forwardPacket = new Datapacket(RelayNode, NextHopNode); forwardPacket.ForwardingRandomNumber = randomGenrator.RandomeNumber; forwardPacket.SourceNodeID = datap.SourceNodeID; forwardPacket.Distance = datap.Distance; forwardPacket.RoutingDistance = datap.RoutingDistance; forwardPacket.Path = datap.Path; forwardPacket.Hops = datap.Hops; forwardPacket.UsedEnergy_Joule = datap.UsedEnergy_Joule; forwardPacket.Delay = datap.Delay; forwardPacket.SourceNode = datap.SourceNode; forwardPacket.IsRandomControls = true; forwardPacket.RoutingZoneWidthCnt = datap.RoutingZoneWidthCnt; forwardPacket.EnergyDistCnt = Controls[0]; forwardPacket.TransDistanceDistCnt = Controls[1]; forwardPacket.DirectionDistCnt = Controls[2]; forwardPacket.PrepDistanceDistCnt = Controls[3]; forwardPacket.RoutingProbabilityForPath = datap.RoutingProbabilityForPath * nextHop.RoutingVariableProb; forwardPacket.PacektSequentID = datap.PacektSequentID; RelayNode.SendData(RelayNode, NextHopNode, forwardPacket); } } else // this sink: { if (RelayNode.ID == PublicParamerters.SinkNode.ID) { RelayNode.PacketsList.Add(datap); } } } else { // forward: without random controls: // calculate adil relatives: Sensor RelayNode = ToSensor; DistributionsComputations relatives = new DistributionsComputations(); List <RoutingRandomVariable> RelativityRows = relatives.ComputeDistributions(datap.SourceNode, PublicParamerters.SinkNode, RelayNode, Settings.Default.EnergyDistCnt, Settings.Default.TransDistanceDistCnt, Settings.Default.DirectionDistCnt, Settings.Default.PrepDistanceDistCnt); SeletNextHopRandomlly randomGenrator = new SeletNextHopRandomlly(); RoutingRandomVariable nextHop = randomGenrator.SelectNextHop(RelativityRows); if (nextHop != null) // not the sink { //: historial record: if (Settings.Default.KeepLogs) { // log.ForwardingRandomNumber = datap.ForwardingRandomNumber; ToSensor.Logs.Add(log); // add the log HistoricalRelativityRows.AddRange(RelativityRows); // add the log } // forward: Datapacket forwardPacket; if (RelativityRows.Count > 0) { Sensor NextHopNode = nextHop.NextHopNode; forwardPacket = new Datapacket(RelayNode, NextHopNode); forwardPacket.ForwardingRandomNumber = randomGenrator.RandomeNumber; forwardPacket.SourceNodeID = datap.SourceNodeID; forwardPacket.Distance = datap.Distance; forwardPacket.RoutingDistance = datap.RoutingDistance; forwardPacket.Path = datap.Path; forwardPacket.Hops = datap.Hops; forwardPacket.UsedEnergy_Joule = datap.UsedEnergy_Joule; forwardPacket.Delay = datap.Delay; forwardPacket.SourceNode = datap.SourceNode; forwardPacket.RoutingZoneWidthCnt = datap.RoutingZoneWidthCnt; forwardPacket.IsRandomControls = false; forwardPacket.PrepDistanceDistCnt = datap.PrepDistanceDistCnt; forwardPacket.TransDistanceDistCnt = datap.TransDistanceDistCnt; forwardPacket.EnergyDistCnt = datap.EnergyDistCnt; forwardPacket.DirectionDistCnt = datap.DirectionDistCnt; forwardPacket.RoutingProbabilityForPath = datap.RoutingProbabilityForPath * nextHop.RoutingVariableProb; forwardPacket.PacektSequentID = datap.PacektSequentID; RelayNode.SendData(RelayNode, NextHopNode, forwardPacket); } } else // this sink: { if (RelayNode.ID == PublicParamerters.SinkNode.ID) { RelayNode.PacketsList.Add(datap); } } } } else { this.Ellipse_Communication_range.Fill = Brushes.Brown;// die out node // MessageBox.Show("DeadNODE!"); } } } }