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);
        }
Exemplo n.º 15
0
        /// <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);
        }
Exemplo n.º 17
0
        /// <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);
        }