Exemplo n.º 1
0
 public override void ProcessEvent(Node node, Event e)
 {
     if (node.type == NodeType.READER)
     {
         IOTReader reader = (IOTReader)node;
         switch (e.Type)
         {
             case EventType.CHK_RT_TIMEOUT:
                 reader.CheckRoutine();
                 break;
             case EventType.CHK_EVENT_TIMEOUT:
                 reader.CheckEvents();
                 break;
             default:
                 base.ProcessEvent(node, e);
                 break;
         }
         return;
     }
     else if (node.type == NodeType.ORG)
     {
         IOTOrganization org = (IOTOrganization)node;
         switch (e.Type)
         {
             case EventType.CHK_RT_TIMEOUT:
                 org.CheckRoutine();
                 break;
             default:
                 base.ProcessEvent(node, e);
                 break;
         }
     }
     else if (node.type == NodeType.OBJECT)
     {
         IOTObjectNode obj = (IOTObjectNode)node;
         switch (e.Type)
         {
             default:
                 base.ProcessEvent(node, e);
                 break;
         }
     }
     else if (node.type == NodeType.TRUST_MANAGER)
     {
         IOTTrustManager tm = (IOTTrustManager)node;
         switch (e.Type)
         {
             case EventType.CHK_RT_TIMEOUT:
                 tm.CheckRoutine();
                 break;
             default:
                 base.ProcessEvent(node, e);
                 break;
         }
     }
     else
     {
         base.ProcessEvent(node, e);
     }
 }
Exemplo n.º 2
0
 public override void ProcessEvent(Node node, Event e)
 {
     PrivacyReader reader = (PrivacyReader)node;
     switch (e.Type)
     {
         case EventType.K_ANONY:
             reader.JoinAnonyGroup(e.Obj);
             break;
         case EventType.CHK_SUBTREE:
             reader.CheckSubTree(e.Obj);
             break;
             /*
         case EventType.CHK_NEWGROUP:
             reader.CheckNewGroup(e.Obj);
             break;
              */
         case EventType.CHK_NATGROUP:
             reader.CheckNativeGroupResponse(e.Obj);
             break;
         case EventType.CHK_NATGROUP1:
             reader.CheckNativeLargeGroupResponse(e.Obj);
             break;
         default:
             base.ProcessEvent(node, e);
             break;
     }
 }
Exemplo n.º 3
0
 public override void ProcessEvent(Node node, Event e)
 {
     switch (e.Type)
     {
         case EventType.CHK_CERT:
             ((VANETReader)node).CheckCertificate((CertificateArg)e.Obj);
             break;
         default:
             base.ProcessEvent(node, e);
             break;
     }
 }
Exemplo n.º 4
0
 public override void ProcessEvent(Node node, Event e)
 {
     MODReader reader = (MODReader)node;
     switch (e.Type)
     {
         case EventType.CHK_RT_TIMEOUT:
             reader.CheckRoutine();
             break;
         case EventType.CHK_RECV_PKT:
             reader.CheckReceivedPacket((MODPhenomemon)e.Obj);
             break;
         case EventType.DEDUCE_EVENT:
             reader.DeduceEventType((string)e.Obj);
             break;
         case EventType.FWD_EVENT_REPORT:
             reader.ForwardEventReport((string)e.Obj);
             break;
         default:
             base.ProcessEvent(node, e);
             break;
     }
 }
