/// <summary> /// generate and sent /// </summary> /// <returns></returns> public void GeneratePacketAndSent(bool isRandom, double EnergyDistCnt, double TransDistanceDistCnt, double DirectionDistCnt, double PrepDistanceDistCnt) { PublicParamerters.PackeTSequenceID++; DistributionsComputations relatives = new DistributionsComputations(); List <RoutingRandomVariable> RelativityRows = relatives.ComputeDistributions(this, PublicParamerters.SinkNode, this, EnergyDistCnt, TransDistanceDistCnt, DirectionDistCnt, PrepDistanceDistCnt); if (RelativityRows != null) { SeletNextHopRandomlly randomGenrator = new SeletNextHopRandomlly(); RoutingRandomVariable nextHop = randomGenrator.SelectNextHop(RelativityRows); if (nextHop != null) { if (RelativityRows.Count > 0) { Datapacket datap = new Datapacket(this, nextHop.NextHopNode); datap.ForwardingRandomNumber = randomGenrator.RandomeNumber; datap.SourceNode = this; datap.SourceNodeID = ID; datap.Path = this.ID.ToString(); // start datap.Distance = Operations.DistanceBetweenTwoSensors(PublicParamerters.SinkNode, this); datap.IsRandomControls = isRandom; datap.EnergyDistCnt = EnergyDistCnt; datap.TransDistanceDistCnt = TransDistanceDistCnt; datap.DirectionDistCnt = DirectionDistCnt; datap.PrepDistanceDistCnt = PrepDistanceDistCnt; datap.RoutingZoneWidthCnt = Settings.Default.ZoneWidthCnt; NumberofPacketsGeneratedByMe++; datap.RoutingProbabilityForPath = nextHop.RoutingVariableProb; datap.PacektSequentID = PublicParamerters.PackeTSequenceID; SendData(this, nextHop.NextHopNode, datap);// send the data: if (Settings.Default.ShowRoutigZone) { DrawMyZone(); } } this.lbl_Sensing_ID.Foreground = Brushes.Red; // this.lbl_Sensing_ID.FontWeight = FontWeights.Bold; //: historial record: if (Settings.Default.KeepLogs) { HistoricalRelativityRows.AddRange(RelativityRows); } } } }
/// <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!"); } } } }