Beispiel #1
0
        private void RaiseUserquakeEvent(Packet packet)
        {
            if (packet.Code != Code.USERQUAKE)
            {
                return;
            }

            if (packet.Data == null || packet.Data.Length < 6)
            {
                return;
            }

            string[] data = packet.Data[5].Split(',');
            if (data.Length < 2)
            {
                return;
            }

            EPSPUserquakeEventArgs e = new EPSPUserquakeEventArgs()
            {
                ReceivedAt = ProtocolTime()
            };

            Verifier.VerifyResult result = Verifier.VerifyUserquake(packet.Data[5], packet.Data[1], packet.Data[0], packet.Data[2], packet.Data[3], packet.Data[4], ProtocolTime());
            e.IsExpired          = result.isExpired;
            e.IsInvalidSignature = !result.isValidSignature;

            e.PublicKey = packet.Data[2];
            e.AreaCode  = data[1];
            OnUserquake(this, e);
        }
Beispiel #2
0
        private void RaiseEEWTestEvent(Packet packet)
        {
            if (packet.Code != Code.AREAPEERS)
            {
                return;
            }

            if (packet.Data == null || packet.Data.Length < 3)
            {
                return;
            }

            string[] datas     = packet.Data[2].Split(';');
            bool     isEEW     = datas.Any(item => item == "950,0");
            bool     isEEWTest = datas.Any(item => item == "951,0");

            if (!isEEW && !isEEWTest)
            {
                return;
            }

            EPSPEEWTestEventArgs e = new EPSPEEWTestEventArgs()
            {
                ReceivedAt = ProtocolTime()
            };

            Verifier.VerifyResult result = Verifier.VerifyServerData(packet.Data[2], packet.Data[1], packet.Data[0], ProtocolTime());
            e.IsExpired          = result.isExpired;
            e.IsInvalidSignature = !result.isValidSignature;
            e.IsTest             = isEEWTest;

            OnEEWTest(this, e);
        }
Beispiel #3
0
        private void RaiseAreapeersEvent(Packet packet)
        {
            if (packet.Code != Code.AREAPEERS)
            {
                return;
            }

            if (packet.Data == null || packet.Data.Length < 3)
            {
                return;
            }

            string[] datas       = packet.Data[2].Split(';');
            var      dataPattern = new Regex("^[^,]*,\\d+$");

            if (!datas.All(data => dataPattern.IsMatch(data)))
            {
                return;
            }

            EPSPAreapeersEventArgs e = new EPSPAreapeersEventArgs()
            {
                ReceivedAt = ProtocolTime()
            };

            Verifier.VerifyResult result = Verifier.VerifyServerData(packet.Data[2], packet.Data[1], packet.Data[0], ProtocolTime());
            e.IsExpired          = result.isExpired;
            e.IsInvalidSignature = !result.isValidSignature;

            e.AreaPeerDictionary = datas.ToDictionary(data => data.Split(',')[0], data => int.Parse(data.Split(',')[1]));
            OnAreapeers(this, e);
        }
        public void SendUserquake_Valid()
        {
            Packet packet = null;

            peerContextMock.Setup(x => x.SendAll(It.IsAny <Packet>())).Callback <Packet>((e) =>
            {
                packet = e;
            });

            Assert.IsTrue(mediatorContext.SendUserquake());

            Assert.IsNotNull(packet);

            Verifier.VerifyResult result = Verifier.VerifyUserquake(packet.Data[5], packet.Data[1], packet.Data[0], packet.Data[2], packet.Data[3], packet.Data[4], mediatorContext.CalcNowProtocolTime());
            Assert.IsFalse(result.isExpired);
            Assert.IsTrue(result.isValidSignature);
            Assert.AreEqual("901", packet.Data[5].Split(',')[1]);
        }
