public async Task StartAsync(Meter meter, DataSet dataSet, MeterSessionTypeCode sessionType)
        {
            MeterSessionSetting meterSessionSetting = (sessionType == MeterSessionTypeCode.Insitu)
                ? insituMeterSessionSettingRepository.FindOne(new Noanet.XamArch.Domain.EntityPropertyInfo(nameof(RemoteMeterSessionSetting.Name), "Default"))
                : (MeterSessionSetting)remoteMeterSessionSettingRepository.FindOne(new Noanet.XamArch.Domain.EntityPropertyInfo(nameof(InsituMeterSessionSetting.Name), "Default"));

            await StartAsync(meter, dataSet, meterSessionSetting);
        }
        public async Task StartAsync(Meter meter, DataSet dataSet, MeterSessionSetting sessionSetting)
        {
            CurrentMeterSession = new MeterSession(meter, dataSet)
            {
                Guid           = Guid.NewGuid(),
                SessionSetting = sessionSetting ?? throw new ArgumentNullException(nameof(sessionSetting)),
                                       StartDate = DateTime.UtcNow
            };

            sessionTracer.Clear();

            if (sessionSetting.CommunicationChannelSetting != null)
            {
                if ((sessionSetting.CommunicationChannelSetting.BaudRate != BaudRate.BaudRate_9600) ||
                    (sessionSetting.CommunicationChannelSetting.NumberOfPackets != ((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultNumberOfPackets : RemoteSession.DefaultNumberOfPackets)) ||
                    (sessionSetting.CommunicationChannelSetting.PacketSize != (PacketSize)((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultPacketSize : RemoteSession.DefaultPacketSize)))
                {
                    negotiationSetting = new NegotiationSetting()
                    {
                        BaudRate         = (BaudRateValue)sessionSetting.CommunicationChannelSetting.BaudRate,
                        BaudRateSelector = BaudRateSelector.OneBaudRateRequested,
                        NumberOfPackets  = sessionSetting.CommunicationChannelSetting.NumberOfPackets,
                        PacketSize       = (short)sessionSetting.CommunicationChannelSetting.PacketSize
                    };
                }

                if ((sessionSetting.CommunicationChannelSetting.ChannelTrafficTimeout != ((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultChannelTrafficTimeout : RemoteSession.DefaultChannelTrafficTimeout)) ||
                    (sessionSetting.CommunicationChannelSetting.InterCharacterTimeout != ((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultInterCharacterTimeout : RemoteSession.DefaultInterCharacterTimeout)) ||
                    (sessionSetting.CommunicationChannelSetting.ResponseTimeout != ((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultResponseTimeout : RemoteSession.DefaultResponseTimeout)) ||
                    (sessionSetting.CommunicationChannelSetting.NumberOfRetries != ((sessionSetting is InsituMeterSessionSetting) ? InsituSession.DefaultRetryAttempts : RemoteSession.DefaultRetryAttempts)))
                {
                    timingSetting = new TimingSetting()
                    {
                        ChannelTrafficTimeout = sessionSetting.CommunicationChannelSetting.ChannelTrafficTimeout,
                        InterCharacterTimeout = sessionSetting.CommunicationChannelSetting.InterCharacterTimeout,
                        ResponseTimeout       = sessionSetting.CommunicationChannelSetting.ResponseTimeout,
                        NumberOfRetries       = sessionSetting.CommunicationChannelSetting.NumberOfRetries
                    };
                }

                reconnectionCountdownTimer = (sessionSetting.ReconnectionSchema != null) ? new Timer(OnReconnectionCountDown, null, -1, -1) : null;
                totalBytesReceived         = 0; totalBytesSent = 0;
            }

            ansiProtocolSession = CreateProtocolSession();
            await ansiProtocolSession.StartAsync();
        }