public async Task WriteParameter(BinaryParam param, bool enableManufacturerMode = false) { var obisId = new ObisId((ulong)param.ObisCode); var result = await this.baseMeterDevice.WriteRegisterAsync(obisId, param.Data).ConfigureAwait(false); if (result != ResultCode.Ok) { throw new InvalidOperationException("Write failed with code: " + result); } }
/// <summary> /// Writes the parameter. /// </summary> /// <param name="param">The param.</param> /// <param name="enableManufacturerMode">if set to <c>true</c> [enable manufacturer mode].</param> public async Task WriteParameter(BinaryParam param, bool enableManufacturerMode = false) { logger.Info( "Writing binary parameter {0} with value {1}", (ObisId)param.ObisCode, param.Data.ToReadableString()); await Retry.DoTask( async () => { var requestFile = SmlHandler.CreateSetRequestFile(portName, param); await SendRequestFile(requestFile, enableManufacturerMode).ConfigureAwait(false); if (writeOnlyParams.Contains(param.ObisCode)) { return; } var result = await ReadParameter(new BinaryParam { ObisCode = param.ObisCode }); if (result.Data != null && !param.Data.SequenceEqual(result.Data)) { throw new DataException( string.Format( "Failed to write and verify {0:X12}: written: {1}, read: {2}", param.ObisCode, param.Data.ToReadableString(), result.Data.ToReadableString())); } if (result.Data == null && param.Data != null) { throw new DataException( string.Format("Failed to write and verify {0:X12}: written: {1}", param.ObisCode, param.Data.ToReadableString())); } }); }
public async Task<BinaryParam> ReadParameter(BinaryParam param) { var obis = new ObisId((ulong) param.ObisCode); var result = await this.baseMeterDevice.ReadRegisterAsync(obis).ConfigureAwait(false); if (result == null) { throw new NullReferenceException(); } return new BinaryParam() { ObisCode = param.ObisCode, Data = result.GetAsByte() }; }
/// <summary> /// Writes the ownership number. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <param name="clientIdNumber">The ownership number.</param> public async Task WriteClientId(Guid clientId, CommunicationPort communicationPort, string clientIdNumber) { CheckConfiguration(communicationPort, clientId); // fill up with '0' if too short while (clientIdNumber.Length < 10) { clientIdNumber = string.Format("{0}{1}", "0", clientIdNumber); } // shorten from left side if too long while (clientIdNumber.Length > 10) { clientIdNumber = clientIdNumber.Remove(0, 1); } var binaryParam = new BinaryParam() { ObisCode = (long) ObisId.EdlDzgClientId, Data = Encoding.UTF8.GetBytes(clientIdNumber) }; await ClientComListDict[communicationPort.ComPortName].ComThread.WriteParameter(binaryParam); }
/// <summary> /// Reads the parameter. /// </summary> /// <param name="param">The param.</param> /// <returns></returns> public async Task<BinaryParam> ReadParameter(BinaryParam param) { logger.Info("Reading binary parameter."); var requestFile = SmlHandler.CreateGetRequestFile(portName, param.ObisCode); return await Retry.Do( async () => { var resVal = await SendFile(requestFile).ConfigureAwait(false); CheckAttentionResponse(param.ObisCode, resVal); var val = (byte[])resVal; if (val == null) { logger.Info("No response for reading binary parameter."); throw new NullReferenceException(); } param.Data = val; logger.Info("Responding with byte[] result: {0}.", BitConverter.ToString(param.Data)); return param; }); }
public async Task<BinaryParam> ReadManufacturerId(Guid clientId, CommunicationPort communicationPort) { var port = CheckConfiguration(communicationPort, clientId); var param = new BinaryParam() { Data = null }; param.ObisCode = VendorSpecificRegisterIds.ManufacturerId.AsLong(); param = await port.ComThread.ReadParameter(param); return param; }
/// <summary> /// Reads the ownership number. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <returns></returns> public async Task<BinaryParam> ReadClientId(Guid clientId, CommunicationPort communicationPort) { CheckConfiguration(communicationPort, clientId); var binaryParam = new BinaryParam() { ObisCode = (long) ObisId.EdlDzgClientId, Data = null }; binaryParam = await ClientComListDict[communicationPort.ComPortName].ComThread.ReadParameter(binaryParam); return binaryParam; }
/// <summary> /// Writes the server id. /// Manufacturer parameter. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <param name="serverId">The server id.</param> public async Task WriteServerId(Guid clientId, CommunicationPort communicationPort, byte[] serverId) { CheckConfiguration(communicationPort, clientId); Array.Resize(ref serverId, 10); var thread = ClientComListDict[communicationPort.ComPortName].ComThread; var binaryParam = new BinaryParam() { ObisCode = (long) ObisId.EdlDeviceId, Data = serverId }; if (communicationPort.MeterType == MeterType.Basemeter) { binaryParam.ObisCode = VendorSpecificRegisterIds.DeviceId.AsLong(); } await thread.WriteParameter(binaryParam, true); }
/// <summary> /// Reads the server id. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <returns> /// The serverId read from meter. /// </returns> public async Task<BinaryParam> ReadServerId(Guid clientId, CommunicationPort communicationPort) { CheckConfiguration(communicationPort, clientId); var thread = ClientComListDict[communicationPort.ComPortName].ComThread; var param = new BinaryParam() { ObisCode = (long) ObisId.EdlDeviceId, Data = null }; return await thread.ReadParameter(param); }
/// <summary> /// Reads the manufacturer serial no. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <returns></returns> public async Task<BinaryParam> ReadManufacturerSerialNo(Guid clientId, CommunicationPort communicationPort) { var port = CheckConfiguration(communicationPort, clientId); var binaryParam = new BinaryParam() { ObisCode = (long) ObisId.EdlDzgManufacturerSerialNo, Data = null }; if (port.MeterType == MeterType.Basemeter) { binaryParam.ObisCode = VendorSpecificRegisterIds.ManufacturerSerialNumber.AsLong(); } binaryParam = await ClientComListDict[communicationPort.ComPortName].ComThread.ReadParameter(binaryParam); return binaryParam; }
/// <summary> /// Writes the manufacturer serial number. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <param name="manufacturerSerialNumber">The manufacturer serial number.</param> public async Task WriteManufacturerSerialNumber(Guid clientId, CommunicationPort communicationPort, string manufacturerSerialNumber) { var port =CheckConfiguration(communicationPort, clientId); // fill up with '0' if too short while (manufacturerSerialNumber.Length < 10) { manufacturerSerialNumber = string.Format("{0}{1}", "0", manufacturerSerialNumber); } // shorten from left side if too long while (manufacturerSerialNumber.Length > 10) { manufacturerSerialNumber = manufacturerSerialNumber.Remove(0, 1); } var binaryParam = new BinaryParam() { ObisCode = (long) ObisId.EdlDzgManufacturerSerialNo, Data = Encoding.UTF8.GetBytes(manufacturerSerialNumber) }; if (port.MeterType == MeterType.Basemeter) { binaryParam.ObisCode = VendorSpecificRegisterIds.ManufacturerSerialNumber.AsLong(); } await ClientComListDict[communicationPort.ComPortName].ComThread.WriteParameter(binaryParam); }
public async Task WriteInitialSymKey(Guid clientId, CommunicationPort communicationPort, byte[] aesKey) { var port = CheckConfiguration(communicationPort, clientId); var param = new BinaryParam() { ObisCode = RegisterIds.SymmetricInitialKey.AsLong(), Data = aesKey }; await port.ComThread.WriteParameter(param); }
//-- END public async Task<BinaryParam> ReadInitialSymKey(Guid clientId, CommunicationPort communicationPort) { var port = CheckConfiguration(communicationPort, clientId); var param = new BinaryParam { Data = null, ObisCode = RegisterIds.SymmetricInitialKey.AsLong() }; param = await port.ComThread.ReadParameter(param); return param; }
public async Task WriteManufacturerId(Guid clientId, CommunicationPort communicationPort, string manufacturerId) { var port = CheckConfiguration(communicationPort, clientId); var param = new BinaryParam() { ObisCode = VendorSpecificRegisterIds.ManufacturerId.AsLong(), Data = Encoding.ASCII.GetBytes(manufacturerId) }; await port.ComThread.WriteParameter(param); }
/// <summary> /// Creates the set request file. /// </summary> /// <param name="portId">The port id.</param> /// <param name="param">The param.</param> /// <returns></returns> public static SmlFile CreateSetRequestFile(string portId, BinaryParam param) { var handler = new SmlHandler(portId); var smlFile = new SmlFile(); handler.AddOpenRequest(smlFile); handler.AddSetBinaryParamRequest(smlFile, param); handler.AddCloseRequest(smlFile); return smlFile; }
/// <summary> /// Reads the public key. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <returns></returns> public async Task<BinaryParam> ReadPublicKey(Guid clientId, CommunicationPort communicationPort) { CheckConfiguration(communicationPort, clientId); var thread = ClientComListDict[communicationPort.ComPortName].ComThread; var param = new BinaryParam() { ObisCode = (long) ObisId.EdlPublicKey, Data = null }; if (communicationPort.MeterType == MeterType.Basemeter) { param.ObisCode = RegisterIds.PublicKeySignature.AsLong(); } return await thread.ReadParameter(param); }
/// <summary> /// Adds the set binary param request. /// </summary> /// <param name="reqFile">The request SML file.</param> /// <param name="param">The byte array parameter.</param> private void AddSetBinaryParamRequest(SmlFile reqFile, BinaryParam param) { var msg = new Core.Sml.Messages.Message() { TransactionId = new[] { (byte)(reqFile.Count + 1) }, GroupNo = 0x00, SetProcParameterRequest = new Core.Sml.Messages.SetProcParameterRequest() { TreePath = new List<Core.Obis.ObisId>() { new Core.Obis.ObisId((ulong)param.ObisCode) }, Tree = new Tree(new Core.Obis.ObisId((ulong)param.ObisCode), param.Data) } }; //var obisId = (ObisId)param.ObisCode; //var paramTreePath = new SmlTreePath(obisId); //var tree = new SmlTree { ParameterName = new SmlOctetstring(ObisUtil.GetBytes(obisId)) }; //if (param.Data == null) //{ // throw new ArgumentNullException("param"); //} //tree.ParameterValue = new SmlProcParValue(new SmlOctetstring(param.Data)); //var msg = SmlMessageFactory.SetProcParamReq(paramTreePath, tree); //var transactionId = new byte[] { (byte)(reqFile.Count + 1) }; //msg.TransactionId = new SmlOctetstring(transactionId); //msg.GroupNo = 0x00; reqFile.Add(msg); }
/// <summary> /// Writes the pin. /// </summary> /// <param name="clientId">The client id.</param> /// <param name="communicationPort">The communication port.</param> /// <param name="pin">The pin.</param> public async Task WritePin(Guid clientId, CommunicationPort communicationPort, string pin) { CheckConfiguration(communicationPort, clientId); var textParam = new BinaryParam() { ObisCode = (long) ObisId.EdlPinCode, Data = Encoding.UTF8.GetBytes(pin) }; switch (communicationPort.MeterType) { case MeterType.Edl: textParam.ObisCode = (long)ObisId.EdlPinCode; break; case MeterType.Sym2: throw new NotImplementedException(); case MeterType.Basemeter: textParam.ObisCode = RegisterIds.PinCode.AsLong(); break; default: throw new ArgumentOutOfRangeException(); } await ClientComListDict[communicationPort.ComPortName].ComThread.WriteParameter(textParam); }