public override bool SendPacketDirectly(float time, Packet pkg) { float recv_time = 0; pkg.Prev = Id; global.PacketSeq++; if (pkg.Type == PacketType.AODV_REQUEST) Console.WriteLine("{0:F4} [{1}] {2}{3} sends to {4}{5}({6}->{7}->{8})", time, pkg.Type, this.type, this.Id, pkg.NextType, (pkg.Next == -1 ? "all" : pkg.Next.ToString()), pkg.Src, pkg.Dst, ((AODVRequest)pkg.Data).dst); else if (pkg.Type == PacketType.AODV_REPLY) Console.WriteLine("{0:F4} [{1}] {2}{3} sends to {4}{5}({6}->{7}->{8})", time, pkg.Type, this.type, this.Id, pkg.NextType, (pkg.Next == -1 ? "all" : pkg.Next.ToString()), pkg.Src, pkg.Dst, ((AODVReply)pkg.Data).dst); else Console.WriteLine("{0:F4} [{1}] {2}{3} sends to {4}{5}({6}->{7})", time, pkg.Type, this.type, this.Id, pkg.NextType, (pkg.Next == -1 ? "all" : pkg.Next.ToString()), pkg.Src, pkg.Dst); if (pkg.Next == BroadcastNode.Node.Id) //Broadcast { List<Reader> list = GetAllNearReaders(global.nodeMaxDist, true); if (list.Count == 0) return true; this.packetCounter++; if (pkg.seqInited == false) //如果packetSeq小于0,则说明未定该数据包的id this.packetSeq++; for (int i = 0; i < list.Count; i++) { Packet pkg1 = pkg.Clone() as Packet; pkg1.DelPacketNode = list[0].Id; if (pkg1.seqInited == false) { pkg1.PrevSenderSeq = this.packetSeq; if (pkg.Src == Id) pkg1.SrcSenderSeq = pkg1.PrevSenderSeq; } //Console.WriteLine("+packet count: {0}->{1} {2}_{3}", pkg.Prev, pkg.Next, global.readers[pkg.Prev].packetCounter,pkg.PacketSeq); recv_time = global.processDelay + (float)(Utility.Distance(this, list[i]) / global.lightSpeed); Event.AddEvent( new Event(time + recv_time, EventType.RECV, list[i], pkg1)); } } else { pkg.PrevType = type; pkg.Prev = Id; switch (pkg.NextType) { case NodeType.READER: //bool fail = false; List<Reader> list = GetAllNearReaders(global.nodeMaxDist, true); Reader nextNode = (Reader)Node.getNode(pkg.Next, NodeType.READER); if (!list.Contains(global.readers[pkg.Next])) //节点未在区域内,删除该节点,0.2秒后重试 { Console.WriteLine("{0:F4} [{1}] {2}{3} drop data of {4}{5} due to sending failture.", scheduler.currentTime, pkg.Type, this.type, this.Id, pkg.NextType, pkg.Next); this.Neighbors.Remove(pkg.Next); this.routeTable.Remove(pkg.Dst); if (retryOnSendingFailture == true && (pkg.Type != PacketType.BEACON && pkg.Type != PacketType.AODV_REPLY && pkg.Type != PacketType.AODV_REQUEST)) { pkg.forceDiscovery = true; string pkgId = pkg.getId(); if (this.receivedPackets.Contains(pkgId)) this.receivedPackets.Remove(pkgId); Event.AddEvent(new Event(scheduler.currentTime + 0.2f, EventType.SND_DATA, this, pkg)); Console.WriteLine("retry"); //fail = true; return false; } list.Add(global.readers[pkg.Next]); } int totalPackets = 0; foreach (Reader r in list) totalPackets += r.packetCounter; this.packetCounter++; //Console.WriteLine("+packet count: {0}->{1} {2}_{3}", pkg.Prev, pkg.Next, global.readers[pkg.Prev].packetCounter,pkg.PacketSeq); double prop = (totalPackets > 90) ? (0.1) : totalPackets / (-100.0) + 1.0; if (pkg.seqInited == false) //如果packetSeq小于0,则说明未定该数据包的id this.packetSeq++; for (int i = 0; i < list.Count; i++) { while (true) { double ran = Utility.U_Rand(1); recv_time += global.processDelay; if (ran < prop) break; } Packet pkg1 = pkg.Clone() as Packet; if (pkg1.seqInited == false) { pkg1.PrevSenderSeq = this.packetSeq; if (pkg.Src == Id) pkg1.SrcSenderSeq = pkg1.PrevSenderSeq; } //Console.WriteLine("[DEBUG] recv reader{0}-{1}", list[i].id, pkg1.PacketSeq); recv_time += (float)(Utility.Distance(this, (MobileNode)list[i]) / global.lightSpeed); /* if (list[i].id == pkg.Next && fail == false) { PointShape nextPoint1 = scheduler.NextReaderPosition(nextNode, recv_time); PointShape nextPoint2 = scheduler.NextReaderPosition(this, recv_time); if (Utility.Distance(nextPoint1.x, nextPoint1.y, nextPoint2.x, nextPoint2.y) > global.nodeMaxDist) { Console.WriteLine("{0:F4} [{1}] {2}{3} Drop data of {4}{5} due to sending failture.", scheduler.CurrentTime, pkg.Type, this.type, this.id, pkg.NextType, pkg.Next); this.Neighbors.Remove(pkg.Next); this.routeTable.Remove(pkg.Dst); if (retryOnSendingFailture == true || (pkg.Type != PacketType.BEACON && pkg.Type != PacketType.AODV_REPLY && pkg.Type != PacketType.AODV_REQUEST)) { Event.AddEvent(new Event(scheduler.CurrentTime + 0.2f, EventType.SND_DATA, this, pkg)); Console.WriteLine("retry"); return; } } } * */ Event.AddEvent( new Event(time + recv_time, EventType.RECV, list[i], pkg1)); } break; case NodeType.SERVER: recv_time = global.processDelay + global.internetDelay; Event.AddEvent( new Event(time + recv_time, EventType.RECV, global.server, pkg)); break; case NodeType.ORG: recv_time = global.processDelay + global.internetDelay; Event.AddEvent( new Event(time + recv_time, EventType.RECV, global.orgs[pkg.Next], pkg)); break; case NodeType.QUERIER: recv_time = global.processDelay + global.internetDelay; Event.AddEvent( new Event(time + recv_time, EventType.RECV, global.queriers[pkg.Next], pkg)); break; case NodeType.OBJECT: Node node = global.objects[pkg.Next]; recv_time = global.processDelay + (float)(Utility.Distance(this, (MobileNode)node) / global.lightSpeed); Event.AddEvent( new Event(time + recv_time, EventType.RECV, node, pkg)); break; default: Console.WriteLine("Error Type!"); break; } } return true; }
public virtual bool RoutePacket(Packet pkg) { Node node; int dst = pkg.Dst; InitPacketSeq(pkg); string pkgId = pkg.getId(); if (global.debug) Console.WriteLine("[Debug] pkgId:{0}", pkgId); if (!this.receivedPackets.Contains(pkgId)) this.receivedPackets.Add(pkgId); else return true; if (pkg.PrevType == NodeType.READER) { if (pkg.Prev != Id)//itself { node = global.readers[pkg.Prev]; if (!Neighbors.ContainsKey(node.Id)) return false; } } else if (pkg.PrevType == NodeType.OBJECT)//from the object. { node = global.objects[pkg.Prev]; if (!NearbyObjectCache.ContainsKey(node.Id)) return false; } else if (this.IsGateway == false)//Server, Querier, Org or CA { return false; } // to itself if (pkg.Dst == Id && pkg.DstType == NodeType.READER) { Console.WriteLine("{0:F4} [{1}] {2}{3}->{4}{5}, total: {6}", scheduler.currentTime, "RECV_DATA", pkg.SrcType, pkg.Src, this.type, this.Id, scheduler.currentTime - pkg.beginSentTime); return true; } if (this.IsGateway == false)//the node is not a gateway { //to server, then get the nearest gateway. if (pkg.DstType == NodeType.SERVER || pkg.DstType == NodeType.ORG) { if (this.gatewayEntities.Count == 0) { Console.WriteLine("{0:F4} [{1}] {2}{3} Drop due to no gateway", scheduler.currentTime, pkg.Type, this.type, this.Id); return false; } GatewayEntity gateway = FindNearestGateway(); //gateway cache? save time if (global.CheckGatewayCache && gateway != null) { Packet pkg1 = pkg.Clone() as Packet; pkg1.Next = gateway.next; pkg1.NextType = NodeType.READER; SendPacketDirectly(scheduler.currentTime, pkg1); return true; } dst = gateway.gateway; } } else //the node is a gateway { if (pkg.DstType != NodeType.READER)//To server, object etc { //这里需要新增一个数据包,否则在监控现象的时候容易弄错 Packet pkg1 = pkg.Clone() as Packet; pkg1.Prev = this.Id; pkg1.PrevType = NodeType.READER; pkg1.Next = pkg.Dst; pkg1.NextType = pkg.DstType; SendPacketDirectly(scheduler.currentTime, pkg1); return true; } } //have to flood... SendAODVData(pkg, dst); return true; }
public override void ProcessPacket(Packet pkg) { //I send the packet myself, ignore if (pkg.Prev == Id && pkg.PrevType == type) { return; } if (this.IsMalicious() && pkg.Dst != Id) { if (pkg.Type == PacketType.DATA && global.DropData == true) { Console.WriteLine("{0:F4} [{1}] {2}{3} Drop data of {4}{5} due to bad node. packet ident:{6}", scheduler.currentTime, pkg.Type, this.type, this.Id, pkg.PrevType, pkg.Prev, pkg.getId()); return; } } switch (pkg.Type) { //Readers case PacketType.BEACON: RecvBeacon(pkg); break; case PacketType.EVENT_REPORT: Console.WriteLine("{0:F4} [{1}] {2}{3} recv from {4}{5}", scheduler.currentTime, pkg.Type, this.type, this.Id, pkg.PrevType, pkg.Prev); RecvEventReport(pkg); break; //Some codes are hided in the base class. default: base.ProcessPacket(pkg); return; } }