Exemplo n.º 5
0
        public override void ProcessEvent(Node node, Event e)
        {
            HFReader reader = (HFReader)node;
            switch (e.Type)
            {
                case EventType.CHK_SW_NB:
                    ((SWReader)reader).CheckSmallWorldNeighbors(e.Obj);
                    break;
                case EventType.SND_DATA:
                    Packet pkg = (Packet)e.Obj;
                    HFGlobal global = (HFGlobal)Global.getInstance();
                    global.currentSendingTags = pkg.Tags;
                    if (pkg.inited == false && pkg.Src == node.Id && pkg.Type == PacketType.DATA)
                    {
                        double distance = Utility.Distance((MobileNode)node, (MobileNode)Node.getNode(pkg.Dst, NodeType.READER));

                        double mindist = global.minSrcDstDist;
                        //为了控制在mindist左右,设置了距离上限
                        int count = 0;
                        while (distance < mindist || distance >mindist+100 && count++ < 20)
                        {
                            int orgId = ((Reader)node).OrgId;
                            Organization org = (Organization)Node.getNode(orgId, NodeType.ORG);
                            HashSet<MobileNode> candidateDstNodes = new HashSet<MobileNode>();
                            List<MobileNode> allAllowNodes = new List<MobileNode>();
                            //找出[mindist-100, mindist+100]的节点
                            List<NodeDist> tmpDists = new List<NodeDist>();
                            foreach (MobileNode node1 in global.readers)
                            {
                                double dist = Utility.Distance((MobileNode)node, (MobileNode)node1);
                                if (dist > mindist && dist < mindist + 100 && node.Id != node1.Id)
                                {
                                    candidateDstNodes.Add(node1);
                                    tmpDists.Add(new NodeDist(node1, dist, ((HFReader)node1).IsAllowedTags(pkg.Tags)));
                                }
                            }
                            if (candidateDstNodes.Count == 0)
                            {
                                Console.WriteLine("[WARNING] reader{0} has no far enough nodes, retry", this);
                                node = global.readers[(int)Utility.U_Rand(global.readerNum)];
                                pkg.Src = node.Id;
                                pkg.Prev = node.Id;
                                distance = Utility.Distance((MobileNode)node, (MobileNode)Node.getNode(pkg.Dst, NodeType.READER));
                                Console.WriteLine("src is changed to {0}", pkg.Src);
                                continue;
                            }
                            NodeDist[] tmpDist1 = (NodeDist[])tmpDists.ToArray();
                            Array.Sort(tmpDist1);

                            //allAllowNodes中的元素顺序为:源节点(1),候选终结点,中间节点
                            allAllowNodes.Add((MobileNode)node);
                            foreach (NodeDist d in tmpDist1)
                            {
                                allAllowNodes.Add(d.node);
                            }
                            foreach (HFReader node1 in global.readers)
                            {
                                if (!candidateDstNodes.Contains(node1) && node1.IsAllowedTags(pkg.Tags))
                                    allAllowNodes.Add(node1);
                            }
                            Dijkstra di = new Dijkstra(allAllowNodes);
                            int[] allAllowNodePathDist = di.GetAllShortedPaths(0);
                            MobileNode dstNode = null;
                            for (int candidateDstIndex = 1; candidateDstIndex < candidateDstNodes.Count + 1; candidateDstIndex++)
                            {
                                if (allAllowNodePathDist[candidateDstIndex] == Dijkstra.noPath)
                                    continue;
                                dstNode = allAllowNodes[candidateDstIndex];

                                for (int u = 0; u < allAllowNodes.Count; u++)
                                {
                                    if (di.shortestPaths[candidateDstIndex, u] == Dijkstra.noPath)
                                        break;
                                    int x = di.shortestPaths[candidateDstIndex, u];
                                    //如果不是最后一个节点,且该中间节点为其他终结点,则放弃,(取其他的节点即可)
                                    //if (x != dstNode.Id && candidateDstNodes.Contains(global.readers[x]))
                                    /*if(u>9)
                                    {
                                        Console.WriteLine();
                                        dstNode = null;
                                        break;
                                    }*/
                                    Console.Write(allAllowNodes[x] + "->");
                                }

                                if (dstNode != null)
                                {
                                    pkg.Dst = dstNode.Id;
                                    Console.WriteLine("\ndst is changed to {0}", pkg.Dst);
                                    break;
                                }
                            }
                            if (dstNode == null)
                            {
                                Console.WriteLine("No suitable nodes, retry.");
                                node = global.readers[(int)Utility.U_Rand(global.readerNum)];
                                pkg.Src = node.Id;
                                pkg.Prev = node.Id;
                                distance = Utility.Distance((MobileNode)node, (MobileNode)Node.getNode(pkg.Dst, NodeType.READER));
                                Console.WriteLine("\nsrc is changed to {0}", pkg.Src);
                            }
                            else
                                break;
                        }
                        distance = Utility.Distance((MobileNode)node, (MobileNode)Node.getNode(pkg.Dst, NodeType.READER));
                        Console.WriteLine("{0:F4} [SND_DATA] READER{1} sends data to READER{2} with tags {3}, distance: {4}", currentTime, pkg.Src, pkg.Dst, Convert.ToString(pkg.Tags, 2), distance);
                    }
                    node.SendData(pkg);
                    break;
                default:
                    base.ProcessEvent(node, e);
                    break;
            }
        }
Exemplo n.º 6
0
 public static void AddEvent(Event e)
 {
     EventManager manager = new EventManager();
     manager.AddEvent(e);
 }
Exemplo n.º 7
0
 public void AddEvent(Event e)
 {
     Global global = Global.getInstance();
     global.events.Add(e);
     global.events.Sort();
 }
Exemplo n.º 8
0
 public virtual void ProcessEvent(Node node, Event e)
 {
     switch (e.Type)
     {
         case EventType.RECV:
             node.Recv((Packet)e.Obj);
             break;
         case EventType.SND_BCN:
             ((Reader)node).SendBeacon(currentTime);
             break;
         case EventType.SND_DATA:
             Packet pkg = (Packet)e.Obj;
             if (pkg.SrcSenderSeq < 0 && node.type == NodeType.READER)//未定该数据包的id
                 ((Reader)node).InitPacketSeq(pkg);
             node.SendData(pkg);
             break;
         case EventType.CHK_NB:
             ((Reader)node).CheckNeighbors();
             break;
         case EventType.CHK_NEAR_OBJ:
             ((Reader)node).CheckNearObjects();
             break;
         case EventType.CHK_PEND_PKT:
             ((Reader)node).CheckPendingPackets();
             break;
         case EventType.QRY_LOCATION:
             ((Querier)node).SendQueryRequest((int)e.Obj);
             break;
         default:
             throw new Exception("Unknown event type: " + e.Type);
     }
 }