/// <summary> /// Sends the file. /// </summary> /// <param name="requestFile">The SML file.</param> /// <param name="isManufacturerMode">if set to <c>true</c> [is manufacturer mode].</param> /// <returns> /// True if file could be written down the serial interface. /// </returns> private async Task<object> SendFile(SmlFile requestFile, bool isManufacturerMode = false) { if (requestFile == null) { throw new ArgumentNullException("requestFile"); } if (SerialPort.GetPortNames().Contains(portName) == false) { logger.Error("Port {0} is not existing.", portName); throw new ArgumentException("Port " + portName + " is not existing"); } Core.Obis.ObisId reqObis; if (requestFile[1].GetProcParameterRequest != null) { reqObis = requestFile[1].GetProcParameterRequest.TreePath.First(); logger.Warn("READ OBIS: {0}", reqObis.ToHexString()); } else if (requestFile[1].SetProcParameterRequest != null) { reqObis = requestFile[1].SetProcParameterRequest.TreePath.First(); logger.Warn("WRITE OBIS: {0}", reqObis.ToHexString()); } else { throw new InvalidOperationException(); } var sendBuff = new List<byte>(); requestFile.Serialize(sendBuff); logger.Debug("Sending SML file of size {0}.", sendBuff.Count); using (await asyncLock.LockAsync().ConfigureAwait(false)) //using (var token = new CancellationTokenSource(1000)) { // try to read response from meter try { // WriteAsync does not work with Advantech boxes //await serialPort.Write(sendBuff.ToArray(), 0, sendBuff.Count); //.WriteAsync(sendBuff.ToArray(), 0, sendBuff.Count, token.Token).ConfigureAwait(false); logger.Trace("TX: {0}", BitConverter.ToString(sendBuff.ToArray())); logger.Debug("File sent, waiting for response from meter."); var receivedFile = await ReceiveSmlFile(TimeSpan.FromSeconds(8)) .ConfigureAwait(false); // process received file var result = GetMeterResponse(requestFile, receivedFile); return result; } catch (Exception ex) { logger.ErrorException("ReceiveSmlFile failed: " + ex.StackTrace, ex); throw; } } }
/// <summary> /// Sends the file. /// </summary> /// <param name="requestFile">The SML file.</param> /// <param name="isManufacturerMode">if set to <c>true</c> [is manufacturer mode].</param> /// <returns> /// True if file could be written down the serial interface. /// </returns> private async Task<object> SendFile(SmlFile requestFile, bool isManufacturerMode = false) { if (requestFile == null) { throw new ArgumentNullException(nameof(requestFile)); } Core.Obis.ObisId reqObis; if (requestFile[1].GetProcParameterRequest != null) { reqObis = requestFile[1].GetProcParameterRequest.TreePath.First(); logger.Warn("READ OBIS: {0}", reqObis.ToHexString()); } else if (requestFile[1].SetProcParameterRequest != null) { reqObis = requestFile[1].SetProcParameterRequest.TreePath.First(); logger.Warn("WRITE OBIS: {0}", reqObis.ToHexString()); } else { throw new InvalidOperationException(); } var sendBuff = new List<byte>(); requestFile.Serialize(sendBuff); this.logger.Debug("Sending SML file of size {0}.", sendBuff.Count); using (await this.asyncLock.LockAsync()) { // try to read response from meter try { this.EnsureConnected(); // WriteAsync does not work with Advantech boxes //await this.tcpPort.GetStream().Write(sendBuff.ToArray(), 0, sendBuff.Count); //.WriteAsync(sendBuff.ToArray(), 0, sendBuff.Count, token.Token); this.logger.Trace("TX: {0}", BitConverter.ToString(sendBuff.ToArray())); this.logger.Debug("File sent, waiting for response from meter."); var receivedFile = await this.ReceiveSmlFile(TimeSpan.FromSeconds(8)); // process received file var result = this.GetMeterResponse(requestFile, receivedFile); return result; } catch (Exception ex) { this.logger.ErrorException("ReceiveSmlFile failed: " + ex.StackTrace, ex); this.tcpPort.Close(); throw; } } }