private async void OnSerialDeviceDiscovered(string id)
        {
            if (id.Contains("UART0"))
            {
                // LoRa device.
                _loraSerialDevice = SerialPortFactory.GetInstance().Create(SerialDeviceType.LoRa);
                await _loraSerialDevice.Create(id);

                if (false == _loraSerialDevice.IsConfigured)
                {
                    _loraSerialDevice.Configure(9600, 500, 500);
                    if (_loraSerialDevice.IsConfigured)
                    {
                        _loraSerialDevice.OnSerialDataEvent += OnLoraDataReceived;
                    }
                }
            }
            else
            {
                _bleSerialDevice = SerialPortFactory.GetInstance().Create(SerialDeviceType.BTLe);
                await _bleSerialDevice.Create(id);

                if (false == _bleSerialDevice.IsConfigured)
                {
                    _bleSerialDevice.Configure(9600, 3000, 500);
                    if (_bleSerialDevice.IsConfigured)
                    {
                        _bleSerialDevice.OnSerialDataEvent          += OnBleDataReceived;
                        _bleSerialDevice.OnSerialDeviceConnected    += OnBLEDeviceConnected;
                        _bleSerialDevice.OnSerialDeviceDisconnected += OnBLEDeviceDisconnected;
                    }
                }
            }
        }
        private void Configure()
        {
            if (_bleCommandReader.IsInitialized == false)
            {
                _bleCommandReader.MoveNext();
            }

            if (_bleCommandReader.Current != null)
            {
                if (_bleCommandReader.Current.NeedFormatting)
                {
                    if (_bleCommandReader.Current is ConnectCommand)
                    {
                        if (_bleCommandReader.Previous != null && _bleCommandReader.Previous is DiscoveryCommand)
                        {
                            connectAddrCount++;

                            if (connectAddrCount <= (_bleCommandReader.Previous as DiscoveryCommand).Addresses.Count)
                            {
                                pendingOperation = connectAddrCount != (_bleCommandReader.Previous as DiscoveryCommand).Addresses.Count;
                                _bleCommandReader.Current.FormatString = _bleCommandReader.Previous.ParsedResponses.Count > 0 ? (_bleCommandReader.Previous as DiscoveryCommand).Addresses[connectAddrCount - 1] : "";
                            }
                            else
                            {
                                _bleCommandReader.Reset();
                                connectAddrCount = 0;
                                pendingOperation = false;
                                _retries         = 0;
                                _bleCommandReader.MoveNext();
                                Configure();
                                return;
                            }
                        }
                        else
                        {
                            _bleCommandReader.Reset();
                            pendingOperation = false;
                            connectAddrCount = 0;
                            _retries         = 0;
                            _bleCommandReader.MoveNext();
                            Configure();
                            return;
                        }
                    }
                }

                _retries++;
                _bleCommandReader.Current.ClearResponses();                                                                  // We are interested in fresh responses.
                SerialPortFactory.GetInstance().Create(SerialDeviceType.BTLe).Send(_bleCommandReader.Current.CommandString); // Send the command to system.
                _timer = ThreadPoolTimer.CreateTimer(new TimerElapsedHandler(OnTimerElapsed), System.TimeSpan.FromMilliseconds(_bleCommandReader.Current.TimeOut));
            }
        }