Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
            }
        }