Beispiel #5
0
        private void RaiseTsunamiEvent(Packet packet)
        {
            if (packet.Code != Code.TSUNAMI)
            {
                return;
            }

            if (packet.Data == null || packet.Data.Length < 3)
            {
                return;
            }

            string[]             datas = packet.Data[2].Split(',');
            EPSPTsunamiEventArgs e     = new EPSPTsunamiEventArgs()
            {
                ReceivedAt = ProtocolTime()
            };

            Verifier.VerifyResult result = Verifier.VerifyServerData(packet.Data[2], packet.Data[1], packet.Data[0], ProtocolTime());
            e.IsExpired          = result.isExpired;
            e.IsInvalidSignature = !result.isValidSignature;

            if (datas[0] == "解除")
            {
                e.IsCancelled = true;
                OnTsunami(this, e);
                return;
            }

            e.RegionList = new List <TsunamiForecastRegion>();
            TsunamiCategory category = TsunamiCategory.Unknown;

            foreach (string data in datas)
            {
                if (data.Length <= 0)
                {
                    continue;
                }

                if (data[0] == '-')
                {
                    if (data.EndsWith("津波注意報"))
                    {
                        category = TsunamiCategory.Advisory;
                    }
                    if (data.EndsWith("津波警報"))
                    {
                        category = TsunamiCategory.Warning;
                    }
                    if (data.EndsWith("大津波警報"))
                    {
                        category = TsunamiCategory.MajorWarning;
                    }
                    continue;
                }

                if (data[0] != '*' && data[0] != '+')
                {
                    continue;
                }

                TsunamiForecastRegion item = new TsunamiForecastRegion();
                item.Category = category;
                item.Region   = data.Substring(1);
                if (data[0] == '*')
                {
                    item.IsImmediately = true;
                }

                e.RegionList.Add(item);
            }

            OnTsunami(this, e);
        }
Beispiel #6
0
        private void RaiseEarthquakeEvent(Packet packet)
        {
            if (packet.Code != Code.EARTHQUAKE)
            {
                return;
            }

            if (packet.Data == null || packet.Data.Length < 4)
            {
                return;
            }

            EPSPQuakeEventArgs e = new EPSPQuakeEventArgs()
            {
                ReceivedAt = ProtocolTime()
            };

            Verifier.VerifyResult result = Verifier.VerifyServerData(packet.Data[2] + packet.Data[3], packet.Data[1], packet.Data[0], ProtocolTime());
            e.IsExpired          = result.isExpired;
            e.IsInvalidSignature = !result.isValidSignature;

            // 地震概要の解析
            string[] abstracts = packet.Data[2].Split(',');
            if (abstracts.Length != 11)
            {
                return;
            }

            e.OccuredTime     = abstracts[0];
            e.Scale           = abstracts[1];
            e.TsunamiType     = (DomesticTsunamiType)int.Parse(abstracts[2]);
            e.InformationType = (QuakeInformationType)int.Parse(abstracts[3]);
            e.Destination     = abstracts[4];
            e.Depth           = abstracts[5];
            e.Magnitude       = abstracts[6];
            e.IsCorrection    = abstracts[7] == "1";
            e.Latitude        = abstracts[8];
            e.Longitude       = abstracts[9];
            e.IssueFrom       = abstracts[10];

            // 震度観測点の解析
            e.PointList = new List <QuakeObservationPoint>();
            string[] details    = packet.Data[3].Split(',');
            string   prefecture = null;
            string   scale      = null;

            foreach (string detail in details)
            {
                if (detail.Length <= 0)
                {
                    continue;
                }

                if (detail[0] == '-')
                {
                    prefecture = detail.Substring(1);
                    continue;
                }
                if (detail[0] == '+')
                {
                    scale = detail.Substring(1);
                    continue;
                }
                if (detail[0] != '*')
                {
                    continue;
                }

                QuakeObservationPoint point = new QuakeObservationPoint();
                point.Prefecture = prefecture;
                point.Scale      = scale;
                point.Name       = detail.Substring(1);

                e.PointList.Add(point);
            }

            OnEarthquake(this, e);
        }