コード例 #1
0
ファイル: ZToolPacketParser.cs プロジェクト: lulzzz/ZigbeeNet
        /**
         * Run method executed by the parser thread.
         */
        public void Run()
        {
            _logger.Trace("ZToolPacketParser parserThread started");
            while (!_cancellationToken.IsCancellationRequested)
            {
                try
                {
                    byte?val = _port.Read();
                    if (val == ZToolPacket.START_BYTE)
                    {
                        // inputStream.mark(256);
                        ZToolPacketStream packetStream = new ZToolPacketStream(_port);
                        ZToolPacket       response     = packetStream.ParsePacket();

                        _logger.Trace("Response is {Type} -> {Response}", response.GetType().Name, response);
                        if (response.Error)
                        {
                            _logger.Debug("Received a BAD PACKET {Response}", response.ToString());
                            // inputStream.reset();
                            continue;
                        }

                        _packetHandler.HandlePacket(response);
                    }
                    else if (val != null)
                    {
                        // Log if not end of stream.
                        _logger.Debug("Discarded stream: expected start byte but received {Value}", val);
                    }
                }
                catch (IOException e)
                {
                    if (!_cancellationToken.IsCancellationRequested)
                    {
                        _packetHandler.Error(e);
                        _cancellationToken.Cancel();
                    }
                }
            }
            _logger.Debug("ZToolPacketParser parserThread exited.");
        }
コード例 #2
0
ファイル: ZToolPacketStream.cs プロジェクト: lulzzz/ZigbeeNet
        public ZToolPacket ParsePacket()
        {
            Exception exception;

            Done      = false;
            BytesRead = 0;
            try
            {
                ZToolPacket response;
                // int byteLength = this.read("Length");
                _length = Read("Length");
                // log.debug("data length is " + ByteUtils.formatByte(length.getLength()));
                byte[]     frameData;
                byte       apiIdMSB = Read("API PROFILE_ID_HOME_AUTOMATION MSB");
                byte       apiIdLSB = Read("API PROFILE_ID_HOME_AUTOMATION LSB");
                DoubleByte apiId    = new DoubleByte(apiIdMSB, apiIdLSB);
                // TODO Remove generic never used
                // generic = true;
                if (generic)
                {
                    // log.info("Parsing data as generic");
                    int i = 0;
                    frameData = new byte[_length];
                    // Read all data bytes without parsing
                    while (i < frameData.Length)
                    {
                        frameData[i] = Read("Data " + i + "-th");
                        i++;
                    }

                    response = new ZToolPacket(apiId, frameData);
                }
                else
                {
                    frameData = ReadRemainingBytes();
                    response  = ParsePayload(apiId, frameData);
                }
                // response.setFCS(this.read("Checksum"));
                int fcs = Read("Checksum");
                // setDone(true);
                if (fcs != response.FCS)
                {
                    // log.debug("Checksum of packet failed: received =" + fcs + " expected = " + response.getFCS());
                    throw new ZToolParseException("Packet checksum failed");
                }
                if (!Done)
                {
                    // TODO this is not the answer!
                    throw new ZToolParseException("Packet stream is not finished yet we seem to think it is");
                }
                return(response);
            }
            catch (Exception e)
            {
                _logger.Error("Packet parsing failed due to exception.", e);
                exception = e;
            }
            ZToolPacket exceptionResponse = new ErrorPacket();

            if (exception != null)
            {
                exceptionResponse.Error    = true;
                exceptionResponse.ErrorMsg = exception.Message;
            }

            return(exceptionResponse);
        }