Beispiel #1
0
        /// <summary>
        /// создание пакета в виде массива байт
        /// </summary>
        /// <returns></returns>
        private byte[] PackageMessage(BedMessageEventType eventType, byte registerAddress, byte[] messageData)
        {
            var message = new byte[10];

            message[0] = (byte)_startMessageMarker;
            message[1] = _idDevice;
            message[2] = (byte)eventType;
            message[3] = _messageLength;
            message[5] = registerAddress;
            message[6] = messageData[0];
            message[7] = messageData[1];
            var messageForCRC = new byte[message.Length - 2];

            for (var i = 0; i < messageForCRC.Length; i++)
            {
                messageForCRC[i] = message[i];
            }
            var crc = BitConverter.GetBytes(BedMessageCRC16.GetCRC16(messageForCRC));

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(crc);
            }
            message[8] = crc[0];
            message[9] = crc[1];
            return(message);
        }
Beispiel #2
0
        /// <summary>
        /// обработать полученное сообщение и извлечь из него данные
        /// </summary>
        /// <param name="inputMessage"></param>
        private void UnPackageMessage(byte[] inputMessage)
        {
            if (inputMessage == null || inputMessage.Length <= 4)
            {
                throw new IndexOutOfRangeException("Пакет пуст или поврежден");
            }

            if ((char)inputMessage[0] != '$')
            {
                throw new ArgumentException("Формат пакета неверен - не найден маркер начала пакета");
            }

            _idDevice      = inputMessage[1];
            _eventType     = (BedMessageEventType)inputMessage[2];
            _messageLength = inputMessage[3];
            if (_messageLength == 0)
            {
                throw new ArgumentException("В пакете нет данных");
            }

            //ответный пакет это заголовок(1 байт) + ID (1) + тип (1) + размер данных в словах(1)
            //затем данные и 2 байта CRC16
            if (inputMessage.Length != 4 + _messageLength * 2 + 2)
            {
                throw new ArgumentException("Неверный размер пакета");
            }

            var messageForCRC = new byte[inputMessage.Length - 2]; //CRC считаем для пакета кроме самой суммы

            for (var i = 0; i < messageForCRC.Length; i++)
            {
                messageForCRC[i] = inputMessage[i];
            }
            var crcCalc = BedMessageCRC16.GetCRC16(messageForCRC);
            var crcReal =
                (ushort)(inputMessage[inputMessage.Length - 2] * 256 + inputMessage[inputMessage.Length - 1]);

            if (crcReal != crcCalc)
            {
                throw new ArgumentException("Неверная контрольная сумма");
            }

            _messageData = new byte[_messageLength * 2];

            if (inputMessage.Length < _messageData.Length + 4)
            {
                throw new ArgumentException("Неверный размер пакета");
            }

            for (var i = 0; i < _messageData.Length; i++)
            {
                _messageData[i] = inputMessage[i + 4];
            }
        }