예제 #1
0
        public void RequestManufacturerTest()
        {
            var status = new ModemStatus
            {
                IsSuccess     = false,
                State         = "Not initialized",
                Manufacturer  = "None",
                ModelName     = string.Empty,
                SerialNumber  = "SN xyz",
                SignalQuality = new SignalQuality {
                    dBmW = 0, Percent = "0.0", IsValid = false
                },
                Imsi         = string.Empty,
                Imei         = string.Empty,
                OperatorName = string.Empty
            };
            var request = new ModemRequestContext
            {
                Response   = status,
                Connection = _configuration
            };
            var handler = new RequestManufaturerHandler();
            var result  = handler.Handle(request, "AT+GMI");

            result.Should().NotBeNull();
            result.Response.Manufacturer.Should().NotBeEmpty();
            result.Response.IsSuccess.Should().BeTrue();
        }
예제 #2
0
        public void GetModemStatusTest()
        {
            var configuration = new ConnectConfiguration
            {
                ConnectionType = ConnectionType.Usb,
                BaudRate       = int.Parse(ConfigurationManager.AppSettings["baudrate"]),
                PortName       = ConfigurationManager.AppSettings["port"]
            };

            var status = new ModemStatus
            {
                IsSuccess     = false,
                State         = "Not initialized",
                Manufacturer  = "None",
                ModelName     = string.Empty,
                SerialNumber  = "SN xyz",
                SignalQuality = new SignalQuality {
                    dBmW = 0, Percent = "0.0", IsValid = false
                },
                Imsi         = string.Empty,
                Imei         = string.Empty,
                OperatorName = string.Empty
            };

            var request = new ModemRequestContext
            {
                Response   = status,
                Connection = configuration
            };

            var commands = new Dictionary <string, AbstractModemCommandHandler>
            {
                { "AT", new RequestEchoHandler() },
                { "AT+GMI", new RequestManufaturerHandler() },
                { "AT+GMM", new RequestModelHandler() },
                { "AT+CGMR", new RequestRevisionIdentificationHandler() }
            };
            var results = new Dictionary <string, ModemRequestContext>();

            foreach (var command in commands)
            {
                var commandString = command.Key;
                var commandClass  = command.Value;
                var commandResult = commandClass.Handle(request, commandString);
                results.Add(commandString, commandResult);
            }
        }
예제 #3
0
        /// <summary>
        /// </summary>
        /// <param name="request"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public override ModemRequestContext Handle(ModemRequestContext request, string param)
        {
            var signalQuality = new SignalQuality
            {
                dBmW    = 0,
                IsValid = false,
                Percent = string.Empty
            };

            if (param == Command)
            {
                var result   = request.Response;
                var helper   = ModemManager.Instance;
                var received = false;
                helper.OnSerialPortOpened += (sender, response) =>
                {
                    if (!response)
                    {
                        return;
                    }
                    try
                    {
                        received = true;
                        helper.SendString(param);
                    }
                    catch (Exception exception)
                    {
                        Debug.WriteLine(exception.Message);
                        request.Response.IsSuccess = false;
                        //request.Description.Add($"Error send {Command} - {exception.Message}");
                        received = false;
#if DEBUG
                        throw;
#endif
                    }
                };
                helper.OnStatusChanged += (sender, response) => { Debug.WriteLine(response); };
                helper.OnDataReceived  += (sender, response) =>
                {
                    if (string.IsNullOrEmpty(response))
                    {
                        result.SignalQuality = signalQuality;
                    }
                    else
                    {
                        try
                        {
                            var matches = Regex.Matches(response, @"[\S ]+", RegexOptions.Singleline);
                            if (matches.Count >= 2 && "OK".Equals(matches[matches.Count - 1].Value,
                                                                  StringComparison.OrdinalIgnoreCase))
                            {
                                matches = Regex.Matches(matches[matches.Count - 2].Value, @"\d+", RegexOptions.None);
                                if (matches.Count > 0)
                                {
                                    var r = int.Parse(matches[0].Value);
                                    if (r > 32)
                                    {
                                        signalQuality.dBmW           = 0;
                                        result.SignalQuality.Percent = "0.0";
                                        result.SignalQuality.IsValid = false;
                                    }

                                    if (r == 99)
                                    {
                                        result.SignalQuality = signalQuality;
                                    }

                                    else
                                    {
                                        result.SignalQuality.dBmW    = -113 + (r << 1);
                                        result.SignalQuality.Percent = (r * 100.0 / 31.0).ToString("F2");
                                        result.SignalQuality.IsValid = true;
                                        result.IsSuccess             = true;
                                    }
                                }
                            }
                        }
                        finally
                        {
                            received = false;
                            (sender as ModemManager)?.Close();
                        }
                    }
                };
                if (!helper.IsOpen)
                {
                    helper.Open(request.Connection.PortName);
                }
                else
                {
                    helper.Close();
                    helper.Open(request.Connection.PortName);
                }
                lock (_locker)
                {
                    while (received)
                    {
                        Monitor.Wait(_locker, TimeSpan.FromMilliseconds(Sleep));
                    }
                }

                return(request);
            }
            return(base.Handle(request, param));
        }